在我的一个项目中,我试图检查根窗口(self)的子tk.toplever窗口(child1)中是否有用户从根窗口中创建的tk.toplever窗口(child2),以及当前用户屏幕上是否有此窗口(child2)。
如果不是这样,那么新的tk.toplever窗口应该由根窗口的子窗口(child1)创建,而不是由根窗口本身创建。如果它已经由根窗口创建并且当前出现在用户屏幕上,那么它应该得到focus()而不是由“child1”重新初始化。
根窗口被包装在一个名为App()的类中,两个“子”窗口都是由根类App()中的方法创建的。
如果给方法的参数是真的,我必须在安静模式下初始化“child2”。我想那是个纠结的错误。这个问题发生在64位的Windows7上,如果这很重要的话。
我试过这个(例子):import tkinter as tk
from tkinter import ttk
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
top = self.winfo_toplevel()
self.menuBar = tk.Menu(top)
top['menu'] = self.menuBar
self.menuBar.add_command(label='Child1', command=self.__create_child1)
self.menuBar.add_command(label='Child2', command=lambda: self.__create_child2(True))
self.TestLabel = ttk.Label(self, text='Use the buttons from the toplevel menu.')
self.TestLabel.pack()
self.__create_child2(False)
def __create_child1(self):
self.Child1Window = tk.Toplevel(master=self, width=100, height=100)
self.Child1WindowButton = ttk.Button(self.Child1Window, text='Focus Child2 window else create Child2 window', command=self.CheckForChild2)
self.Child1WindowButton.pack()
def __create_child2(self, givenarg):
self.Child2Window = tk.Toplevel(master=self, width=100, height=100)
if givenarg == False:
self.Child2Window.withdraw()
# Init some vars or widgets
self.Child2Window = None
else:
self.Child2Window.TestLabel = ttk.Label(self.Child2Window, text='This is Child 2')
self.Child2Window.TestLabel.pack()
def CheckForChild2(self):
if self.Child2Window:
if self.Child2Window.winfo_exists():
self.Child2Window.focus()
else:
self.__create_child2(True)
else:
self.__create_child2(True)
if __name__ == '__main__':
App().mainloop()
问题来了:
我无法检查“child2”是否已经存在。获取错误:_tkinter.TclError:窗口路径名错误
解决方案:
获取正确“窗口路径名”的唯一方法是,不要直接在“child2”窗口上调用winfo_exists()方法,而是调用“child1”窗口的主窗口,然后添加相应的属性以及要使用的主窗口的属性。
示例(编辑CheckForChild2方法):def CheckForChild2(self):
if self.Child2Window:
if self.Child1Window.master.Child2Window.winfo_exists():
self.Child1Window.master.Child2Window.focus()
else:
self.__create_child2(True)
else:
self.__create_child2(True)