我有一个带有输入框和按钮的GUI。当我按“ q”时,关闭按钮应被聚焦,除非输入具有焦点。按下“ q”时可以使按钮聚焦,但是当我想在条目中插入“ q”时,它失去了焦点,因此我无法继续在输入框中插入文本。
import tkinter as tk
class Window(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.e = tk.Entry(self)
self.e.pack()
f = tk.Frame(self)
f.pack()
self.btn_save = tk.Button(f, text="save", command=lambda: print("save"))
self.btn_save.pack(side='left')
self.btn_close = tk.Button(f, text="close", command=self.destroy)
self.btn_close.pack(side='left')
self.bind('<w>', lambda e: self.btn_save.focus_set())
self.bind('<q>', lambda e: self.btn_close.focus_set())
self.e.focus_set()
w = Window()
w.mainloop()
我知道,对于自定义事件处理程序,我可以通过返回'break'
避免进一步的事件处理程序被调用。但是,如何调用Entry
的事件处理程序?
在下面的代码中,选择该条目时,按“ q”键不再使关闭按钮聚焦,但是我再也不能插入任何文本。
import tkinter as tk
class Window(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.e = tk.Entry(self)
self.e.pack()
f = tk.Frame(self)
f.pack()
self.btn_save = tk.Button(f, text="save", command=lambda: print("save"))
self.btn_save.pack(side='left')
self.btn_close = tk.Button(f, text="close", command=self.destroy)
self.btn_close.pack(side='left')
self.bind('<w>', lambda e: self.btn_save.focus_set())
self.bind('<q>', lambda e: self.btn_close.focus_set())
self.e.bind('<Key>', self.on_key_press)
self.e.focus_set()
def on_key_press(self, event):
# How can I call the default event handler here
# which takes care of inserting and removing characters, moving the cursor and everything?
return 'break'
w = Window()
w.mainloop()
(顺便说一句,当通过键盘调用关闭按钮时,该窗口将按预期关闭,但是此后键盘将被忽略,直到我单击另一个窗口为止。我使用的是i3版本4.8和Python 3.4.2。)
答案 0 :(得分:0)
尽管如此,我发现一种解决方法似乎并不十分优雅。 尤其是如果您有多个输入框,这似乎不是一个好方法。
在事件处理程序中,使按钮处于焦点状态,检查哪个窗口小部件具有焦点,如果是输入框,则什么也不做:
Send email
如果有人能找到更好的解决方案,我将不胜感激。
关于通过键盘调用关闭按钮后忽略键盘的问题,似乎有助于拆开按钮框架并在销毁窗口之前更新窗口:
import tkinter as tk
class Window(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.e = tk.Entry(self)
self.e.pack()
self.frame_buttons = tk.Frame(self)
self.frame_buttons.pack()
self.btn_save = tk.Button(self.frame_buttons, text="save", command=lambda: print("save"))
self.btn_save.pack(side='left')
self.btn_close = tk.Button(self.frame_buttons, text="close", command=self.destroy)
self.btn_close.pack(side='left')
self.bind('<w>', lambda e: None if self.focus_get() == self.e else self.btn_save. focus_set())
self.bind('<q>', lambda e: None if self.focus_get() == self.e else self.btn_close. focus_set())
self.e.focus_set()
w = Window()
w.mainloop()