如何导入另一个tkinter python类代码以打开新的tkinter窗口?

如何导入另一个tkinter python类代码以打开新的tkinter窗口?,python,tkinter,Python,Tkinter,我有两个tkinterclass1.py和class2.py。我面临的问题是,当我在class1.py中导入class2.py时,它首先执行class2.py,然后只执行class1.py ###1.py类 import tkinter as tk import class2 from class2 import root2 class MyApp1(object): def __init__(self, parent): self.root1 = parent

我有两个tkinterclass1.pyclass2.py。我面临的问题是,当我在class1.py中导入class2.py时,它首先执行class2.py,然后只执行class1.py

###1.py类

import tkinter as tk 
import class2
from class2 import root2
class MyApp1(object): 

    def __init__(self, parent): 

        self.root1 = parent 

        self.root1.title("Main frame") 
 
        self.frame = tk.Frame(parent) 

        self.frame.pack() 

        btn = tk.Button(self.frame, text="Open Frame", command=) 

        btn.pack()

    def call(self):
        self.root1.withdraw()
        x = class2.MyApp2(root2)                                                              

root1 = tk.Tk()

root1.geometry("800x600")
                                                  
app = MyApp1(root1)
                                             
root1.mainloop()
import tkinter as tk 

class MyApp2(object): 

    def __init__(self, parent): 

        self.root2 = parent 

        self.root2.title("Main frame") 
 
        self.frame = tk.Frame(parent) 

        self.frame.pack() 

        btn = tk.Button(self.frame, text="Open Frame", command=self.openFrame) 

        btn.pack()  
                                                         
    def openFrame(self):
        pass

root2 = tk.Tk()

root2.geometry("800x600")
                                                  
#app = MyApp2(root2)
                                             
root2.mainloop()
###class2.py

import tkinter as tk 
import class2
from class2 import root2
class MyApp1(object): 

    def __init__(self, parent): 

        self.root1 = parent 

        self.root1.title("Main frame") 
 
        self.frame = tk.Frame(parent) 

        self.frame.pack() 

        btn = tk.Button(self.frame, text="Open Frame", command=) 

        btn.pack()

    def call(self):
        self.root1.withdraw()
        x = class2.MyApp2(root2)                                                              

root1 = tk.Tk()

root1.geometry("800x600")
                                                  
app = MyApp1(root1)
                                             
root1.mainloop()
import tkinter as tk 

class MyApp2(object): 

    def __init__(self, parent): 

        self.root2 = parent 

        self.root2.title("Main frame") 
 
        self.frame = tk.Frame(parent) 

        self.frame.pack() 

        btn = tk.Button(self.frame, text="Open Frame", command=self.openFrame) 

        btn.pack()  
                                                         
    def openFrame(self):
        pass

root2 = tk.Tk()

root2.geometry("800x600")
                                                  
#app = MyApp2(root2)
                                             
root2.mainloop()

现在我如何从class1.py导入class2.py,结果变成class1 tkinter窗口,然后只导入class2 tkinter窗口?

您不应该这样导入代码。使代码可导入的正确方法是确保它只有函数和类定义。然后,执行导入的代码负责调用函数和实例化类

class2.py应该如下所示:

import tkinter as tk 

class MyApp2(object): 
    def __init__(self, parent): 
        self.root2 = parent 
        self.root2.title("Main frame") 
        self.frame = tk.Frame(parent) 
        self.frame.pack() 
        btn = tk.Button(self.frame, text="Open Frame", command=self.openFrame) 
        btn.pack()  
                                                         
    def openFrame(self):
        pass
def call(self):
    self.root1.withdraw()
    new_window = tk.Toplevel()
    class2.MyApp2(new_window)                                                              
class1.py现在可以安全地导入此文件。然后它可以创建
MyApp2
的实例,如下所示:

import tkinter as tk 

class MyApp2(object): 
    def __init__(self, parent): 
        self.root2 = parent 
        self.root2.title("Main frame") 
        self.frame = tk.Frame(parent) 
        self.frame.pack() 
        btn = tk.Button(self.frame, text="Open Frame", command=self.openFrame) 
        btn.pack()  
                                                         
    def openFrame(self):
        pass
def call(self):
    self.root1.withdraw()
    new_window = tk.Toplevel()
    class2.MyApp2(new_window)                                                              
或者,如果不再需要主窗口,可以销毁主窗口中的所有内容,然后将其重新用于新类:

def call(self):
    for child in self.root1.winfo_children():
        child.destroy()
    class2.MyApp2(self.root1)

您只需将从
root2=tk.tk()
到末尾的行放入一个函数中,例如
show()
,然后您就可以在
MyApp1.call()
函数中调用
class2.show()
。也可以编写tk.Toplevel()而不是tk。Tk(),我们要在其中导入tkinter窗口。我使用此技术解决此问题。