情况很简单。我有一个带有“帮助-关于”菜单的主窗口。单击此菜单项时,将打开一个模式窗口(假设它是“关于”窗口)。随着self.grab_set()
我关闭主窗口(虽然模态窗口确实当您单击主标题栏闪烁)。到现在为止还挺好。
这里的问题是:当用户在主窗口上的模态窗口外单击时,我真的很想发出铃声。
这是我可以找到的关于grab_set()的信息,实际上并不多:
我不太确定该如何理解:这是否意味着您可以在模态窗口内的主窗口上处理一个事件(就像敲响我的钟声一样)?所以我尝试了类似的事情:
self.bind('<Button-1>', self.bell)
例外Tkinter的回调:_tkinter.TclError:坏窗口路径名parent.bind('<Button-1>', self.bell)
无反应
那么,像在许多其他应用程序中一样,如何在主窗口的模态窗口之外单击时发出铃声?
派生问题:
我真的很想了解这种神秘的grab_set()
方法。
剥离代码:
import tkinter as tk
class About(tk.Toplevel):
def __init__(self, parent):
tk.Toplevel.__init__(self, parent)
self.geometry('200x150')
#--- OK button
btn_ok = tk.Button(self, text='OK', command=self.destroy) # destroy with OK
btn_ok.pack(side=tk.TOP)
btn_ok.focus() # destroy with spacebar
#--- Make window modal
self.grab_set()
# self.wait_window() # is this necessary in this case?
# self.bind('<Button-1>', self.bell) ??? The question
class MenuBar(tk.Menu):
def __init__(self, parent):
tk.Menu.__init__(self)
helpmenu = tk.Menu(self, tearoff=0)
helpmenu.add_command(label='About', command=lambda: About(parent))
self.add_cascade(label='Help', menu=helpmenu)
class MainApp():
def __init__(self, parent):
parent.configure(background='#000000')
parent.geometry('800x600')
menubar = MenuBar(parent)
parent.configure(menu=menubar)
if __name__ == '__main__':
root = tk.Tk()
MainApp(root)
root.mainloop()
设置抓取时,所有按钮单击都将转到带有抓取的窗口。您以捕获其他事件的方式捕获它们。如果单击按钮,可以通过将功能绑定到来实现<1>
。
重要的是要知道,在一个根窗口或一个Toplevel
窗口上的绑定将应用于该窗口中的所有窗口小部件。例如,self
即使您单击“确定”按钮,也会绑定到代码中。因此,仅当与事件关联的窗口小部件与顶级相同时,回调才可能起作用。
例:
class About(tk.Toplevel):
def __init__(self, parent):
...
self.bind("<1>", self.capture_click)
...
def capture_click(self, event):
if event.widget == self:
<your logic here>
在想知道用户是否在窗口外部单击时,可以使用事件对象的坐标与窗口进行比较,以查看该单击是在内部还是外部。
def on_click(self, event):
if event.widget == self:
if (event.x < 0 or event.x > self.winfo_width() or
event.y < 0 or event.y > self.winfo_height()):
self.bell()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句