gpt4 book ai didi

Python 通过线程 tkinter 进行通信

转载 作者:太空宇宙 更新时间:2023-11-04 01:19:34 25 4
gpt4 key购买 nike

我正在创建一个基于文本的游戏,并且想要计算它已经运行了多少秒,这是我第一次使用 tkinter,所以我不确定我做的是否正确。我遇到以下问题,当我尝试使用我的 counter() 函数更新它时,upt_label['text']upt_table 未定义。

这是 python 3.3,我需要引用什么才能在 counter() 中更改该变量?

from tkinter import *
import time
from threading import Thread

global upt_label

class OutBox(Frame):
def __init__(self, parent):
Frame.__init__(self, parent, background="black")

self.parent = parent

self.initUI()

def initUI(self):
self.parent.title("Text Adventure!")
self.pack(fill=BOTH, expand=1)
tpp_label = Label(self, text="Text Adventure!", fg="white", background="black", anchor="center", font=("Arial", 18))
tpp_label.pack()
upt_label = Label(self, text = "Uptime: 0", fg="white", background="black", anchor="center", font=("Arial", 12))
upt_label.pack()

def main():
root = Tk()
root.geometry("560x720")
app = OutBox(root)
root.mainloop()

def counter():
uptime = 0
while True:
upt_label['text'] = 'Uptime: %s' % uptime
time.sleep(1)
uptime = uptime + 1

gui_thread = Thread(target = main, args = ())
gui_thread.start()

upt_thread = Thread(target = counter, args = ())
upt_thread.start()

最佳答案

您遇到的部分问题是无法保证 gui 线程会在计数器线程运行之前初始化。使问题复杂化的是,除了创建它们的线程之外,您无法从任何线程安全地访问 tkinter 小部件。因此,即使您解决了启动顺序问题,您仍然还有其他问题需要解决。

好消息是,您不需要线程来解决这个问题。事实上,线程使这个问题变得更加困难。

如果你想每秒运行一些东西,使用 after 调用一个函数,然后让该函数使用 after 安排自己在一秒钟内再次运行。

这是一个粗略的例子:

   def counter():
global uptime
uptime += 1
upt_label['text'] = 'Uptime: %s' % uptime
root.after(1000, counter)

注意这个函数如何更新标签,然后安排在一秒钟后再次调用它自己。这可能有一点不准确,因为它不能保证 精确地 一秒后运行。更准确的解决方案是保存程序启动的时间,然后获取当前时间并进行一些计算。这将为您在长时间运行的程序过程中提供更准确的表示。

关于Python 通过线程 tkinter 进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22147084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com