箭头键输入代码在 tkinter 中不起作用

2023-12-19

以下是我的简短脚本。当按住这些箭头键时,它的意思是从右向左和向上打印,但我不知道为什么它不起作用。

import Tkinter as tk

right = False
left = False
up = False

def keyPressed(event):
    if event.keysym == 'Escape':
        root.destroy()
    if event.keysym == 'Right':
        right = True
    if event.keysym == 'Left':
        left = True
    if event.keysym == 'Up':
        up = True

def keyReleased(event):
    if event.keysym == 'Right':
        right = False
    if event.keysym == 'Left':
        left = False
    if event.keysym == 'Up':
        up = False

def task():
    if right:
        print 'Right'
    if left:
        print 'Left'
    if up:
        print 'Forward'
    root.after(20,task)

root = tk.Tk()
print( "Press arrow key (Escape key to exit):" )

root.bind_all('<Key>', keyPressed)
root.bind_all('<KeyRelease>', keyReleased)
root.after(20,task)

root.withdraw()
root.mainloop()

当我开始使用时问题就开始了root.after().


在 python 中,函数创建一个新的作用域。如果在函数作用域内找不到变量,Python 会在外部(模块/文件)作用域中查找该变量。您可以通过赋值将变量添加到当前作用域中。这一切都意味着:

right = False
def func():
    right = True
func()
print (right)  #right is still False in the outer scope.

为了实际修改外部作用域中的变量,你需要告诉 python 你想要做类似的事情明确地:

right = False
def func():
    global right
    right = True
func()
print (right)

这可行,但不被认为是好的做法,因为您正在更改程序的状态。现在的价值right取决于您是否调用了一个有点令人不安的函数。

在函数调用之间共享数据的更好方法是使用class。然后,方法(绑定到类实例的函数)可以更改该单个实例的状态,但程序的其余部分可以继续运行,就像什么都没发生一样。

class Foo(object):
    def __init__(self):
        self.right = False
    def func(self):
        self.right = True

a = Foo() #calls __init__ implicitly
print(a.right)  #should be False -- We set this in __init__
a.func()  #change state of `a`
print(a.right)  #Now it's True!

这是代码的稍微“优雅”的版本:

import Tkinter as tk

class App(object):
    def __init__(self):
        self.right = False
        self.left = False
        self.up = False

    def keyPressed(self,event):
        print "HERE"
        if event.keysym == 'Escape':
            root.destroy()
        elif event.keysym == 'Right':
            self.right = True
        elif event.keysym == 'Left':
            self.left = True
        elif event.keysym == 'Up':
            self.up = True

    def keyReleased(self,event):
        if event.keysym == 'Right':
            self.right = False
        elif event.keysym == 'Left':
            self.left = False
        elif event.keysym == 'Up':
            self.up = False

    def task(self):
        if self.right:
            print 'Right'
        elif self.left:
            print 'Left'
        elif self.up:
            print 'Forward'
        root.after(20,self.task)

application = App()
root = tk.Tk()
print( "Press arrow key (Escape key to exit):" )

root.bind_all('<Key>', application.keyPressed)
root.bind_all('<KeyRelease>', application.keyReleased)
root.after(20,application.task)

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

箭头键输入代码在 tkinter 中不起作用 的相关文章

