我将在多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()
答案 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'
更改文字,但当然是个人偏好。 :)