Python Tkinter - 恢复原始默认键绑定

2024-04-10

我正在 Win7 机器上使用 Python 2.7 和 Tkinter GUI。

在某些情况下,我想完全覆盖 Tab 键的正常默认行为,但前提是存在某些条件。之后我想恢复到默认行为。 (请注意,目前我对 Tab 键感兴趣,但在某些时候我可能也需要对其他键执行此操作。)

下面的代码片段(不是我的实际应用程序,只是一个精简的示例)为我提供了我想要的完全覆盖,但是一旦我执行了以下操作,它就会产生“永久”消除默认行为的副作用unbind,使 Tab 键无效:

import Tkinter as tk

#Root window
root = tk.Tk()

tabBlock = ''

#Tab override handler
def overrideTab(*args):
    global tabBlock
    if (ctrlChk4.get()==1):
        tabBlock = root.bind_all('<Tab>',stopTab)
    else:
        root.unbind('<Tab>',tabBlock)

def stopTab(*args):
    print 'Tab is overridden'

#Control variable
ctrlChk4 = tk.IntVar()
ctrlChk4.trace('w',overrideTab)

#GUI widgets
fra1  = tk.Frame(root)
chk1 = tk.Checkbutton(fra1,
                      text='First checkbutton')
chk2 = tk.Checkbutton(fra1,
                      text='Second checkbutton')
chk3 = tk.Checkbutton(fra1,
                      text='Third checkbutton')
chk4 = tk.Checkbutton(fra1,
                      text='Tab override',
                      variable=ctrlChk4)

fra1.grid(row=0,column=0,sticky=tk.W,padx=10,pady=10)
chk1.grid(row=0,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))
chk2.grid(row=1,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))
chk3.grid(row=2,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))
chk4.grid(row=3,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))

tk.mainloop()

我尝试过做不同的事情bind代替bind_all,并且还设置add绑定方法的参数1 or '+'。这些变化都给了我相同的结果:一旦我执行了这些操作,它们就可以让我恢复默认行为unbind但它们也允许默认行为继续bind已生效。

我已经搜索了各种在线资源,寻找一种“保存和恢复”原始绑定的方法,或者“非破坏性地”完全覆盖默认行为,但两者都没有运气。

有什么办法可以完成我想做的事情吗?

编辑:当谈到 Tab 键时,我知道我可以模仿/替换原始的默认行为

root.focus_get().tk_focusNext().focus_set()

...但这也是一个普遍问题。如果我需要在某个模块的上下文中覆盖某个键(任何键)(例如,包含我自己的自定义类,用于我自己的自定义调整 Tkinter 小部件),但随后恢复到该键在调用模块中,我该怎么做?是否可以?


好的,我尝试了一下并为您找到了答案。我在评论中建议的内容有效。总之,return "break"当你想覆盖它时。当你不这样做的时候不要这样做。使用bind代替bind_all。而且,如果您尚未在 args 中这样做,请考虑事件参数,否则它将无法正常工作。实际上,您仍在将某些内容绑定到密钥,但它仅在某些指定情况下覆盖默认功能。下面是代码(适用于 Python 2.x 和 3.x):

import sys
if sys.version_info[0]<3:
    import Tkinter as tk
else:
    import tkinter as tk

#Root window
root = tk.Tk()

#Tab override handler
def overrideTab(*args):
    root.bind('<Tab>', stopTab)

def stopTab(event=None, *args):
    if ctrlChk4.get()==1:
        print('Tab is overridden')
        return "break"
    else:
        print('Tab is not overridden') #Note that it still prints this.

#Control variable
ctrlChk4 = tk.IntVar()
ctrlChk4.trace('w',overrideTab)

#GUI widgets
fra1  = tk.Frame(root)
chk1 = tk.Checkbutton(fra1,
                      text='First checkbutton')
chk2 = tk.Checkbutton(fra1,
                      text='Second checkbutton')
chk3 = tk.Checkbutton(fra1,
                      text='Third checkbutton')
chk4 = tk.Checkbutton(fra1,
                      text='Tab override',
                      variable=ctrlChk4)

