我正在学习使用tkinter,我尝试做的是在咖啡机上有4个按钮,每个按钮都会创建一个新窗口,按顺序显示图像,如幻灯片。我所做的并不起作用,因为它只显示幻灯片中的最后一张图片,而忽略了其余部分。在python 2.7中,我能够通过在标签的每个配置后都不打印到控制台来修复它,但它似乎不起作用。如果你能告诉我为什么会这样,和/或如何解决它,我们将不胜感激。
(P.S。我知道我的代码可能非常丑陋/低效,但请记住,我对tkinter很新,所以我只关心它的工作原理。)
def Latte():
global Grind
global Hot_Water
global Cocoa_Poweder
global Steamed_Milk
global Foamed_Milk
global LattePhoto
MakingCoffee=Toplevel(Test, width=200, height=200)
MakingCoffee.wm_title("Latte")
MakingCoffee.iconbitmap("Photos\Latte.ico")
photolabel= Label(MakingCoffee,image=Grind)
photolabel.pack()
time.sleep(2)
photolabel.configure(image=Hot_Water)
time.sleep(2)
photolabel.configure(image=Steamed_Milk)
time.sleep(4)
photolabel.configure(image=Foamed_Milk)
time.sleep(1)
photolabel.configure(image=LattePhoto)
time.sleep(2)
MakingCoffee.destroy()
答案 0 :(得分:0)
以下是使这项工作成功的一种方法的小样本。您可以根据需要进行重组。列表就是这样,我可以遍历它显示更改。您不需要原始代码中的所有全局变量。它们已经是全局变量,你并没有试图重新分配它们,所以这是一个冗余。您至少可以将约50%的代码分解为可重用。你可以把它变成一个类并制作一个“工厂类”来创建不同类型的咖啡的不同类型的幻灯片,然后你也可以在这里摆脱global
。
from tkinter import *
import tkinter
import time
Test = tkinter.Tk()
Test.wm_title("Coffee Store")
Test.resizable(0, 0)
americano_images = [
PhotoImage(file='1.gif'),
PhotoImage(file='2.gif'),
PhotoImage(file='3.gif')
]
AFTER = None
AmericanoPhoto= PhotoImage(file="1.gif")
def switch_images(im_list, label, index=0):
global AFTER
label.configure(image=im_list[index])
if index != len(im_list) - 1:
index += 1
else:
index = 0
AFTER = Test.after(1000, lambda: switch_images(im_list, label, index))
def Americano():
MakingCoffee=Toplevel(Test, width=200, height=200)
MakingCoffee.wm_title("Americano")
photolabel= Label(MakingCoffee)
photolabel.pack_propagate(0)
photolabel.pack()
after = switch_images(americano_images, photolabel)
cancel = Button(MakingCoffee, text='Kill Slideshow',
command=lambda: Test.after_cancel(AFTER))
cancel.pack(fill=X, expand=1)
B1= Button(Test, text='BUTTON', command=Americano)
B1.grid(row=0,column=0)
Test.mainloop()