Estaba escribiendo código con tkinter, y todo el código estaba en un solo archivo, pero logré dividirlo en varios archivos. Hay dos archivos main.py y MyFirstpanel.py. cuando hago clic en el botón, se ejecuta el archivo MyFirstPanel.py. cuando hago clic en el botón, vuelve a main.py. pero de nuevo quiero ir al archivo MyFirstPanel.py, me da un error.

Error

myFirstPanel = MyFirstPanel(self.root)
NameError: name 'MyFirstPanel' is not defined
Exception in Tkinter callback

Mi código se ve así

main.py

from tkinter import *
from MyFirstPanel import *


class MyTkWindow:
    def __init__(self, root):
        self.root = root  # Makes the window
        self.mainFrame = Frame(self.root, width=500, height=500)
        self.mainFrame.grid(row=0, column=0, padx=10, pady=2)

        self.user_login_btn = Button(self.mainFrame, text='Go To First Frame', relief='solid', font=('times new roman', 11),
                                     height=1, width=6, command=self.gotofirstpanel)
        self.user_login_btn.grid(row=2, column=0, columnspan=30, sticky=(N, S, E, W))


    def gotofirstpanel(self):
        self.mainFrame.destroy()
        myFirstPanel = MyFirstPanel(self.root)
        myFirstPanel.start()

    def start(self):
        self.root.mainloop()


if __name__ == '__main__':
    root = Tk()
    myWindow = MyTkWindow(root)
    myWindow.start()

MyFirstPanel.py

from tkinter import *
from main import *

class MyFirstPanel:
    def __init__(self, root):
        self.root = root
        self.mainFrame = Frame(self.root, width=500, height=500)
        self.mainFrame.grid(row=0, column=0, padx=10, pady=2)
        self.user_login_btn = Button(self.mainFrame, text='First Panels', relief='solid', font=('times new roman', 15),
                                     height=1, width=6, command=self.gotomainpanel)
        self.user_login_btn.grid(row=2, column=0, columnspan=10, sticky=(N, S, E, W))

    def gotomainpanel(self):
        self.mainFrame.destroy()
        myTkWindow = MyTkWindow(self.root)
        myTkWindow.start()
        self.root.destroy()


    def start(self):
        self.root.mainloop()

0
Habib Ur Rehman 4 mar. 2021 a las 10:25

1 respuesta

La mejor respuesta

¡Prueba esto!

main.py

from tkinter import *
import MyFirstPanel


class MyTkWindow:
    def __init__(self, root):
        self.root = root  # Makes the window
        self.mainFrame = Frame(self.root, width=500, height=500)
        self.mainFrame.grid(row=0, column=0, padx=10, pady=2)

        self.user_login_btn = Button(self.mainFrame, text='Go To First Frame',     relief='solid', font=('times new roman', 11),
                                     height=1, width=6, command=self.gotofirstpanel)
        self.user_login_btn.grid(row=2, column=0, columnspan=30, sticky=(N, S, E, W))


    def gotofirstpanel(self):
        self.mainFrame.destroy()
        myFirstPanel = MyFirstPanel.MyFirstPanel(self.root)
        myFirstPanel.start()

    def start(self):
        self.root.mainloop()


if __name__ == '__main__':
    root = Tk()
    myWindow = MyTkWindow(root)
    myWindow.start()

Aquí cambié from MyFirstPanel import * a import MyFirstPanel y MyFirstPanel(self.root) a MyFirstPanel.MyFirstPanel(self.root)

Esto funcionará

1
Lucifer Morningstar 4 mar. 2021 a las 08:02