python - 同时更新多个标签时 Tkinter 没有响应

标签 python user-interface python-3.x tkinter

我正在使用内置的 Python GUI Tkinter 制作程序原型(prototype),当我尝试同时更新多个标签时遇到一些问题。 GUI 可以处理几次刷新,但 10 秒左右后就会卡住。我需要所有标签在非常接近的时间更新,因为每个标签显示不同的传感器数据。

现在,我正在使用random模块不断生成数字来代替实际数据。将有 10 个左右的标签同时执行此操作,我想确保 tkinter 可以处理它。标签也会每隔几分之一秒(大约 200 毫秒)更新一次。我在 Windows 上使用 python 3.3。

我已经阅读了一些选项,但我对 tkinter 缺乏经验。 链接: Here. And Here.

我应该考虑多线程吗?多重处理?我对这两个都没有经验,但如果这意味着解决这个问题,我愿意学习。

我想要用 tkinter 做的事情是否可行?我应该使用 pygame 还是其他 GUI?我在这里缺少什么?

import random
from tkinter import *

class Application(Frame):
    """The GUI window"""
    def __init__(self, master):
        """Setup the Frame"""
        super(Application, self).__init__(master)
        self.grid() 
        self.setupWidgets()
        self.update()

    def setupWidgets(self):
        """Setup widgets for use in GUI"""

        #setup data readings
        self.data_lbl_txt = "Data Readings"
        self.data_lbl = Label(self, text = self.data_lbl_txt)
        self.data_lbl.grid(row = 0, column = 1, columnspan = 2, sticky = E)


        #setup first data piece
        self.data1_txt = "First piece of data:"
        self.data1_lbl = Label(self, text = self.data1_txt)
        self.data1_lbl.grid(row = 1, column = 1, sticky = W)

        self.data1 = StringVar()
        self.data1_Var = Label(self, textvariable = self.data1)
        self.data1_Var.grid(row = 1, column = 2, sticky = W)

        #setup second data piece
        self.data2_txt = "Second piece of data:"
        self.data2_lbl = Label(self, text = self.data2_txt)
        self.data2_lbl.grid(row = 2, column = 1, sticky = W)

        self.data2 = StringVar()
        self.data2_Var = Label(self, textvariable = self.data2)
        self.data2_Var.grid(row = 2, column = 2, sticky = W)


    def update(self):
        self.data1.set(random.randint(1,10))
        self.data1_Var.after(200, self.update)

        self.data2.set(random.randint(1,10))
        self.data2_Var.after(200, self.update)



root = Tk()
root.title("Data Output")
root.geometry("600x250")
window = Application(root)


window.mainloop()

最佳答案

我相信您在这里无意中创建了一个fork bombupdate 方法中。

这段代码:

def update(self):
    self.data1.set(random.randint(1,10))
    self.data1_Var.after(200, self.update)

    self.data2.set(random.randint(1,10))
    self.data2_Var.after(200, self.update)

意味着每次调用该方法时,都会再次调用两次(或者更确切地说,在未来 200 毫秒内,因为您有 .after(200, self.update) 两次。

这意味着而不是这个:

update is called 1x
200 millisecond gap
update is called 1x
200 millisecond gap
update is called 1x
200 millisecond gap
update is called 1x
200 millisecond gap
update is called 1x
200 millisecond gap...

你有这个:

update is called 1x
200 millisecond gap
update is called 2x
200 millisecond gap
update is called 4x
200 millisecond gap
update is called 8x
200 millisecond gap
update is called 16x
200 millisecond gap...

它会在大约 10 秒(或 10,000 毫秒)后卡住,因为它试图一次调用 2^50(或 1125899906842624)个 update 函数!

我认为(自从我使用 Tkinter 以来已经有一段时间了)解决这个问题的方法是在该函数中执行 root.after 。或者,您可以创建多个不同的 update 函数,每个标签一个,每个函数仅调用 after 一次。

关于python - 同时更新多个标签时 Tkinter 没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18578557/

相关文章:

python - 如何使用 boto 将文件从 Amazon S3 流式传输到 Rackspace Cloudfiles?

android - Android Hierarchy Viewer 的编程接口(interface)

python - 解析 HTML 以检索术语

windows - 针对特定软件的自动化工具建议(我认为是 C#)

android - 发布版本 Android 中的 facebook 集成 Key Hash 错误

javascript - 在 Odoo ERP 系统上创建自定义字段小部件

python - 如何使用ezdxf关闭属性打印设置?

python - 如果 Google App Engine cron 作业有 10 分钟的限制,那么为什么我会在正常的 30 秒后收到 DeadlineExceededError?

python - 操作系统错误 : [Errno 8] Exec format error: 'chromedriver' using Chromedriver on Ubuntu server

python - 将 pandas.DataFrame 添加到现有 Excel 文件