为什么 tkinter 的 after() 函数会冻结我的窗口?

2024-02-14

我正在使用创建 dodger 的副本tkinter。我面临着计时对象移动的问题。有人告诉我时间模块不能很好地工作tkinter,因此我应该使用after()反而。但是,我面临着同样的问题after()功能就像我对时间模块所做的那样。这是我的代码:

from tkinter import *
from random import randint


class Window(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)

        self.master = master
        self.initWindow()

    def initWindow(self):
        self.master.title('Dodger')
        self.pack(fill=BOTH, expand=1)
        self.master.geometry('600x800')
        self.master.config(bg='black')

        menu = Menu(self.master)
        self.master.config(menu=menu)

        def clientExit():
            exit()

        file = Menu(menu)
        file.add_command(label='Exit', command=clientExit)
        file.add_command(label='Start', command=self.game)

        menu.add_cascade(label='File', menu=file)

    def game(self):
        canvas = Canvas(self.master, width='600', height='800', borderwidth='0', highlightthickness='0')
        canvas.pack()
        canvas.create_rectangle(0, 0, 600, 800, fill='black', outline='black')

        character = canvas.create_rectangle(270, 730, 330, 760, fill='magenta', outline='cyan', width='2')

        def left(event):
            cord = canvas.coords(character)
            if cord[0] <= 5:
                pass
            else:
                canvas.move(character, -10, 0)

        def right(event):
            cord = canvas.coords(character)
            if cord[2] >= 595:
                pass
            else:
                canvas.move(character, 10, 0)

        self.master.bind('<Left>', left)
        self.master.bind('<Right>', right)

        class variables:
            sizeMin = 10
            sizeMax = 80

            y = 10
            minX = 5
            maxX = 545

        def createShape():
            size = randint(variables.sizeMin, variables.sizeMax)

            x = randint(variables.minX, variables.maxX)
            topLeft = [x, variables.y]
            bottomRight = [x + size, variables.y + size]

            shape = canvas.create_rectangle(topLeft[0], topLeft[1], bottomRight[0], bottomRight[1],
                                            fill='red', outline='red')
            return shape

        def moveShape(shape):
            canvas.move(shape, 0, 800)

        for x in range(5):
            x = createShape()
            self.master.after(1000, moveShape(x))


root = Tk()
app = Window(root)
app.mainloop()

正如您所看到的,在游戏实例的底部,我创建了一个正方形,并将其以 1 秒的间隔向下移动了五次。然而,这并没有奏效;我的窗口只是在指定的时间内冻结,然后又恢复了。我不确定这是因为我的电脑很糟糕还是我做错了什么。请在编辑器中运行我的代码,如果我做错了什么,请向我解释。


它冻结的原因是因为你正在打电话after wrong.

考虑这段代码:

self.master.after(1000, moveShape(x))

...它与此代码完全相同:

result = moveShape(x)
self.master.after(1000, result)

...与此相同,因为moveShape回报None:

result  = moveShape(x)
self.master.after(1000, None)

...与此相同:

result = moveShape(x)
self.master.after(1000)

...这与

result = moveShape(x)
time.sleep(1)

换句话说,你告诉它睡觉,它就会睡觉。

after需要一个callable, or a 参考到一个函数。您可以将其他参数作为参数传递给 after 。所以正确的调用方法是这样的:

self.master.after(1000, moveShape, x)

不过,我怀疑这正是您想要的,因为所有五次迭代都会尝试在循环开始后 1000 毫秒运行代码,而不是间隔 1000 毫秒。这只是应用一点数学的简单问题。

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