fra1.grid(row=0,column=0,sticky=tk.W,padx=10,pady=10)
chk1.grid(row=0,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))
chk2.grid(row=1,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))
chk3.grid(row=2,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))
chk4.grid(row=3,column=0,sticky=tk.W,padx=(10,0),pady=(5,0))

tk.mainloop()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Tkinter - 恢复原始默认键绑定 的相关文章

  • 从另一个文件执行按钮命令?

    我已经开始开发一个 GUI 系统 在该系统中 我需要从一个文件导入一个函数 以便在按下按钮时在主文件中执行 但每次运行它时 我都会得到 AttributeError partially initialized module Two has
  • Ttk Treeview:跟踪键盘选择

    这是一个带有 ttk 树视图的 Tk 小部件 当用户单击该行时 会执行某些功能 此处仅打印项目文本 我需要的是以下内容 最初的重点是文本输入 当用户按下 Tab 键时 焦点应该转到第一行 并且应该执行绑定到 Click 事件的函数 当用户使
  • 未找到类型:'(架构,http://www.w3.org/2001/XMLSchema,)

    我正在使用 suds client 来提供肥皂 wsdl 服务 当我尝试为肥皂服务设置肥皂水客户端时 我收到 类型未找到 错误 我到处寻找 有许多未解答的问题具有相同的错误 我将链接添加为问题1 https stackoverflow co
  • 当气流 initdb 时,导入错误:无法导入名称 HiveOperator

    我最近安装了airflow对于我的工作流程 在创建项目时 我执行了以下命令 airflow initdb 返回以下错误 2016 08 15 11 17 00 314 init py 36 INFO Using executor Seque
  • 创建圆形图像 PIL Tkinter

    Currently I have a zoom feature in my application that works very well however I d like the actual zoom box to be a circ
  • Python - 如何将列表保存为图像?

    我生成一个常规列表 是否可以将此列表保存为 JPEG 图像或 PNG 或其他格式 以便我可以打开图像并查看它 我目前正在尝试使用 python 成像库 PIL 来解决这个问题 这是可能的解决方案之一 使用以下方法创建一个空图像对象 Imag
  • 如果包含字符串,pandas 重命名列

    我想遍历数据框中的所有列 并重命名 或映射 列 如果它们包含某些字符串 例如 将包含 agriculture 的所有列重命名为字符串 agri 我正在考虑使用rename and str contains但不知道如何将它们结合起来以实现我想
  • 如何检查当前日期并移至下一个日期

    我遇到了一个我似乎无法理解的 python 问题 不确定是否需要使用 if 语句 但因为我是 python 新手 所以我实际上不确定如何编写这个小问题 事实上 这就是我遇到的问题 对于出发日历 我希望 python 能够执行以下操作 查看
  • 如何使用 Python 创建新的文本文件

    我正在练习用 python 管理 txt 文件 我一直在阅读有关它的内容 发现如果我尝试打开一个尚不存在的文件 它将在执行程序的同一目录中创建该文件 问题来了 当我尝试打开它时 出现以下错误 IOError Errno 2 没有这样的文件或
  • ipython/jupyter 中的 tk 问题

    我正在尝试编写一个用于从 ipython jupyter 笔记本启动的 gui 但在笔记本中使用 tkinter 时遇到了麻烦 特别是在让 tk gui 窗口正常关闭方面 如何从 jupyter 制作 启动 tkinter gui 然后在不
  • 将 celery 与 Flask 应用程序上下文一起使用会导致“弹出错误的应用程序上下文”。断言错误

    我或多或少使用设置来使用您的 Flask 应用程序上下文来运行 Celery 任务 http flask pocoo org docs 0 10 patterns celery http flask pocoo org docs 0 10
  • 绝对导入不起作用,但相对导入起作用

    这是我的应用程序结构 foodo setup py foodo init py foodo py models py foodo foodo foodo py从导入类models py module from foodo models im
  • 如何将 numpy rearray 的子集转换为连续数组?

    我有一个recarray来自读取 csv 文件 我有兴趣将列的子集转换为连续浮点数组 我想避免将它们转换为列表或将它们一一堆叠 我尝试了中的建议https stackoverflow com a 11792956 https stackov
  • pip.main 安装失败,“模块”对象没有属性“main”

    我正在尝试从 python 脚本中安装一些 python 包 并且我正在使用pip main install 为了那个原因 下面是代码片段 try import requests except import pip pip main ins
  • python 中的 exec 关键字有什么作用?

    code compile a 1 2
  • 使用一次递归调用实现递归

    给定一个函数如下 f n f n 1 f n 3 f n 4 f 0 1 f 1 2 f 2 3 f 3 4 我知道使用递归来实现它 并在一个函数内进行三个递归调用 但我想在函数内仅使用一次递归调用来完成此操作 怎样才能做到呢 要实现使用
  • 对 os.listdir 文件进行排序 Python

    如果已下载数年的数据 这些数据存储在具有以下命名约定的文件中 year day dat 例如 名为 2014 1 dat 的文件包含 2014 年 1 月 1 日的数据 我需要按天排序读取这些数据文件 2014 1 dat 2014 2 d
  • Python 导入非常慢 - Anaconda python 2.7

    我的 python import 语句变得非常慢 我使用 Anaconda 包在本地运行 python 2 7 导入模块后 我编写的代码运行得非常快 似乎只是导入需要很长时间 例如 我使用以下代码运行了一个 tester py 文件 imp
  • Tkinter:消息小部件中锚点选项的正确值是多少?

    我一直在学习 tkinterTkinter 中的消息小部件 https python course eu tkinter message widget in tkinter php at Python 课程和教程 https python
  • Python 2 的 `exceptions` 模块在 Python3 中丢失了,它的内容到哪里去了?

    一位朋友提到 对于 Python 2 假设您在命令行上的路径环境变量中有它 pydoc exceptions 非常有用 知道它应该可以为他每周节省几分钟的网络查找时间 我自己每周都会用谷歌搜索一次例外层次结构 所以这对我来说也是一个有用的提

