为什么 Tkinter 中的这个形状更新缓慢?

2024-02-28

尝试在 tkinter 中进行简单的移动:

import tkinter as tk

class GameApp(object):
    """
    An object for the game window.

    Attributes:
        master: Main window tied to the application
        canvas: The canvas of this window
    """

    def __init__(self, master):
        """
        Initialize the window and canvas of the game.
        """

        self.master = master
        self.master.title = "Game"
        self.master.geometry('{}x{}'.format(500, 500))

        self.canvas = tk.Canvas(self.master)
        self.canvas.pack(side="top", fill="both", expand=True)

        self.start_game()

    #----------------------------------------------#


    def start_game(self):
        """
        Actual loading of the game.
        """

        player = Player(self)

    #----------------------------------------------#

#----------------------------------------------#


class Player(object):
    """
    The player of the game.

    Attributes:
        color: color of sprite (string)
        dimensions: dimensions of the sprite (array)
        canvas: the canvas of this sprite (object)
        window: the actual game window object (object)
        momentum: how fast the object is moving (array)
    """


    def __init__(self, window):

        self.color = ""
        self.dimensions = [225, 225, 275, 275]
        self.window = window
        self.properties()

    #----------------------------------------------#

    def properties(self):
        """
        Establish the properties of the player.
        """

        self.color = "blue"
        self.momentum = [5, 0]

        self.draw()
        self.mom_calc()

    #----------------------------------------------#

    def draw(self):
        """
        Draw the sprite.
        """

        self.sprite = self.window.canvas.create_rectangle(*self.dimensions, fill=self.color, outline=self.color)

    #----------------------------------------------#


    def mom_calc(self):
        """
        Calculate the actual momentum of the thing
        """

        self.window.canvas.move(self.sprite, *self.momentum)
        self.window.master.after(2, self.mom_calc)

    #----------------------------------------------#

#----------------------------------------------#


root = tk.Tk()

game_window = GameApp(root)

Where self.momentum是一个包含 2 个整数的数组:一个用于 x 运动,另一个用于 y 运动。然而,矩形的实际移动速度非常慢(大约每秒 5 次移动),self.window.master.after()时间似乎没有影响。

之前在另一个 tkinter 项目中,我已经成功地获得了真正响应式的 tkinter 运动,所以我只是想知道是否有一种方法可以在这种情况下最大限度地减少运动更新时间,通过使用不同风格的 OOP,或者只是不同的代码共。

更新:结果是时间.after()方法确实很重要,并且它实际上叠加到方法的实时上。使用后timeit调用该方法时,我得到以下输出:

>>> print(timeit.timeit("(self.window.master.after(2, self.mom_calc))", number=10000, globals={"self":self}))
0.5395521819053108

所以我想真正的问题是:为什么会这样.after()方法需要这么长时间?

更新 2:在多台计算机上进行测试,在任何平台上移动仍然很慢。


“默认的 Windows 计时器分辨率约为 15 毫秒。尝试每 1 毫秒触发一次计时器不太可能按照您想要的方式工作,对于游戏来说可能完全没有必要(运行 60FPS 的显示器仅每约 16 毫秒更新一次)。请参阅为什么 .NET 计时器的分辨率限制为 15 毫秒? https://stackoverflow.com/questions/3744032/why-are-net-timers-limited-to-15-ms-resolution"

找到了解决方案Python - tkinter 调用 after 太慢 https://stackoverflow.com/questions/23999478/python-tkinter-call-to-after-is-too-slow安德鲁·梅迪科(Andrew Medico)给出了很好的答案(在评论中)。

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

为什么 Tkinter 中的这个形状更新缓慢? 的相关文章

