首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法隐藏Toplevel窗口

无法隐藏Toplevel窗口
EN

Stack Overflow用户
提问于 2015-01-18 19:52:02
回答 1查看 2.7K关注 0票数 2

我有一个Toplevel窗口,我想为它切换能见度。它是一个选项列表框,当您单击10个选项之一时,该选项应该会被取消。

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

下面是代码:

代码语言:javascript
复制
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)时,将FocusOut窗口隐藏起来。只有当我按下“试试看”按钮时,它才能工作,这意味着它会开关。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-18 20:14:05

将调用的返回值分配给newW.withdraw(),这是None,用于失去焦点。您应该使用没有括号的newW.withdraw。但是,如果这样做,事件对象也将被传递给newW.withdraw,后者不能接受它。您可以使用lambda函数来拦截事件对象。

所以替换

代码语言:javascript
复制
newW.bind('<FocusOut>', newW.withdraw())

使用

代码语言:javascript
复制
newW.bind('<FocusOut>', lambda e: newW.withdraw())

此外,您还可以将newW.focus_set()添加到允许newW出现的代码中,这样,在newW之外的任何单击都会使其失去焦点并触发事件。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28014099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档