Почему первое окно требует вызова mainloop (), а второе - нет - PullRequest
1 голос
/ 29 июня 2019

Я делаю приложение, которому нужно 2 окна.Во-первых, я делаю все стандартные вещи, такие как

root = tk.Tk()
...code...
root.mainloop()

Но для моего второго окна я звоню только

root = tk.Tk()

, и это работает.Если я сделаю

root = tk.Tk()
...code...
root.mainloop()

, это все еще работает.Из чистого любопытства, почему?

Код:

import tkinter as tk
from tkinter.messagebox import showerror
from time import sleep

class DecompilingChecker(object):
    def __init__(self):
        self.master = tk.Tk()
        self.master.withdraw()
        self.master.title("Test Program: Update")

    def check(self, file, directory):
        self.master.update()
        self.master.deiconify()

class TestProgram(object):
    pass

class GUI(object):
    def __init__(self, master):
        self.master = master
        self.master.title("Test Program")
        tk.Text(self.master).grid(row=0, column=0)
        self.decompilingchecker = DecompilingChecker()
        self.decompilingchecker.check(None, None)

class Bridge(object):
    def __init__(self):
        self.root = tk.Tk()
        GUI(self.root)

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

if __name__ == "__main__":
    try:
        bridge = Bridge()
        bridge.run()
    except Exception as e:
        showerror("Test Program: ERROR!", "An error has occurred!\n{0}".format(str(e)))
``

1 Ответ

1 голос
/ 29 июня 2019

Не следует звонить tk.Tk() более одного раза.Для дополнительных окон используйте tk.Toplevel().Вызов update необходим только в некоторых редких случаях, ваш GUI в большинстве случаев лучше полагаться на mainloop для обновлений.

import tkinter as tk


class DecompilingChecker(tk.Toplevel):
    def __init__(self, master):
        super().__init__(master)
        self.title("DecompilingChecker Toplevel")

    def check(self):
        print('checking')


class Bridge(tk.Toplevel):
    def __init__(self, master):
        super().__init__(master)
        self.title("Bridge Toplevel")


class GUI(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("GUI window")
        self.bridge = Bridge(self)
        self.d_checker = DecompilingChecker(self)
        self.d_checker.check()


if __name__ == "__main__":
    GUI().mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...