无法隐藏顶级 window
Not able to hide Toplevel window
我有一个 Toplevel window,我想为其切换可见性。
它是一个选项列表框,当您单击 10 个选项之一时,它应该会消失。
我遇到的问题是,当 Toplevel window(称为 'newW')出现时,它在失去焦点时不会进入隐藏状态。即使 'newW' window 绑定到该事件。
代码如下:
from tkinter import *
from tkinter import ttk
root = Tk()
#Create Menu
mb = Menu(root)
root.config(menu = mb)
root.option_add('*tearOff', False)
bk = Menu(mb)
mb.add_cascade(menu = bk, label = 'Edit')
#Create seperate window to show background options
newW = Toplevel(root)
newW.overrideredirect(True)
#Create Listbox to newW
lb = Listbox(newW)
lb.grid(row = 0, column = 0)
for x in range(10):
lb.insert(END, x)
#Define function to toggle visibility of Toplevel window
def show(e=None):
if newW.state() == 'withdrawn':
newW.geometry('+{0}+{1}'.format(root.winfo_rootx(), root.winfo_rooty()))
newW.deiconify()
newW.selection_clear()
return
newW.withdraw()
#Add item to Menu button that is suppposed to show / hide Toplevel window
bk.add_command(label = 'Test Me', command = show)
#Bind visibility of Toplevel Window on focus
newW.bind('<FocusOut>', newW.withdraw())
root.mainloop()
所以要明确一点,我想做的是在我单击根 window 时隐藏 newW window(因此出现 FocusOut)。它仅在我按下 'Try Me' 按钮时有效,这意味着它会打开和关闭。
谢谢!
您将调用的 return 值分配给 newW.withdraw()
,即 None
给失去焦点的事件。您应该使用不带括号的 newW.withdraw
。但是,如果您这样做,事件对象也将被传递给无法接受的 newW.withdraw
。您可以使用 lambda 函数来拦截事件对象。
所以替换
newW.bind('<FocusOut>', newW.withdraw())
和
newW.bind('<FocusOut>', lambda e: newW.withdraw())
此外,您可以将 newW.focus_set()
添加到让 newW
出现的代码中,这样在 newW
之外的任何点击都会使其失去焦点并触发事件。
我有一个 Toplevel window,我想为其切换可见性。 它是一个选项列表框,当您单击 10 个选项之一时,它应该会消失。
我遇到的问题是,当 Toplevel window(称为 'newW')出现时,它在失去焦点时不会进入隐藏状态。即使 'newW' window 绑定到该事件。
代码如下:
from tkinter import *
from tkinter import ttk
root = Tk()
#Create Menu
mb = Menu(root)
root.config(menu = mb)
root.option_add('*tearOff', False)
bk = Menu(mb)
mb.add_cascade(menu = bk, label = 'Edit')
#Create seperate window to show background options
newW = Toplevel(root)
newW.overrideredirect(True)
#Create Listbox to newW
lb = Listbox(newW)
lb.grid(row = 0, column = 0)
for x in range(10):
lb.insert(END, x)
#Define function to toggle visibility of Toplevel window
def show(e=None):
if newW.state() == 'withdrawn':
newW.geometry('+{0}+{1}'.format(root.winfo_rootx(), root.winfo_rooty()))
newW.deiconify()
newW.selection_clear()
return
newW.withdraw()
#Add item to Menu button that is suppposed to show / hide Toplevel window
bk.add_command(label = 'Test Me', command = show)
#Bind visibility of Toplevel Window on focus
newW.bind('<FocusOut>', newW.withdraw())
root.mainloop()
所以要明确一点,我想做的是在我单击根 window 时隐藏 newW window(因此出现 FocusOut)。它仅在我按下 'Try Me' 按钮时有效,这意味着它会打开和关闭。
谢谢!
您将调用的 return 值分配给 newW.withdraw()
,即 None
给失去焦点的事件。您应该使用不带括号的 newW.withdraw
。但是,如果您这样做,事件对象也将被传递给无法接受的 newW.withdraw
。您可以使用 lambda 函数来拦截事件对象。
所以替换
newW.bind('<FocusOut>', newW.withdraw())
和
newW.bind('<FocusOut>', lambda e: newW.withdraw())
此外,您可以将 newW.focus_set()
添加到让 newW
出现的代码中,这样在 newW
之外的任何点击都会使其失去焦点并触发事件。