为什么after()方法不适用于多循环?

时间:2016-07-01 13:15:23

标签: python tkinter

我将在多after()中使用forloop方法。计划是以一秒的间隔打印每个组合文本。

但它直接运行到最后,只打印最后一个组合文本。我怎样才能解决这个问题?

这是我的代码:

# -*- coding: utf-8 -*-

from Tkinter import *
import time

FirstList = ["1", "2", "3", "4"]
SecondList = ["a", "b", "c", "d", "e", "f"]
ThirdList = ["A" , "B" , "C"]

root = Tk()
root.title("Program")
root['background'] ='gray'

def command_Print():
    for i in range(0, len(FirstList), 1):
        for j in range(0, len(SecondList), 1):
            for k in range(0, len(ThirdList), 1):
                PrintText = FirstList[i] + SecondList[j] + ThirdList[k]
                Labelvar.set(PrintText)
                Label0.after(1000, lambda: command_Print)

Labelvar = StringVar()
Labelvar.set(u'original value')
Frame0 = Frame(root)
Frame0.place(x=0, y=0, width=100, height=50)
Label0 = Label(Frame0, textvariable=Labelvar, anchor='w')
Label0.pack(side=LEFT)

Frame_I = Frame(root)
Frame_I.place(x = 100, y = 0, width=100, height=70)
Button_I = Button(Frame_I, text = "Button" , width = 100, height=70, command = command_Print)
Button_I.place(x=0, y=0)
Button_I.grid(row=0, column=0, sticky=W, pady=4)
Button_I.pack()

root.mainloop()

1 个答案:

答案 0 :(得分:3)

如果我理解你想要的东西,你只需要列表中的cartestian产品。您可以使用itertools代替嵌套的forloop,而不需要重新发明轮子,因为itertools已经有了这个内置功能,而且它更清晰。

在这里:(未经测试)

import itertools

PRODUCTS = itertools.product(FirstList, SecondList, ThirdList)

def show_next_product():

     try:
        LabelVar.set(next(PRODUCTS))
        root.last_after = root.after(1000, show_next_product)
     except StopIteration:
        LabelVar.set("Out of products.")
        root.after_cancel(root.last_after)

此外,StringVar似乎没必要。除非您使用trace方法为StringVar做了一些事情,否则我从来没有看到过诚实地使用它们的重点。

您可以直接使用Label0['text'] = 'newtext'更改文字,但当然是个人偏好。 :)