Как создание двух экземпляров Tk работает с одним mainloop? - PullRequest
1 голос
/ 09 марта 2012

Как при добавлении master = Tk() в __init__ подкласса tkinter.Frame
создаются два окна (app и app2), когда вызывается только 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()

1 Ответ

2 голосов
/ 10 марта 2012

Вы не можете создать два экземпляра класса Tk, и несколько необычно создавать его экземпляр в __init__ другого класса. Ваш код должен работать, но я никогда не видел, чтобы это делалось таким образом.

Вам необходимо создать экземпляр Tk перед созданием любых других виджетов. Поскольку ваше основное приложение является подклассом Frame, вы частично создаете экземпляр Frame перед инициализацией Tkinter, что просто не так, как должно быть. Это может работать, но поведение не определено.

Вместо этого, как правило, лучше создать приложение в качестве подкласса Tk:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...