【问题标题】:Keyboard shortcuts with tkinter in Python 3Python 3 中使用 tkinter 的键盘快捷键
【发布时间】:2016-09-19 21:45:58
【问题描述】:

我在 Python 3 中创建了一个菜单栏,我想知道如何为其添加键盘快捷键和加速器。就像按“F”打开文件菜单等等。

通过一些挖掘,我找到了“underline=”属性,但它似乎在 Python 3 中不起作用。当我尝试它时它不起作用,我找到的唯一文档是早期版本的Python 的。

    menubar = Menu(master)

    filemenu = Menu(menubar, tearoff=0)
    .....
    menubar.add_cascade(label="File", underline=0, menu=filemenu)

有没有办法在 Python 3 中使用 tkinter 做这些事情?

【问题讨论】:

    标签: python python-3.x tkinter menu keyboard-shortcuts


    【解决方案1】:

    考虑阅读 (http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm)

    您必须将您的小部件绑定到您的函数的事件:

    键盘事件被发送到当前拥有 键盘焦点。您可以使用 focus_set 方法将焦点移动到 小部件:

    捕获键盘事件

    from Tkinter import *
    
    root = Tk()
    
    def key(event):
        print "pressed", repr(event.char)
    
    def callback(event):
        frame.focus_set()
        print "clicked at", event.x, event.y
    
    frame = Frame(root, width=100, height=100)
    frame.bind("<Key>", key)
    frame.bind("<Button-1>", callback)
    frame.pack()
    
    root.mainloop()
    

    如果你运行这个脚本,你会发现你必须点击 开始接收任何键盘事件之前的帧。

    不久前,我按照本指南实现了与我的一个函数的 ctrl+f 绑定:

    toolmenu.add_command(label="Search Ctrl+f", command=self.cntrlf)
    root.bind('<Control-f>', self.searchbox)
    def cntrlf(self, event):
        self.searchbox()
    

    对于您的文件菜单,您可能需要考虑实施加速器:

    menubar.add_cascade(label="File", menu=fileMenu)
    fileMenu.add_command(label="Exit", command=quit, accelerator="Ctrl+Q")
    config(menu=menubar) 
    

    对于菜单选项,请记住使用 ALT 后跟 OptionName 的第一个字母

    文件菜单 = ALT 后跟 f 工具菜单 = ALT 后跟 t 等等

    希望对你有用

    【讨论】:

    • 这很有用,而且我的加速器正在工作,非常感谢!不过,我关于 Python 3 中的快捷方式(例如按“F”下拉“文件”菜单)的主要问题仍未得到解答。
    • 不确定“F”是否可以指定为加速键,我正在检查
    • 没关系,我是个白痴。我忘记先按“alt”以使带下划线的字母发生。它肯定有效。
    • =我现在也在做同样的事情,偶然发现了 alt flol
    • @glls 有没有办法让框架在不点击框架的情况下接收事件?如果我滚动到框架点击它,我已经用时间到达那里,不如直接点击按钮而不是使用快捷键。
    【解决方案2】:

    有没有办法让框架在不点击框架的情况下接收事件?如果我滚动到框架点击它,我已经用时间到达那里,不如直接点击按钮而不是使用快捷键。

    答案是将整个根/主/窗口绑定到一个键绑定,以便每当您按下该键时,都会调用一个函数来执行您的任务。

    import sys
    from tkinter import *
    root=Tk()
    Menu_bar = Menu(root)
    m1 = Menu(Menu_bar, tearoff=0)
    m1.add_command(label="exit", command=sys.quit)
    Menu_bar.add_cascade(label="file", menu=m1)
    
    root.bind("<Alt_L><f>", sys.quit)
    root.mainloop
    

    应该这样做

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多