Python Tkinter调用默认事件处理程序

时间:2018-07-23 16:52:53

标签: python tkinter

我有一个带有输入框和按钮的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。)

1 个答案:

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