为什么 tkinter 的 after() 函数会冻结我的窗口? 的相关文章

  • 将 pandas 数据框中的列减去其第一个值

    我需要将 pandas 数据帧的一列中的所有元素减去其第一个值 在这段代码中 pandas 抱怨 self inferred type 我猜这是循环引用 df Time df Time df Time 0 在这段代码中 pandas 抱怨为
  • 替换字符串列表中的 \x00 的最佳方法?

    我有一个来自已解析 PE 文件的值列表 其中包括 x00每个部分末尾的空字节 我希望能够删除 x00字符串中的字节而不删除所有字节 x 文件中的 s 我试过做 replace and re sub 但并没有取得太大成功 使用Python 2
  • 如何更改充当按钮的范围的文本

    我正在为自定义 Web 应用程序编写自动化测试 我遇到了无法更改跨度文本的问题 我尝试过使用 driver execute script 但没有运气 如果我更好地了解 javascript 这确实会有帮助 据我所知 您无法单击跨度 并且列表
  • 用 Python 编写一个无操作或虚拟类

    假设我有这样的代码 foo fooFactory create 由于种种原因 fooFactory create 可能无法创建实例Foo 如果可以的话我想要fooFactory create 返回一个虚拟 无操作对象 这个对象应该是完全惰性
  • 如何用 python 和 sympy 解决多元不等式?

    我对使用 python 和 Sympy 还很陌生 并且遇到了使用 sympy 解决多元不等式的问题 假设我的文件中有很多函数 如下所示 cst sqrt x 2 cst exp sqrt cst x 1 4 log log sqrt cst
  • 使用正则表达式解析 Snort 警报文件

    我正在尝试使用 Python 中的正则表达式从 snort 警报文件中解析出源 目标 IP 和端口 和时间戳 示例如下 03 09 14 10 43 323717 1 2008015 9 ET MALWARE User Agent Win9
  • Python:当前目录是否自动包含在路径中?

    Python 3 4 通过阅读其他一些 SO 问题 似乎如果moduleName py文件位于当前目录之外 如果要导入它 必须将其添加到路径中sys path insert 0 path to application app folder
  • python ttk treeview:如何选择并设置焦点在一行上?

    我有一个 ttk Treeview 小部件 其中包含一些数据行 如何设置焦点并选择 突出显示 指定项目 tree focus set 什么也没做 tree selection set 0 抱怨 尽管小部件明显填充了超过零个项目 但未找到项目
  • python中函数变量的作用域

    假设我们有两个函数 def ftpConnect ftp FTP server ftp login ftp cwd path def getFileList ftpConnect files ftp nlst print files 如果我
  • 如何在 Windows 上使用 Python 3.6 来安装 Python 2.7

    我想问一下如何使用pip install对于 Python 2 7 当我之前安装并使用 Python 3 6 时 我现在必须使用 Windows 上的 Python 版本 pip install 继续安装 Python 3 6 我需要使用以
  • urllib2.urlopen() 是否实际获取页面?

    当我使用 urllib2 urlopen 时 我在考虑它只是为了读取标题还是实际上带回整个网页 IE 是否真的通过 urlopen 调用或 read 调用获取 HTML 页面 handle urllib2 urlopen url html
  • Python Flask 是否定义了路由顺序?

    在我看来 我的设置类似于以下内容 app route test def test app route
  • 使用 lambda 函数更改属性值

    我可以使用 lambda 函数循环遍历类对象列表并更改属性值 对于所有对象或满足特定条件的对象 吗 class Student object def init self name age self name name self age ag
  • 是否可以写一个负的python类型注释

    这可能听起来不合理 但现在我需要否定类型注释 我的意思是这样的 an int Not Iterable a string Iterable 这是因为我为一个函数编写了一个重载 而 mypy 不理解我 我的功能看起来像这样 overload
  • Scrapy 蜘蛛无法工作

    由于到目前为止没有任何效果 我开始了一个新项目 python scrapy ctl py startproject Nu 我完全按照教程操作 创建了文件夹和一个新的蜘蛛 from scrapy contrib spiders import
  • asyncio - 多次等待协程(周期性任务)

    我正在尝试为异步事件循环创建定期任务 如下所示 但是我收到 RuntimeError 无法重用已等待的协程 异常 显然 asyncio 不允许等待相同的可等待函数 如中讨论的这个错误线程 https bugs python org issu
  • 如何在单独的文件中使用 FastAPI Depends 作为端点/路由?

    我在单独的文件中定义了一个 Websocket 端点 例如 from starlette endpoints import WebSocketEndpoint from connection service import Connectio
  • 如何对字符串列表进行排序?

    在 Python 中创建按字母顺序排序的列表的最佳方法是什么 基本回答 mylist b C A mylist sort 这会修改您的原始列表 即就地排序 要获取列表的排序副本而不更改原始列表 请使用sorted http docs pyt
  • 使用“pythonw”(而不是“python”)运行应用程序时找不到模块

    我尝试了这个最小的例子 from flask import Flask app Flask name app route def hello world return Hello World if name main app run deb
  • 如何使用 Django (Python) 登录表单?

    我在 Django 中构建了一个登录表单 现在我遇到了路由问题 当我选择登录按钮时 表单不会发送正确的遮阳篷 我认为前端的表单无法从 查看 py 文件 所以它不会发送任何 awnser 并且登录过程无法工作 该表单是一个简单的静态 html