随机推荐

  • 重启后找不到npm命令

    The npm计算机重新启动后命令不断变得无法识别 bash npm command not found The node命令仍然可以正常工作 只是npm那是行不通的 我必须从主站点重新安装 Node js 才能使其再次运行 bin已添加到
  • 无法从模块获取包

    我正在尝试创建一个微服务应用程序 这取决于我的net包含一般错误的模块 因此我不必在所有模块中 复制 它们 问题是 由于某种原因 它能够找到该模块 但随后告诉我该模块没有包 net模块没有main go文件 因为它只是一组在其他项目中使用的
  • 接收 org.hibernate.TypeMismatchException 异常 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在使用 SpringMVC 开发一个带有 Spring 的应用程序 我遇到了以下错误 我不知道如何处理它 现在我在控
  • 更正应用程序的类路径,使其包含单个兼容版本的 oauth2.client.registration.ClientRegistrations

    我正在尝试在 Tomcat 服务器本地部署我的 Web 应用程序 它是非常简单的 Keycloak 身份验证应用程序 但即使删除此路径中的所有本地存储库 m2 repository org hibernate 我也会遇到以下错误然后我完成了
  • 如何在Python中拥有数组的数组

    我是 python 新手 但我擅长使用 vb net 进行编码 我试图将数值保存在锯齿状数组中 要在 vb net 中执行此操作 我将执行以下操作 Dim jag 3 as double For I 0 to 3 Redim jag i l
  • 获得 Matlab <-> C++ 接口的最佳方法 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • UIPoover 锁定背景视图

    我正在尝试复制 iPad 密码视图 它基本上是一个没有箭头方向的弹出窗口 它锁定背景视图 有点像模态视图控制器 我的问题 有没有办法在呈现弹出窗口时锁定底层背景视图 我的想法 我能想到的唯一真正的解决方案是将弹出窗口放置在模态视图控制器中
  • NextJS 头中的 HubSpot 表单脚本

    我正在尝试将以下脚本添加到我的 NextJS Head 中 然后它给了我两个错误 错误 1 意外的令牌 你的意思 or rbrace ts 1381 用于右括号 错误 2 语法错误 意外的标记 应为 对于 region na1 行 这是整个
  • 用于查找平均值的 REST 接口

    假设我想创建一个 REST 接口来查找数字列表的平均值 假设一次提交一个数字 你会怎么做 发布号码至https example com api average https example com api average 如果这是第一个数字
  • 将 pandas 中的 HH:MM 列转换为分钟

    我想将 hh mm 格式的数据集中的列转换为分钟 我尝试了以下代码 但它显示 AttributeError Series 对象没有属性 split 数据采用以下格式 我在数据集中也有 nan 值 计划是计算值的中位数 然后用中位数填充具有
  • 在 ArrayFormula 中组合文本

    我有一张使用 Google 表格的表格 它具有三列 这些列始终具有空值或该列的特定值 每行将有一个 两个或三个值 它永远不会在一行上有三个空值 在第四列中 我想要一个 ArrayFormula 来组合这些值 并在有多个值时用逗号分隔这些值
  • 确保 pandas MultiIndex 中的字典顺序

    我得到了一些带有 MultiIndex 的数据 一些计时统计数据 其中包含 设备 构建配置 测试功能 等的索引级别 我想切掉其中一些索引列 看来 loc 函数的 切片器 可能是可行的方法 但是 那docs http pandas pydat
  • 如何使用 docker run 中传递的动态值通过 Dockerfile 创建属性文件?

    我对 Docker 还比较陌生 也许这是一个愚蠢的问题 我的目标是创建一个具有system properties文件 顾名思义 是一个带有键值对的属性文件 我想填写这个文件中的值动态地 所以我认为这些值需要作为环境变量传递给 Docker
  • 迭代按键排序的字典中的键/值对

    我有以下代码 它只打印字典中的键 值对 这些对按键排序 for word count in sorted count words filename items print word count 然而 调用iteritems 代替items
  • IntelliJ IDEA“自动构建项目”显然不起作用

    我是 Java Eclipse 的长期用户 并且习惯于在我引起编译错误和警告时立即在 问题 视图中看到这些错误和警告 现在我正在使用 IntelliJ IDEA Kotlin 和 Java 有一个 问题 视图 但即使代码窗口的边缘显示错误或
  • 无法在 Spring Boot 中使用 java.util.Duration 作为 @Value 配置

    我们无法在 Spring Boot 中使用 java util Duration 作为 Value 配置 此处展示此问题的示例项目 https github com costimuraru spring boot sample https
  • 为什么当 DataGrid 更改时我的 ViewModel 中的属性没有更新?

    我正在尝试创建一个 UserControl 它可以让我编辑类型的字典Dictionary
  • 是否可以使用 CRC 进行基本的纠错?

    我知道使用 CRC 的全部目的是进行错误检测 但我听到有人说它除了错误检测之外还可以用于进行基本的错误纠正 我很好奇是否是这样 如果是的话 它的威力有多大 我的意思是 我们通常将 CRC 称为能够执行 x 位检测 但我很好奇它是否能够执行
  • Java中如何从域名获取IP地址?

    我正在编写一个需要 IP 地址的应用程序 我有一个域名 我想知道如何从中获取 IP 地址 例如 www girionjava com 如何通过Java编程获取该网站的IP地址 谢谢 InetAddress giriAddress java
  • 箭头键输入代码在 tkinter 中不起作用

    以下是我的简短脚本 当按住这些箭头键时 它的意思是从右向左和向上打印 但我不知道为什么它不起作用 import Tkinter as tk right False left False up False def keyPressed eve