如何建立传统知识的工作的两个实例有一个主循环?(How does creating two inst

2019-09-28 06:07发布

如何将master = Tk()__init__ tkinter.Frame的子类的
产生两个窗口( appapp2 )当只有app.mainloop()被调用?

from tkinter import Frame,Button,Tk

class Application(Frame):

    def say_hi(self):
        print('Hello world?!')

    def close(self):
        self.master.destroy()

    def createWidgets(self):
        self.quit_b = Button(self, width=12, text='Quit', bg='tan',
                    command=self.close)
        self.quit_b.grid(row=0, column=0, padx=8, pady=8)

        self.hello_b = Button(self, width=12, text='Hello',
                    command=self.say_hi)
        self.hello_b.grid(row=0, column=1, padx=8, pady=8)

    def __init__(self):
        master = Tk() # <------------------------ ! see here !
        Frame.__init__(self, master)
        self.grid()
        self.createWidgets()


app = Application()
app.master.title('Hello world!')

app2 = Application()
app2.master.title('Hello world! 2')

app.mainloop()

Answer 1:

不能创建该类的两个实例Tk ,这是有点不寻常的内实例化它__init__另一个类的。 您的代码应该工作,但我从来没有见过它这样做的方式。

您需要创建的实例Tk创建任何其他部件前。 由于您的主要应用是的一个子Frame ,你部分创建一个实例Frame初始化Tkinter的是根本不应该做的方式之前。 也许工作,但行为是不确定的。

相反,它通常是更好地创建应用程序传统知识的一个子类:

from Tkinter import tk
class Application(tk.Tk):
    ...

app = Application(...)
app.mainloop()

或者,创建实例Tk在全球范围内,并作为参数传递到其他部件:

from Tkinter import tk
class Application(tkFrame):
    ...
root = tk.Tk()
myframe = Application(root)
root.mainloop()

如果你需要一个以上的窗口,创建与其他窗口Toplevel类。



文章来源: How does creating two instances of Tk work with one mainloop?