随机推荐

  • 简单的 TabView 在 iOS 16 中崩溃

    有一个奇怪的崩溃 只发生在 iOS 16 中 当我尝试创建一个TabView使用页面样式 当数组为空时它会崩溃 但它在 iOS 15 中运行得很好 这是 iOS 16 的错误吗 Xcode版本 版本 14 0 14A309 iOS版本 16
  • JavaScript 在点击时显示和隐藏元素

    请原谅我的无知 我不知道我在做什么 但我正在努力 我试图通过搜索来找出它 但它只在 jQuery 中产生了一个功能结果 由于这是一个很小的部分 我认为最好只使用普通的 JavaScript 而不是加载整个 jQuery 库 有谁知道我如何
  • 使用 git bash 运行 bash 脚本时出现“未找到自由命令”

    我想在 bash 脚本中显示服务器负载 磁盘空间 使用情况和内存使用情况 但当我尝试时 echo Memory usage memory usage free m awk NR 2 printf Memory Usage s sMB 2f
  • ios CoreBluetooth[警告]未知错误:1309

    运行我正在开发的蓝牙应用程序时 我偶尔会在控制台上收到消息 CoreBluetooth 警告 未知错误 1309 即使该消息指出这是警告 它也会停止应用程序的执行 我已经能够通过关闭蓝牙设置然后重新打开来解决此问题 谁能告诉我导致此问题的原
  • 如何使用实体框架自动包含所有底层导航属性

    场景 我想向数据库添加一个具有导航属性和that实体具有导航属性 等等 基本上 数据库中的表都是相互连接的 所有表都是相互连接的 我使用 EF4 3 和上下文 请求模式 所以我不想启用延迟加载 加载我需要的实体会花费太多时间 到目前为止 我
  • 我如何知道我正在使用什么 Windows 主题?

    我试图让我的应用程序强制成为一个主题 这很简单 如下所示 http arbel net blog archive 2006 11 03 Forcing WPF to use a specific Windows theme aspx htt
  • 如何完全禁用 Sitecore Analytics

    我们的生产服务器上遇到 CPU 问题 使用jetbrains cpu profiler进行分析后 我们注意到程序集中的一些函数Sitecore Analytics被处决 这有点奇怪 因为我们在配置文件中禁用了所有与分析相关的配置 调查之后
  • 如何将文章浮动在两列中?

    我有这个问题 我正在建立一个社交网站 我必须在两栏中创建帖子 父容器是一个部分 而元素 post 是具有 float left 样式的文章 我怎样才能让那些较短的帖子下面产生的空白空间消失 css目前还没有好的解决方案 这通常称为砖石布局或
  • 使用 npm 安装失败,json 响应无效

    我之前已经安装了 npm 但不知何故我不得不卸载它 现在 我尝试再次安装 npm 以使用此命令创建 React 应用程序 npx create react app ip tracker 安装到一半的时候发现这个错误 npm ERR code
  • 使用命令行查找 Windows 上给定日期之后修改的文件

    我需要使用命令行搜索磁盘上在给定日期之后修改的文件 例如 dir S B WHERE modified date gt 12 07 2013 The forfiles该命令无需借助 PowerShell 即可运行 文章在这里 根据修改时间查
  • 在 Java 中创建 InetAddress 对象

    我正在尝试转换由 IP 号码或名称指定的地址 两者都是字符串 即localhost or 127 0 0 1 转化为Inet地址目的 没有构造函数 而是返回一个静态方法Inet地址 因此 如果我获得主机名 这不是问题 但如果我获得 IP 号
  • 无法导入copy_reg

    我在 PythonAnyware 上托管我的 Web2py 应用程序 并且在导入 web2py 显然需要的 copy reg 时遇到问题 在以前的版本中这不是问题 回溯如下 回溯 最近一次调用最后一次 File home richdijk
  • 为什么我不能在 C++ 中的 `std::map` 中存储引用?

    我知道引用不是指针 而是对象的别名 但是 我仍然不明白这对我作为程序员到底意味着什么 即幕后的引用是什么 我认为理解这一点的最好方法是理解为什么我无法在地图中存储参考 我知道我需要停止将引用视为指针的语法糖 只是不知道如何 按照我的理解 引
  • 反序列化函数(字节数组到 uint32 )

    编写反序列化函数将字节数组转换为 32 位无符号整数的最佳方法是什么 typedef unsigned long uint32 uint32 deserialize uint32 unsigned char buffer uint32 va
  • 无法播放从 Android 应用程序发送的 Firebase 存储中的音频

    我正在使用 firebase 存储从我的 Android 应用程序上传音频 然后在我的应用程序中下载和播放 音频文件已上传 但当我从 firebase 存储播放它时 它采用如下图所示的视频格式 并且不播放音频 我还将其元数据设置为音频 mp
  • 产品和报价项目之间的概念区别是什么

    涉及班级 Mage Sales Model Quote Item and 法师 目录 型号 产品 我通过监听事件 在购物车添加上 得到了它们 我正在尝试从外部来源更新产品的数量信息 到目前为止 我的代码仅基于产品信息 我不确定这是否正确 报
  • 如何使用 pandas 计算所有列之间的相关性并删除高度相关的列?

    我有一个巨大的数据集 在机器学习建模之前 总是建议您首先应该删除高度相关的描述符 列 我如何计算列wice相关性并删除具有阈值的列 例如删除所有列或描述符具有 gt 0 8 的相关性 它还应该保留减少数据中的标题 示例数据集 GA PN P
  • Web API 2 OData = $format 不起作用:请求始终被忽略

    我有一个 Web API OData 项目 一切都运行良好 我现在尝试使用 format 参数返回 xml 而不是 JSON 而不是指定标头请求 但它不起作用 我尝试过这些方法 http localhost 3845 api Custome
  • Google Apps 脚本用于计算昨天收到的具有特定标签的电子邮件数量,然后将 # 每天保存到电子表格

    基本上就是标题所说的 但我想 1 自动计算我的 Gmail 帐户收到的带有特定标签的电子邮件数量 2 每天数一次 即使是零 3 每天向 Google 电子表格报告 4 所以我可以制作这样的月度报告 日期 日期 日期 10 月总计 平均每天
  • Python Tkinter - 恢复原始默认键绑定

    我正在 Win7 机器上使用 Python 2 7 和 Tkinter GUI 在某些情况下 我想完全覆盖 Tab 键的正常默认行为 但前提是存在某些条件 之后我想恢复到默认行为 请注意 目前我对 Tab 键感兴趣 但在某些时候我可能也需要