如何设置 tkinter textvariable 在单独的线程上运行?

2024-01-01

尝试使用“main”函数变量更新在线程上运行的 tkinter“textvariable”。我实现了一个基于线程的解决方案,因此 tkinter 主循环后面的代码可以运行:https://stackoverflow.com/a/1835036/15409926 https://stackoverflow.com/a/1835036/15409926.

请分享我如何解决此错误。如果这不是更新“textvariable”的最简单方法,请分享替代方法。

Code:

from tkinter import *
from threading import Thread

class GUI(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.start()

    def run(self):
        self.root = Tk()
        self.var = StringVar()
        self.var.set("Initiated")

        screen_width = self.root.winfo_screenwidth()
        screen_height = self.root.winfo_screenheight()

        width = screen_width*.12
        height = screen_height
        x = screen_width - width
        y = screen_height*.025

        self.root.geometry('%dx%d+%d+%d' % (width, height, x, y))

        label = Label(self.root, textvariable= self.var)
        label.pack()

        self.root.mainloop()

gui = GUI()

def main():
    for i in range(1000):
        gui.var.set(f'Current Iteration: {i}')

if __name__ == '__main__':
    main()

窗口不更新:Tkinter 窗口显示初始“textvariable” https://i.stack.imgur.com/JPlNJ.png

Error:

Traceback (most recent call last):
  File "test.py", line 36, in <module>
    main()
  File "test.py", line 33, in main
    gui.var.set(f'Current Iteration: {i}')
AttributeError: 'GUI' object has no attribute 'var'

大多数 GUI 不喜欢在单独的线程中更改小部件中的值。

你应该使用queue将值发送到线程,它应该使用root.after(time, function)定期运行函数,该函数将从队列中获取值并更新 GUI 中的值。

import tkinter as tk  # PEP8: `import *` is not preferred
from threading import Thread
import queue
import time  # simulate show program

class GUI(Thread):
    
    def __init__(self, queue):
        super().__init__()
        self.queue = queue
        self.start()

    def run(self):
        self.root = tk.Tk()
        self.var = tk.StringVar()
        self.var.set("Initiated")

        screen_width = self.root.winfo_screenwidth()
        screen_height = self.root.winfo_screenheight()

        width = int(screen_width*.12)
        height = int(screen_height)
        x = int(screen_width - width)
        y = int(screen_height*.025)

        self.root.geometry(f'{width}x{height}+{x}+{y}')

        label = tk.Label(self.root, textvariable=self.var)
        label.pack()
 
        # run first time after 100ms (0.1 second)
        self.root.after(100, self.check_queue)

        self.root.mainloop()

    def check_queue(self):
        #if not self.queue.empty():
        while not self.queue.empty():
            i = self.queue.get()
            self.var.set(f'Current Iteration: {i}')

        # run again after 100ms (0.1 second)
        self.root.after(100, self.check_queue)
        
def main():
    q = queue.Queue()
    gui = GUI(q)

    for i in range(1000):
        q.put(i)
        # simulate show program
        time.sleep(0.5)


if __name__ == '__main__':
    main()

PEP 8——Python 代码风格指南 https://www.python.org/dev/peps/pep-0008/

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

如何设置 tkinter textvariable 在单独的线程上运行? 的相关文章

  • Python 类型提示 Dict 语法错误 可变默认值是不允许的。使用“默认工厂”

    我不知道为什么解释器会抱怨这个类型的字典 对于这两个实例 我得到一个 不允许可变默认值 使用默认工厂 语法错误 我使用的是 python 3 7 3 from dataclasses import dataclass from typing
  • 计算另一个字符串中多个字符串的出现次数

    在 Python 2 7 中 给定以下字符串 Spot是一只棕色的狗 斑点有棕色的头发 斑点的头发是棕色的 查找字符串中 Spot brown 和 hair 总数的最佳方法是什么 在示例中 它将返回 8 我正在寻找类似的东西string c
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • 为什么 web2py 在启动时崩溃?

    我正在尝试让 web2py 在 Ubuntu 机器上运行 所有文档似乎都表明要在 nix 系统上运行它 您需要下载源代码并执行以下操作 蟒蛇 web2py py 我抓住了source http www web2py com examples
  • InvalidOperationException - 对象当前正在其他地方使用 - 红十字

    我有一个 C 桌面应用程序 其中我连续创建的一个线程从源 实际上是一台数码相机 获取图像并将其放在 GUI 中的面板 panel Image img 上 这必须是另一个线程 如它是控件的代码隐藏 该应用程序可以工作 但在某些机器上 我会在随
  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • Tensorboard SyntaxError:语法无效

    当我尝试制作张量板时 出现语法错误 尽管开源代码我还是无法理解 我尝试搜索张量板的代码 但不清楚 即使我不擅长Python 我这样写路径C Users jh902 Documents logs因为我正在使用 Windows 10 但我不确定
  • 打印包含字符串和其他 2 个变量的变量

    var a 8 var b 3 var c hello my name is var a and var b bye print var c 当我运行程序时 var c 会像这样打印出来 hello my name is 8 and 3 b
  • 从 Powershell 脚本安装 Python

    当以管理员身份从 PowerShell 命令行运行以下命令时 可以在 Windows 11 上成功安装 Python c temp python 3 11 4 amd64 exe quiet InstallAllUsers 0 Instal
  • Django 视图中的“请求”是什么

    在 Django 第一个应用程序的 Django 教程中 我们有 from django http import HttpResponse def index request return HttpResponse Hello world
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • 将 Matlab 的 datenum 格式转换为 Python

    我刚刚开始从 Matlab 迁移到 Python 2 7 在读取 mat 文件时遇到一些问题 时间信息以 Matlab 的日期数字格式存储 对于那些不熟悉它的人 日期序列号将日历日期表示为自固定基准日期以来已经过去的天数 在 MATLAB
  • 如何使用 Python 3 检查目录是否包含文件

    我到处寻找这个答案但找不到 我正在尝试编写一个脚本来搜索特定的子文件夹 然后检查它是否包含任何文件 如果包含 则写出该文件夹的路径 我已经弄清楚了子文件夹搜索部分 但检查文件却难倒了我 我发现了有关如何检查文件夹是否为空的多个建议 并且我尝
  • 为什么 csv.DictReader 给我一个无属性错误?

    我的 CSV 文件是 200 Service 我放入解释器的代码是 snav csv DictReader open screennavigation csv delimiter print snav fieldnames 200 for
  • 重新分配唯一值 - pandas DataFrame

    我在尝试着assign unique值在pandas df给特定的个人 For the df below Area and Place 会一起弥补unique不同的价值观jobs 这些值将分配给个人 总体目标是使用尽可能少的个人 诀窍在于这
  • Firebase Firestore:获取文档的生成 ID (Python)

    我可以创建一个新文档 带有自动生成的 ID 并存储对其的引用 如下所示 my data key value doc ref db collection u campaigns add my data 我可以像这样访问数据本身 print d
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是

随机推荐

  • Knockoutjs 验证 areSame 或 MustMatch 示例

    我正在尝试使用 GitHub 上的 Knockoutjs 验证插件 大部分似乎工作得很好 但是当我尝试使用扩展验证 MustEqual password confirm password 时 它似乎没有做任何事情 我缺少什么 我非常想学习这
  • 如何在SQLite中进行递归查询?

    如果我的数据结构是这样的 parentA parentAA parentAAA childA 如果我能得到 childA name 我怎样才能知道所有父级的名字直到顶层 所以它会像这样 gt parentA parentAA parentA
  • 如何从 Azure Function App 中的请求正文检索字节数据

    在 Python 中 我将图像转换为字节 然后 我将字节传递到 Azure HTTP 触发器函数应用端点 URL Azure 门户 就像调用 Azure 认知服务时一样 image path r C Users User Desktop b
  • NSURL、URL 和 NSData、数据

    我是斯威夫特的新手 当我遇到这个问题时 我正在从互联网上获取图像NSURL and URL and NSData and Data 我真的很困惑 我使用哪些 我使用了以下代码 但我必须转换类型 如下所示 这样做的正确方法是什么以及两者之间的
  • 避免测试时由于 readline() 造成的暂停

    我正在 R 中使用以下命令运行测试test dir 函数从testthat包裹 在一些测试脚本中 有一些函数调用readline 这在交互模式下会导致测试暂停并等待用户输入 调用的函数readline 不是我自己的 我对他们没有任何影响 用
  • 强制重新加载表视图

    All 当按下按钮时 如何强制每五秒重新加载一个表视图 在视图控制器内 持续十五秒 谢谢 詹姆士 首先 当您按下按钮时创建一个计时器 NSTimer timer NSTimer scheduledTimerWithTimeInterval
  • JQuery CORS 和重定向

    使用 JQuery 1 8 2 我正在从一个 AppServer 向应用程序发出 CORS 请求 Front 到另一个应用程序服务器 Back 服务器 当我进行以下 Ajax 调用时Front 来自的 302 响应 安全检查 Back很荣幸
  • 从 .tar.gz 将模块安装到 Anaconda

    当我想将模块安装到 Anaconda 时 我运行conda install 然而 现在我有一个 tar gz文件并想要安装它 怎么做 有多种方法可以实现此目的 我在这里描述一种方法 即使您的默认方法也应该相对简单python变量不是 ana
  • 更新应用商店错误 - 找不到启动故事板

    我的应用程序已在应用程序商店中发布 6 个月 我现在尝试发布更新 但在验证应用程序时遇到错误 找不到启动故事板 确保为 Info plist 中的键 UILaunchStoryboardName 指定不带文件扩展名的启动故事板文件名 我所做
  • 如何优化 TradingView Pine 脚本中的参数? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想优化 TradingView Pine 回测中的指标参数 这对于其他工具来说是可能的 但是当我在
  • 使用 ggplot 在 R 中绘制多个大型时间序列时出现问题

    我有一个包含 16 个独立时间序列的大型数据集 我想将它们绘制在 3x7 网格中 顶行是每个以 IN 结尾的时间序列 底行是每个以 OUT 结尾的时间序列 在中间行中 我将重复对应于每个 IN OUT 对的以 RN 结尾的两个时间序列中的每
  • PDOStatement 包含什么以及 fetch/fetchAll 有什么用?

    我无法理解 1 PDOStatement 对象内部有什么以及 2 为什么我需要 fetch 或 fetchAll 方法 我的数据库 一个名为 动物 的简单表 有 3 列 id 名称 物种 My code try pdo new PDO ds
  • Clang 格式换行符

    我正在寻找一个clang format设置以防止工具删除换行符 例如 我有我的ColumnLimit设置为 120 这是我重新格式化一些示例代码时发生的情况 Before include
  • 根据另一个数组的内容对 C 数组进行排序

    我正在尝试对数组进行排序A其元素是索引 索引引用另一个数组B其值将决定顺序A 所以 我想排序A这样B A i 在增加 例如 A 0 1 4 5 7 B 5 3 8 2 2 7 1 6 3 9 Sorted A将会 A 7 4 1 0 5 这
  • 如何修复Python缩进

    我有一些 Python 代码的缩进不一致 大量制表符和空格的混合使情况变得更糟 甚至空格缩进也没有保留 该代码按预期工作 但难以维护 我怎样才能修复缩进 比如HTML 整洁 https en wikipedia org wiki HTML
  • 如何在echarts中添加渐变颜色?

    I made a echart line graph https stackblitz com edit angular aqghec file src 2Fapp 2Fapp component ts Now I want to add
  • 自定义 UItableView 在 ios8 上无法正确显示

    我做了一个定制UITableViewCell当我显示它时 我得到了这个结果 我在 iPhone 5 上运行 xcode 6 和 iOS 8 beta 1 https i stack imgur com 9Oswn png https i s
  • 只读时无法使用文本框获取文本?

    我有一个文本框
  • CSS Line-Through 未被删除

    我有一些代码可以在 TR 上为已删除的行添加一条直通线 但这意味着我的 操作 列 只有 按钮会受到影响 这是因为按钮之间存在单独的空间 这些空间最终也会被贯穿 在浏览了 W3Schools 后 我很困惑为什么这个例子不起作用 table t
  • 如何设置 tkinter textvariable 在单独的线程上运行?

    尝试使用 main 函数变量更新在线程上运行的 tkinter textvariable 我实现了一个基于线程的解决方案 因此 tkinter 主循环后面的代码可以运行 https stackoverflow com a 1835036 1