首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Python 3.7.3,如何禁用Tkinter的背景"Tab“键绑定

使用Python 3.7.3,如何禁用Tkinter的背景"Tab“键绑定
EN

Stack Overflow用户
提问于 2019-10-21 21:46:30
回答 1查看 826关注 0票数 1

我试图拦截Tab字符按下,而没有显式绑定到它的根或帧级别,因为这将增加更多的复杂性,超出预期。我真的不想把一个简单的处理程序绑定到每个按钮上。

我想知道两件事:

  1. 如何拦截/禁用背景"Tab“键绑定?
  2. 空格键在选项卡后触发与该按钮关联的命令(即使您在当前选项卡的另一个小部件上手动调用widget.focus_set() ):如何防止这一点?

由于某些原因,Tkinter会自动处理Tab键以进入下一个对象。我不想把这个放在我的案子里。我还尝试了基于这个answer的“返回‘中断’”,但是它似乎不起作用,或者"_get_key“事件处理程序发生在后台绑定之后。

代码语言:javascript
运行
复制
class testFocus:
    btns = { }
    string = ''
    NumberCharList = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'period', 'comma', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    def __init__(self, root):
        self.top = root
        self.top.bind('<Key>', self._get_key)
        self.frame = tk.Frame(self.top)
        self.frame.pack()

        self.var = tk.StringVar(value='Type: ')
        self.lbl = tk.Label(self.frame, textvariable=self.var)
        self.lbl.pack()

        for i in range(15):
            self.btns[i] = tk.Button(self.frame, text=f'Click {i}', command=lambda x=i: print(x))
            self.btns[i].pack()

    def _get_key(self, event):
        print('Root._get_key.event.keysym: ', event.keysym)
        print(root.focus_get())
        if event.keysym in self.NumberCharList:
            self.string += event.keysym
            self.var.set(self.string)
        elif event.keysym == 'Tab':
            print('TAB!') # NOT WORKING...WHY?
        elif event.keysym == 'Delete':
            self.string = ''
            self.var.set(self.string)
        elif event.keysym == 'BackSpace':
            self.string = self.string[:-1]
            self.var.set(self.string)
        # ... other code that handles specific key presses.
        print(root.focus_get())


if __name__ == '__main__':

    root = tk.Tk()
    root.geometry(f"800x480+{int(root.winfo_screenwidth() / 8)}+{int(root.winfo_screenheight() / 6)}")
    root.attributes('-fullscreen', False)
    root.title('Tests')
    root.resizable(width=False, height=False)
    app = testFocus(root)
    root.mainloop()

标签输出:

代码语言:javascript
运行
复制
Root._get_key.event.keysym:  Tab
.
.
Root._get_key.event.keysym:  Tab
.!frame.!button
.!frame.!button
Root._get_key.event.keysym:  Tab
.!frame.!button2
.!frame.!button2
Root._get_key.event.keysym:  Tab
.!frame.!button3
.!frame.!button3
Root._get_key.event.keysym:  Tab
.!frame.!button7
.!frame.!button7
Root._get_key.event.keysym:  Tab
.!frame.!button8
.!frame.!button8
Root._get_key.event.keysym:  Tab
.!frame.!button9
.!frame.!button9
Root._get_key.event.keysym:  Tab
.!frame.!button10
.!frame.!button10
Root._get_key.event.keysym:  Tab
.!frame.!button12
.!frame.!button12
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-21 22:29:43

如何拦截/禁用背景"Tab“键绑定?

默认选项卡行为基于对"all"绑定标记的绑定。您可以删除该绑定以删除默认的选项卡行为。

代码语言:javascript
运行
复制
root.unbind_all("<Tab>")

根据您的python使用的tk底层版本,它可能使用到<<NextWindow>>的绑定,而不是直接在选项卡键上。在这种情况下,您需要以类似的方式解除虚拟事件<<NextWindow>>的绑定:

代码语言:javascript
运行
复制
root.unbind_all("<<NextWindow>>")

如果您想要将行为选项卡移到下一个窗口,您可能也希望将其移除到前一个窗口。该绑定用于虚拟事件<<PrevWindow>>

代码语言:javascript
运行
复制
root.unbind_all("<<PrevWindow>>")

空格键在选项卡后触发与该按钮关联的命令(即使您在当前选项卡的另一个小部件上手动调用widget.focus_set() ):如何防止这种情况?

这绝对不会发生。空间键只有在有焦点的情况下才能触发按钮,或者您已经显式地设置了自己的绑定来处理其他小部件中的空间键。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58494540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档