Python Tkinter 刷新画布

2024-03-27

你好,我在 python 中有一个元组,其颜色与通过以下字典在画布中绘制的正方形相关:

colour_mapping = {0: "red", 1: "green", 2: "blue" , 3:"purple"}

更具体地说,例如元组中的节点是:

((2, 3), (3, 3))

这意味着 4 个正方形应该这样绘制:

blue square    purple square
purple square     purple square

然后它们的颜色应该相应地更改为我的元组中的下一个节点

为此,我迭代元组,并为每个元素在画布上绘制一个新矩形,然后调用time.sleep()功能,以便让用户有时间查看与之前状态的差异。 我的问题是只有最后一个节点被正确渲染,而所有其他节点都没有显示。你能帮助我吗?

到目前为止,这是我的代码:

self.parent.title("AlienTiles")
self.style = Style()
self.style.theme_use("default")

self.frame =  Frame(self, relief=RAISED, borderwidth=1)
self.frame.pack(fill=BOTH, expand=1)

self.canvas = Canvas(self.frame)
self.canvas.pack(fill=BOTH, expand=1)

self.pack(fill=BOTH, expand=1)


for i in range(len(path)) : #the tuple is path

            state = path[i].state
            print state
            time.sleep(1)
            y_offset=10
            for x in state:
                start_x=40
                start_y=10
                i=1
                x_offset=0

                for y in x:

                    x0=(start_x*i)+x_offset
                    y0=(start_y*i)+y_offset
                    x1=x0+size
                    y1=y0+size
                    colour=colour_mapping[y]

                    print colour

                    self.canvas.create_rectangle(x0, y0, x1, y1, fill=colour)
                    x_offset=x_offset+size+10


                y_offset=y_offset+size+10

总而言之,我尝试制作如上所述的动画。有什么我认为不正确的东西或者在每次循环时刷新画布的东西吗?


画布刷新的唯一方法是让事件循环为“重绘”事件提供服务。在您的循环中,您永远不会给事件循环更新的机会,因此您看不到任何更改。

快速解决方法是致电self.canvas.update_idletasks,但这只是一个 hack,而不是一个正确的解决方案。

制作动画的正确方法是使用事件循环来进行迭代。您可以通过将要完成的工作放入队列(在本例中为空闲事件队列)来完成此操作。您可以使用以下命令将内容放入此队列中after命令。

您应该做的是编写一个函数来执行动画的一次迭代。本质上,将 while 循环中的所有内容移至函数中。然后,只要有工作要做,就安排不断调用该函数。您可以拨打电话至after在该函数中,或者有一个单独的函数来控制动画。

粗略地说,解决方案如下所示:

def do_one_frame(self, ...):
    # do whatever you need to draw one frame

    if (there_is_more_work_to_be_done):
        self.after(10, do_one_frame)

这将绘制动画的一帧,检查是否有要绘制的新帧,然后安排在 10 毫秒内绘制下一帧。当然,您可以将该值设置为您想要的任何值,以控制动画的速度。

该网站上有该技术的工作示例。例如,参见https://stackoverflow.com/a/25431690/7432 https://stackoverflow.com/a/25431690/7432

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

