【问题标题】:Bind a keyboard event to a Tkinter child将键盘事件绑定到 Tkinter 孩子
【发布时间】:2019-11-23 19:29:02
【问题描述】:

我试图将关闭窗口函数绑定到 Tkinter 子窗口。我已经能够为父窗口实现绑定过程,但我正在努力为子窗口制定绑定实现。

使用this question 中列出的示例,我尝试将关闭功能绑定到 Escape 键,但没有成功也没有错误消息。

import tkinter as tk


def close(self):
    self.top.destroy()

class ChildWindow:
    def __init__(self, master):
        self.top = tk.Toplevel(master)
        self.frame = tk.Frame(self.top)
        self.frame.pack()

        self.frame.bind("<Escape>",lambda: close(self))        

        self.close_button = tk.Button(self.frame, text="Close", command=self.top.destroy)
        self.close_button.pack()

class MainWindow:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)

        self.about_button = tk.Button(self.frame, text="Open child window", command=self._open_child_window)
        self.about_button.pack()
        self.frame.pack()

    def _open_child_window(self):
        self.about_window = ChildWindow(self.master)

root = tk.Tk()
lf = MainWindow(root)
root.mainloop()

【问题讨论】:

  • "self.frame.bind(...":我想,Frame 永远不会得到键盘焦点,因此得到从来都不是关键事件。
  • @stovfl 在您看来,子对象是否有任何属性可以获得键盘焦点,然后我可以将关闭函数绑定到?
  • @EQNX 我会尝试root.bind(...,因为root 应该得到所有事件。在您的def close(... 中,您需要像if ChildWindow is .shown: 这样的条件阅读Widget.grab_set-method
  • @stovfl root.bind(..., 成功了
  • @EQNX 好的,阅读Widget.winfo_visual-method

标签: python tkinter keyboard-events toplevel


【解决方案1】:

根据@stovfl 的建议,我将绑定更改为根的属性而不是 self.frame

这捕获了键盘事件并成功调用了 close(self) 函数。

import tkinter as tk

def close(self):
    self.top.destroy()

class ChildWindow:
    def __init__(self, master):
        self.top = tk.Toplevel(master)
        self.frame = tk.Frame(self.top)
        self.frame.pack()

        root.bind("<Escape>",lambda event: close(self))        

        self.close_button = tk.Button(self.frame, text="Close", command=self.top.destroy)
        self.close_button.pack()

    def close(self, event=None):
        print("destroy arg")
        self.root.destroy()


class MainWindow:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(self.master)



        self.about_button = tk.Button(self.frame, text="Open child window", command=self._open_child_window)
        self.about_button.pack()
        self.frame.pack()

    def _open_child_window(self):
        self.about_window = ChildWindow(self.master)

root = tk.Tk()
lf = MainWindow(root)
root.mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多