无法隐藏Toplevel窗口

时间:2015-01-18 19:52:02

标签: python tkinter

我有一个Toplevel窗口,我想要切换可见性。 它是一个选项列表框,当您单击10个选项中的一个时,它应该消失。

我遇到的问题是,当Toplevel窗口(称为' newW')出现时,它在失去焦点时不会进入隐藏状态。即使是新的'窗口绑定到该事件。

以下是代码:

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()

所以要清楚,我想要做的是,当我点击根窗口(因此是FocusOut)时隐藏newW窗口。只有当我按下“试试我”时,它才有效。按钮,意味着它可以打开和关闭。

谢谢!

1 个答案:

答案 0 :(得分:3)

您将呼叫的返回值分配给newW.withdraw(),即None,以便失去焦点。您应该使用newW.withdraw而不使用括号。但是,如果您这样做,事件对象也将传递给newW.withdraw,而newW.bind('<FocusOut>', newW.withdraw()) 无法接受它。您可以使用lambda函数拦截事件对象。

所以替换

newW.bind('<FocusOut>', lambda e: newW.withdraw())

newW.focus_set()

此外,您可以将newW添加到允许newW出现的代码中,以便{{1}}之外的任何点击都会使其失去焦点并触发事件。