随机推荐

  • 运行时:无法创建新的操作系统线程

    在54核机器上 我使用os Exec 生成数百个客户端进程 并使用大量的 goroutine 来管理它们 有时 但并非总是 我会得到这样的信息 runtime failed to create new OS thread have 1306
  • 给定一个不带空格的短语,添加空格以构成正确的句子

    这就是我的想法 但它是 O n 2 例如 输入是 Thisisawesome 我们需要检查添加当前字符是否会使旧的搜索结果变得更长且有意义 但为了看到我们需要备份的地方 我们必须一直遍历到起点 例如 awe 和 some 是合适的词 但 a
  • ReferenceError:WScript 未定义

    我希望使用 Javascript 执行以下操作 这是我的完整 JS 文件 test js var xo WScript CreateObject Msxml2 XMLHTTP var xa WScript CreateObject ADOD
  • 我如何根据键值将 python dict 排序到嵌套列表

    我有一个嵌套字典 d records name abhi age 23 dept cse name anu age 20 dept ece name ammu age 25 dept cse name anju age 26 dept ec
  • MySQL 对索引 TIMESTAMP 列使用文件排序

    我有一个拒绝使用索引的表 它总是使用文件排序 该表是 CREATE TABLE article ID int 11 NOT NULL AUTO INCREMENT Category ID int 11 DEFAULT NULL Subcat
  • Node.js:req.params 与 req.body

    我一直在将几个不同教程中的代码拼凑在一起 使用 Node express Angular 和 mongodb 使用 MEAN 堆栈构建一个基本的待办事项应用程序 一篇教程介绍了为 GET POST 和 DELETE 操作创建 api 但忽略
  • 如何使用 PhpWord 读取 Doc 文件?

    最近我下载了从github下载的php word 但我不知道如何通过这个读取word文件 该库中没有任何帮助 我看到一个与 php excel b 相同的文件 但不知道如何使用 以下文件 simple01 example php
  • Keras:具有多个参数的 Lambda 层函数

    我正在尝试写一个LambdaKeras 中调用函数的层connection 运行一个循环for i in range 0 k where k作为函数的输入 connection x k 现在 当我尝试调用功能 API 中的函数时 我尝试使用
  • 在 javascript 中创建可调整大小/可拖动/旋转视图

    我一直在尝试用 Javascript 创建这样的东西 正如您所看到的 容器可以被拖动 旋转和调整大小 大多数事情都工作正常 但是旋转容器时调整容器大小会产生奇怪的输出 我预计这会发生 相反 我得到这个 这是完整的代码 https jsfid
  • Swift 3 错误:“另请参阅”标注未显示

    我刚刚将我的项目迁移到 Swift 3 发现快速帮助中的 另请参阅 标注没有显示 在 Swift 的早期版本中 一切都运行得很好 下面是我的代码 Adds a See also callout in the Quick Help for a
  • 无表单方法的 POST (PHP)

    有没有什么方法可以使用 POST 方法而不使用表单将内容从一个页面传递到另一个页面 就像在 get 中一样 你可以只附加一个 与您想发送的任何内容一起 你能为帖子做点什么吗 我还阅读了另一篇文章 其中提到要使用会话 但会话会以 cookie
  • UITableView 使用 UIRefreshControl 拖动距离

    我在 UITableView 上实现 UIRefreshControl 时遇到一些麻烦 一切工作正常 除了我必须滚动屏幕的 80 之类的内容才能触发 UIRefreshControl 有时我什至无法触发它 因为屏幕底部有一个选项卡栏 当手指
  • window.location.assign(“链接”),不起作用

    这是 JavaScript 代码
  • 如何使用 htaccess 分割 URL

    例如 google com en game game1 html应该google com index php p1 en p2 game p3 game1 html 我怎样才能分割URL并发送index php 部分 仅当查询参数具有固定长
  • :host-context 在 Lit-Element Web 组件中未按预期工作

    我有两个 Lit element Web 组件 一个是units list 其中包含许多units list item元素 这units list item元素有两种不同的显示模式 紧凑和详细 由于列表元素支持无限滚动 因此可能包含数千个单
  • 如何提取div标签中的强元素

    我是网络抓取新手 我正在使用 Python 来抓取数据 有人可以帮助我如何从以下位置提取数据 div class dept strong LENGTH strong 15 credits div 我的输出应该是 LENGTH 15 cred
  • 添加数据后保存并关闭 Excel 文件吗?

    我正在尝试打开现有的 Excel 2013 文件 添加数据 然后保存它 相同名称 然后关闭它 然后关闭 Excel 该代码将打开文件 选择正确的工作表并写入数据 但是当我尝试保存它时 出现属性错误 我错过了图书馆或其他什么吗 这是代码 im
  • 我们如何在 Perl 中将 UUID 转换为日期

    我对 Perl 语言很陌生 如何转换UUID迄今为止的格式2011 04 22 例如 我有这样的UUID 118ffe80 466b 11e1 b5a5 5732cf729524 如何将其转换为日期格式 该模块UUID 小 https me
  • Angular 7 构建:如何删除输出哈希和默认 ~~ 文件?

    我使用以下方法构建了角度应用程序 ng build prod named chunks output hashing none 它输出module A js module B js正如预期的那样 但有一些文件 例如default
  • 为什么 Tkinter 中的这个形状更新缓慢?

    尝试在 tkinter 中进行简单的移动 import tkinter as tk class GameApp object An object for the game window Attributes master Main wind