下面是一個非常簡單的例子,介紹如何使用Toplevel
打開另一個窗口,以及如何從Toplevel窗口編輯主窗口上的內容。
它非常基本,但它應該是一個足夠好的例子來說明tkinter打開新窗口時需要什麼。
更新:增加了Bryan在評論中指出的grab_set()
方法。
根據documentation的grab_set()
方法將此應用程序的所有事件路由到此小部件。
注意:這將沿Minimal, Complete, and Verifiable example的線。這是儘可能少的代碼來獲得點,同時也是可測試的。
from tkinter import *
class GUI(Frame):
def __init__(self, master, *args, **kwargs):
Frame.__init__(self, master, *args, **kwargs)
self.master = master
self.my_frame = Frame(self.master)
self.my_frame.pack()
self.button1 = Button(self.master, text="Open New Window", command = self.open_toplevel_window)
self.button1.pack()
self.text = Text(self.master, width = 20, height = 3)
self.text.pack()
self.text.insert(END, "Before\ntop window\ninteraction")
def open_toplevel_window(self):
self.top = Toplevel(self.master)
#this forces all focus on the top level until Toplevel is closed
self.top.grab_set()
def replace_text():
self.text.delete(1.0, END)
self.text.insert(END, "Text From\nToplevel")
top_button = Button(self.top, text = "Replace text in main window",
command = replace_text)
top_button.pack()
if __name__ == "__main__":
root = Tk()
app = GUI(root)
root.mainloop()
這裏使用一個單獨的類頂層時是一個例子:
from tkinter import *
class GUI(Frame):
def __init__(self, master, *args, **kwargs):
Frame.__init__(self, master, *args, **kwargs)
self.master = master
self.my_frame = Frame(self.master)
self.my_frame.pack()
self.button1 = Button(self.master, text="Open New Window",
command = open_toplevel_window)
self.button1.pack()
self.text = Text(self.master, width = 20, height = 3)
self.text.pack()
self.text.insert(END, "Before\ntop window\ninteraction")
class open_toplevel_window(Toplevel):
def __init__(self, *args, **kwargs):
Toplevel.__init__(self, *args, **kwargs)
self.grab_set()
def replace_text():
app.text.delete(1.0, END)
app.text.insert(END, "Text From\nToplevel")
top_button = Button(self, text = "Replace text in main window",
command = replace_text)
top_button.pack()
if __name__ == "__main__":
root = Tk()
app = GUI(root)
root.mainloop()
這裏沒有可測試的代碼。請提供[最小,完整和可驗證示例](https://stackoverflow.com/help/mcve)。 –
你說你在第二個進程中有第二個窗口,但是我的代碼中沒有看到任何內容,表明你正在運行一個單獨的進程。 –
至少從我的理解。當在tkinter中打開單獨的應用程序窗口時,它們使用單獨的進程(因爲它們每個都有自己的任務欄圖標),但我可能錯了。我在帖子中讀到,如果他們的應用程序窗口不共享相同的進程,那麼grab_set將不起作用。我也可以在我的頭上,雖然 –