你需要在open_window函数中对窗口进行判断。可以使用tkinter自带的winfo_exists()方法来判断窗口是否已经存在。如果不存在,则创建新窗口并打印其ID;如果存在,则捕获窗口并打印其ID。
下面是修改后的代码:
import tkinter as tk
def open_window():
if not new_window.winfo_exists():
new_window = tk.Toplevel(root)
new_window.title("New Window")
print("New window ID:", id(new_window))
else:
new_window.lift()
print("Window already exists, ID:", id(new_window))
root = tk.Tk()
root.title("Main Window")
new_window = tk.Toplevel(root)
new_window.title("New Window")
button = tk.Button(root, text="Open new window", command=open_window)
button.pack()
root.mainloop()
此代码创建了一个名为"New Window"的初始子窗口,并将其存储在全局变量new_window中。当点击按钮时,open_window函数首先检查窗口是否存在,如果是,则激活该窗口并打印其ID;否则,创建一个新窗口,并打印其ID。
请注意,必须将new_window声明为全局变量,以便在open_window函数中可以访问它。
该代码存在一个问题,因为 new_window
在函数外已经被定义,但是在函数内又被重新定义为 Toplevel
对象。这意味着当 open_window
函数被调用时,它会尝试访问一个在该作用域中未定义的变量。
要解决此问题,可以将 new_window
定义为全局变量,然后在函数内用 global
关键字声明变量,以便在函数内和函数外使用同一个对象。
以下是优化后的代码:
import tkinter as tk
new_window = None
def open_window():
global new_window
if not new_window or not new_window.winfo_exists():
new_window = tk.Toplevel(root)
new_window.title("New Window")
print("New window ID:", id(new_window))
else:
new_window.lift()
print("Window already exists, ID:", id(new_window))
root = tk.Tk()
root.title("Main Window")
button = tk.Button(root, text="Open new window", command=open_window)
button.pack()
root.mainloop()
此代码通过检查 new_window
是否存在以及其是否仍然存在来决定是创建新窗口还是将现有窗口提升。同时,new_window
被声明为全局变量,并在函数内使用了 global
关键字,以便在函数内和函数外使用同一个变量。