随机推荐

  • 在没有 C 运行时的情况下使用 64 位整数 - 链接错误 __alldiv

    我正在尝试在不使用 C 运行时 msvcrt 或 libcmt 的情况下构建 Windows 控制台应用程序 也就是说 仅链接 kernel32 lib 并使用 WIN32 API 中的控制台函数而不是 printf 等 我的问题是 在链接
  • 如何设置 ACL 以允许每个人列出 REST API 中的所有用户

    我尝试使用 REST API 列出我的 Loopback 2 0 应用程序中的所有用户 但收到以下错误 error name Error status 401 message Authorization Required statusCod
  • 是否可以在 Ruby 中执行 before_action(就像在 Rails 中一样)?

    是否可以致电before action在某些指定的方法之前 比如在 Rails 中 class Calculator before action raise Exception calculator is empty if numbers
  • 在 ubuntu 18.04 中卸载 php 7

    我有一台服务器 其中有一个使用 PHP 5 6 运行的应用程序 但我将服务器从 Ubuntu 14 04 升级到 18 04 在此过程中我还将 PHP 升级到 7 2 现在我正在尝试卸载它 但我发现很难 我已经运行命令 sudo apt g
  • 使用外部数据的 D3 条形图

    我使用 d3 js v4 制作了一个条形图 我尝试使用外部数据文件 tsv 文件 它给出了以下错误 错误 属性高度 预期长度 NaN 匿名 d3 min js 2 o d3 min js 2 yn d3 min js 2 mn d3 min
  • listview 没有在带有 viewpager 选项卡的片段中刷新

    我遇到了在 viewpager 样式选项卡内使用 listview 和片段的问题 该选项卡在 github 上的 jakewharton s Android ViewPagerIndicator 示例中给出 我对三个选项卡使用相同的库 每个
  • 我什么时候应该在 WPF 中使用依赖属性?

    我什么时候应该在 WPF 中使用依赖属性 它们是静态的 因此与使用 NET 属性相比 我们可以节省大量内存 相对于 NET 属性使用依赖属性的其他好处包括 1 无需检查线程访问 2 提示渲染包含元素 ETC 所以看来我应该始终在使用 WPF
  • OpenCL clBuildProgram 缓存源代码,如果 #include 源代码发生更改,则不会重新编译

    我用opencl实现了一个项目 我有一个包含内核函数的文件 内核使用的函数包含在单独的头文件中 但是当我更改包含的文件时 有时会应用更改 有时则不会 这让我很困惑应用程序是否有错误 我检查了 stackoverflow 中的其他帖子 发现
  • 虚假 Ajax 请求

    为了检查ajax请求的提交情况 当用户提交表单时 我使用jasmine 1 实现了以下测试 测试已成功通过 但查看 javascript 控制台时出现以下错误500 Internal Server Error 由于我不关心服务器响应 所以我
  • 以集群模式在同一物理节点上运行 Storm nimbus 和supervisor

    我现在有一个包含 2 个物理节点的 Storm 集群 我在跑storm nimbus在节点 1 上和storm supervisor在节点 2 上 看起来我的所有拓扑都仅在节点 2 管理节点 上运行 我也应该在节点 1 上运行主管吗 Tha
  • 如何使用 for_each 删除 STL 映射中的每个值?

    假设我有一个 STL 映射 其中的值是指针 并且我想将它们全部删除 我如何表示以下代码 但使用 std for each 我很高兴找到使用 Boost 的解决方案 for stdext hash map
  • 管理器中缺少应用程序图标

    我最近迁移了我的应用程序以支持 iOS7 并在此过程中更新了我的应用程序图标以使用资产目录 这一切在应用程序中都运行良好 但是 在 Organizer 和 TestFlight 中 我的应用程序图标丢失了 同样的情况也发生在 TestFli
  • Google Maps API v3 向每个标记添加信息窗口

    注意 我使用的是 Google Maps API v3 我正在尝试为我在地图上放置的每个标记添加一个信息窗口 目前我正在使用以下代码执行此操作 for var i in tracks racer id data points values
  • 从 SJSIR “手动”构建 JS

    我需要在运行时从 sjsir 文件构建一个 js 文件来实现插件系统 这样就无法在编译时与我的其余编译一起完成 我曾经在 0 6 3 中使用以下代码实现相同的过程 但它似乎已被弃用 您建议使用什么算法来实现与 0 6 13 相同的操作 谢谢
  • 更改博客主题(blogdown+netlify)

    我按照 Yihui 的教程并使用创建了一个网站blowdown github and netlify 现在 我想更改我的网站的主题 问题是我有几篇文章产生了很多情节 因此 当我在本地创建一个新网站并添加我的帖子时 git push失败 我怀
  • Xcode 12 Beta - 找不到模拟器运行时

    我已经安装了 Xcode 12 beta 2 我尝试通过 Mac OS Catalina 上的 Jenkins 运行我们的 xamarin 项目 它失败并出现以下错误 当我从 Mac Visual studio 构建相同的项目时 它成功了
  • 有没有办法在网页开发中使用加色混合?

    我有一个可以使用的网页设计加法混色 http en wikipedia org wiki Additive color 想要的效果是 红色方块覆盖绿色方块 重叠区域呈现黄色 有没有什么好方法可以使用标准工具 CSS CSS 透明度 不透明度
  • 内联块+最小/最大宽度行为

    我在许多浏览器 FF Opera Ie 中看到我给它们的元素 内联块 和 最小 最大宽度 它们的宽度自动设置为 最小宽度 而不是最大宽度 如预期的那样 这是正常行为吗 我可以用CSS方式解决它 具有最大宽度的内联块元素 吗 我了解 floa
  • 快速输入输出功能

    define getcx getchar unlocked inline void inp int n fast input function n 0 int ch getcx int sign 1 while ch lt 0 ch gt
  • 为什么 tkinter 的 after() 函数会冻结我的窗口?

    我正在使用创建 dodger 的副本tkinter 我面临着计时对象移动的问题 有人告诉我时间模块不能很好地工作tkinter 因此我应该使用after 反而 但是 我面临着同样的问题after 功能就像我对时间模块所做的那样 这是我的代码