从列表到gui的python字符串中打印

时间:2011-01-30 16:36:37

标签: python user-interface tkinter

我有一个列表:

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。

我该怎么做?

3 个答案:

答案 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()