tkinter(py3) - 实时更改图像标签,内部功能

时间:2016-04-13 15:35:37

标签: python python-3.x tkinter

我正在学习使用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()

1 个答案:

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