Python Tkinter 刷新画布 的相关文章

  • 处理连接重置错误

    我有一个关于在 Python3 中处理 ConnectionResetError 的问题 当我使用 urllib request Request 函数时 通常会发生这种情况 我想知道如果我们遇到这样的错误是否可以重做请求 例如 def ge
  • 以编程方式设置 mosquitto 中的访问控制限制

    我正在开发一个将使用 mqtt 的应用程序 我将使用 python 库 我一直倾向于使用 mosquitto 但找不到以编程方式为其设置访问控制限制的方法 我正在编写的应用程序需要能够区分用户 并且只允许他们订阅某些主题 当前的解决方案看起
  • 如何让电脑看起来像是在打字? [复制]

    这个问题在这里已经有答案了 我希望它看起来像是计算机正在尝试向用户输入信息 我尝试了一些代码 但是当我运行它时 它只是一次打印所有内容 即使我一次打印 1 个 A Random sentence for x in A time sleep
  • 自定义 pytest junitxml 失败报告

    我正在尝试内省测试失败并将附加数据包含到 junit xml 测试报告中 具体来说 这是对外部产品的一套功能测试 我想将产品的日志包含到故障报告中 使用找到的方法here https stackoverflow com questions
  • 如何根据本地目录中的requirements.txt 文件使用pip 安装软件包?

    问题是这样的 我有一个要求 txt文件看起来像 BeautifulSoup 3 2 0 Django 1 3 Fabric 1 2 0 Jinja2 2 5 5 PyYAML 3 09 Pygments 1 4 SQLAlchemy 0 7
  • 为什么playsound函数无法在python中播放我的mp3文件

    所以基本上我试图创建一个音乐播放程序 可以在您要求时播放音乐 我只是想让歌曲播放部分实际工作 所以我编写了一个超级简单的代码来测试它 import playsound playsound sample mp3 This was done i
  • 将 Fabric env.hosts 字符串作为变量传递在函数中不起作用

    将 Fabric env hosts 字符串作为变量传递在函数中不起作用 demo py usr bin env python from fabric api import env run def deploy hosts command
  • PyCharm 虚拟环境和 Anaconda 环境有什么区别?

    当我在 PyCharm 中创建新项目时 它会创建一个新的虚拟环境 我读到 当我执行Python脚本时 它们是使用此环境中的解释器而不是系统环境来执行的 因此 如果我需要安装一些软件包 我只能将它们安装在这个环境中 而不是在系统环境中 这很酷
  • 将文件添加到现有 zip 文件

    我正在使用 python 的zipfile module zip 文件位于以下路径 home user a b c test zip并在下面创建另一个文件 home user a b c 1 txt我想将此文件添加到现有的 zip 中 我这
  • buildozer android NDK 未下载 Ubuntu

    我使用的是 Ubuntu 16 04 LTS 操作系统 我已经在 python2 和 python3 中安装了 buildozer android sdk 已安装 但 buildozer 在下载 android NDK 时显示错误 请帮我解
  • GitPython 并向 Git 对象发送命令

    GitPython http gitorious org git python是一种从 python 与 git 交互的方式 我正在尝试访问基本的 git 命令 例如git commit m message 从此模块中 根据this htt
  • 在 Python 中通过 TCP 套接字发送文件

    我已经成功地将文件内容 图像 复制到新文件 然而 当我通过 TCP 套接字尝试同样的事情时 我遇到了问题 服务器循环未退出 客户端循环在到达 EOF 时退出 但服务器无法识别 EOF 这是代码 Server import socket Im
  • Python 中函数未定义错误

    我试图在 python 中定义一个基本函数 但当我运行一个简单的测试程序时 我总是收到以下错误 gt gt gt pyth test 1 2 Traceback most recent call last File
  • 如何复制 tf.keras.models.Model 子类?

    我需要复制 keras 模型 但我无法知道可以做什么 除非该模型is not a tf keras models Model 子类 Note 使用copy deepcopy 将在没有任何错误的情况下工作 但是每当使用副本时都会导致另一个错误
  • 无需重新计算即可获取字典键哈希

    有没有办法从字典中提取现有的密钥哈希 而无需再次重新计算它们 暴露它们并因此通过哈希而不是密钥访问字典会有什么风险 我认为 Python 的字典对象没有任何公共 API 可以让您查看存储其对象的哈希值 您无法在 Python 代码中直接通过
  • 计算具有不均匀间隔点的 3D 梯度

    我目前有一个由几百万个不均匀间隔的粒子组成的体积 每个粒子都有一个属性 对于那些好奇的人来说是潜力 我想计算其局部力 加速度 np gradient 仅适用于均匀分布的数据 我在这里查看 numpy 中的二阶梯度 https stackov
  • 在 Mac OS X 中安装 Avro

    我正在查看 Avro RPC for Python 网址为https github com phunt avro rpc quickstart python https github com phunt avro rpc quickstar
  • 加载所有腌制对象[重复]

    这个问题在这里已经有答案了 import pickle ListNames Name1 City1 Email1 Name2 City2 Number2 ListNumbers 1 2 3 4 5 6 7 8 with open TestP
  • 如何将 python 包安装到 Google Dataflow 并将其导入到我的管道中?

    我的文件夹结构如下 Project Pipeline py setup py dist ResumeParserDependencies 0 1 tar gz Dependencies Module1 py Module2 py Modul
  • 将行追加到 Pandas DataFrame 添加 0 列

    我正在创建一个 Pandas DataFrame 来存储数据 不幸的是 我无法提前知道我将拥有的数据行数 所以我的方法如下 首先 我声明一个空的 DataFrame df DataFrame columns col1 col2 然后 我附加

