我有一个列表:
list = ['one', 'two', 'three', 'four']
并且列表中的项目每10分钟更改一次(记住这一点)。
我需要一个带背景图片的gui,我可以打印列表中的每个项目。我可以用
做到这一点for item in list:
print item
我尝试使用tkinter,但是我在mainloop()中遇到了一些问题。当我做的时候
for item in list:
root = Tk()
canvas = Canvas(width = 300, height = 200, bg = 'yellow')
canvas.pack(expand = YES, fill = BOTH)
gif1 = PhotoImage(file = 'myImage.gif')
canvas.create_image(0, 0, image = gif1, anchor = NW)
# print item from my list
w = Label(root, text=item)
w.pack()
root.mainloop()
显示带图像的tkinter gui,但只显示文本“one”(我列表中的第一项)。当我关闭gui时,另一个窗口弹出“两个”,当我关闭那个窗口时,那里有“三个”......至少“四个”。 这是合乎逻辑的,因为我是for循环中的所有时间,并且对于列表中的每个项目都会生成一个gui。
我的问题:如何更新gui?我列表中的项目每10分钟更改一次。我需要遍历我的列表并在一个gui窗口中打印所有项目。 10分钟后,我想再次遍历我的列表并再次更新gui。
我该怎么做?
答案 0 :(得分:1)
你正在获得4个窗口,因为你在for循环中定义了mainloop和所有其余的窗口。作为替代尝试:
root = Tk()
canvas = Canvas(width = 300, height = 200, bg = 'yellow')
canvas.pack(expand = YES, fill = BOTH)
gif1 = PhotoImage(file = 'myImage.gif')
canvas.create_image(0, 0, image=gif1, anchor = NW)
item=" ".join(list)
w = Label(root, text=item)
w.pack()
root.mainloop()
将列表中的所有项目打印为一行。下一步是在列表更改时重绘主窗口。我不是Tk专家所以我无法帮助你。
尝试this stuff了解如何正确使用Tk。
答案 1 :(得分:1)
您的代码非常正确,只是您正在启动循环的那一部分导致创建多个窗口。如果仅将下循环放置在标签部分的前面,它将打印列表中的所有四个项目。 就像这样:
from tkinter import *
list=["one","two","three","four"]
root = Tk()
canvas = Canvas(width = 300, height = 200, bg = 'yellow')
canvas.pack(expand = YES, fill = BOTH)
# print item from my list
for item in list:
w = Label(root, text=item)
w.pack()
root.mainloop()
答案 2 :(得分:0)
这是使用两个线程执行此操作的一种方法,如果您需要执行长计算或阻止IO,这将非常有用。设置队列以在主GUI线程和“馈送器”线程之间进行通信。您可以使用root.after()在主循环将定期调用的函数中从队列中读取。必须在调用root.mainloop()的线程中调用所有TK方法(否则您的程序可能会崩溃)。
import threading
from Tkinter import Tk, Canvas, Label
import Queue
import time
from itertools import cycle
# Feeder thread puts one word in the queue every second
source_iter = cycle(['one', 'two', 'three', 'four', 'five', 'six'])
queue = Queue.Queue()
def source():
for item in source_iter:
queue.put(item)
time.sleep(1.)
source_thread = threading.Thread(target=source)
source_thread.setDaemon(True)
source_thread.start()
# Main thread reads the queue every 250ms
root = Tk()
w = Label(root, text='')
w.pack()
def update_gui():
try:
text = queue.get_nowait()
w.config(text=text)
except Queue.Empty:
pass
root.after(250, update_gui)
update_gui()
root.mainloop()