随机推荐

  • 何时使用 RabbitMQ 铲子以及何时使用 Federation 插件?

    对于我工作的公司 我们希望使用 RabbitMQ 作为我们的主要消息总线 我们的想法是 每个应用程序都使用自己的虚拟主机进行内部通信 并且通过 shovel 或联合插件 我们可以在多个虚拟主机 甚至可能是多台机器 非集群 之间共享某些类型的
  • Android 中的图像数组

    我正在尝试使用图像数组 然后将 ImageView 设置为数组中的图像之一 我的第一反应是使用带有图像名称的字符串数组 但这不起作用 我该如何做到这一点 制作一个可绘制数组 其中图像名称不带引号或什么 取决于你的图像在哪里 但如果 R dr
  • 如何使用 SSIS 包中的变量值加载新表?

    我在 SSIS 包 Var1 和 Var2 中有两个变量 这两个变量都有值 有什么方法可以将这两个变量的值放入新表中吗 例如 在新表 col1 中 其值为 Var1 col2 的值为 Var2 Thanks 有几种方法可以做到这一点 一种是
  • 即使使用复制本地,也无法加载文件或程序集“Microsoft.SqlServer.Types”

    我的网络应用程序有一份内部报告 当我在本地浏览该报告时 该报告会按预期显示 我正在使用一个rdlc and xsd有标准的apsx用于呈现报告的网页 我现在已部署到我的临时服务器 当我尝试浏览显示我收到的报告的页面时 An unexpect
  • 如何在 PDO fetchAll 中正确使用 while 循环

    请对我宽容一些 我刚刚开始学习 PDO 并且仍在寻找如何将 mysqli 转换为 PDO 的方法 所以我有一个函数可以从数据库中获取内容 function getContent db PDOconn query SELECT FROM po
  • DI 容器如何知道构造函数需要什么(ASP.NET Core)?

    我读过很多关于什么是 DI 以及如何使用它的文档 与 ASP NET Core 相关 据我了解 当框架为我实例化某个控制器时 它以某种方式知道该控制器的类需要传递给构造函数 是反射还是什么 有人可以告诉我在 ASP NET Core Git
  • 在 Rails + MySQL 中存储百分比

    我需要在 Rails 应用程序中使用百分比 在任何视图中 包括用户输入时 格式都需要是百位格式 100 000 在计算中使用时 需要以百分位的格式表示 1 00000 我的迁移 我将该列添加到现有表中 具有以下行 add column wo
  • 停止执行另一代码的代码

    我有一个R进行一些数据分析并返回的代码TRUE FALSE 有时 输入数据太大 代码就继续运行 我想要一个脚本来监视我的数据分析代码 如果它没有返回任何内容 比如说600 seconds 然后它会停止正在运行的代码并执行其他操作 就会像按S
  • C++ if 语句中的多个条件

    我对 C 编程的概念非常陌生 我想要使 用多条件 if 语句 或 和 和 在一份声明中 当我向我的大学教授询问此事时 她告诉我这是可能的 然后侮辱了我在这个问题上有限的知识 我有权访问的所有示例都显示了多个 语句 并且只有一个显示了 它没有
  • HTML - 如何在提交按钮上弹出确认窗口,然后发送请求?

    我正在学习网络开发Django并且在哪里放置负责是否提交请求的代码方面存在一些问题HTML code 例如 有一个网页包含form 博客 由用户填写 点击保存按钮后 会弹出一个窗口询问是否要confirm或不 如果点击confirm 然后发
  • 我如何用 es6(不带打字稿)开玩笑地模拟 Prisma 客户端?

    Prisma 文档提供了模拟客户端以及使用 jest 和 typescript 进行单元测试的示例 有没有办法在不使用 TypeScript 的情况下开玩笑地嘲笑客户端 如果您能举一个简单的例子 我将不胜感激 需要补充的小事情 我在项目中使
  • Python Selenium 通过链接循环

    我对 python 或编码很陌生 这部分代码允许我找到我想要单击的所有元素 单击链接打开一个新选项卡 from selenium import webdriver import time driver webdriver Chrome dr
  • 无法在 Postgres 中使用交叉表

    OSX 10 9 2 上的 Postgres 9 2 1 如果我运行以下交叉表示例查询 CREATE EXTENSION tablefunc CREATE TABLE ct id SERIAL rowid TEXT attribute TE
  • MVVM:如何将参数传递给 ViewModel 的构造函数

    我正在使用 L Bugnion 的 MVVM Light 框架 将参数 例如 Customers IS 传递给 ViewModel 构造函数的推荐方法有哪些 编辑 每个 ViewModel 所需的参数不是跨模型共享的参数 它对于每个视图模型
  • 如何在 MVC 6 beta7 中插入自定义视图引擎?

    在 beta6 中 我们能够像这样插入自定义视图引擎 services AddMvc AddViewOptions options gt options ViewEngines Clear options ViewEngines Add t
  • 如何查看交易是通过模拟账户购买还是通过真实账户购买?

    我正在使用测试帐户进行应用内购买测试 但谷歌的响应与从真实帐户进行的购买相同 如何根据谷歌的响应检查购买是否是测试 是的 您可以从Google的Purchases subscriptions API响应的purchaseType字段中检查这
  • 列表操作复杂度

    我一直认为List
  • 在 PHP 中重新格式化日期

    我有一个像这样的日期 时间字符串 180510 112440 格式为 ddmmyy hhmmss 我需要一个片段来格式化字符串 2010 05 18 11 24 40 感谢帮助 另一个可能的答案是常见的用法strptime http php
  • 构造函数中参数较少的构造函数

    我有构造函数树 int a int b int c 和第二个构造函数树 int a int b int c String s 如何从第一个构造函数加载第二个构造函数以节省编写所有逻辑 我想过这样的事情 但它给了我 空 对象 public T
  • Python Tkinter 刷新画布

    你好 我在 python 中有一个元组 其颜色与通过以下字典在画布中绘制的正方形相关 colour mapping 0 red 1 green 2 blue 3 purple 更具体地说 例如元组中的节点是 2 3 3 3 这意味着 4 个