我正在使用Python中的tkinter模块编写应用程序。我遇到麻烦的代码部分是:
def sceneChange():
global num
num = num + 1
currentScene = scenes[num]
global label
label.destroy()
label = tk.Label(window, image = currentScene)
label.pack()
time1 = dt.datetime.utcnow().minute + dt.datetime.utcnow().second / 60
testTime = time1 + 4.44 / 60 # ~5 secs in the future
while dt.datetime.utcnow().minute + dt.datetime.utcnow().second / 60 < testTime:
pass
label.destroy()
num = num + 1
currentScene = scenes[num]
label = tk.Label(window, image = currentScene)
label.pack()
用于:
b = tk.Button(label, text = "Start", command = sceneChange, height = 1, width = 10)
b.place(x = 440, y = 48)
while循环之前的label.pack命令未显示在我的窗口中。我试图使其显示5秒钟,然后将图像切换到其他位置。但是,事实并非如此。所有帮助将不胜感激。 如果我在问题的格式上做错了什么,请告诉我,以便我加以改善:)。 整个代码如下:
import tkinter as tk
import datetime as dt
window = tk.Tk()
window.title("Game")
scenes = [tk.PhotoImage(file = "TitleScreen.gif"), tk.PhotoImage(file = "ControlsScreen.gif"), tk.PhotoImage(file = "game.gif")]
num = 0
currentScene = scenes[num]
label = tk.Label(window, image = currentScene)
def sceneChange():
global num
num = num + 1
currentScene = scenes[num]
global label
label.destroy()
label = tk.Label(window, image = currentScene)
label.pack()
time1 = dt.datetime.utcnow().minute + dt.datetime.utcnow().second / 60 # current time
testTime = time1 + 4.44 / 60 # ~5 secs in the future
while dt.datetime.utcnow().minute + dt.datetime.utcnow().second / 60 < testTime:
pass
label.destroy()
num = num + 1
currentScene = scenes[num]
label = tk.Label(window, image = currentScene)
label.pack()
label.pack()
b = tk.Button(label, text = "Start", command = sceneChange, height = 1, width = 10)
b.place(x = 440, y = 48)
b1 = tk.Button(label, text = "Quit", command = exit, height = 1, width = 10)
b1.place(x = 440, y = 78)
label.mainloop()
答案 0 :(得分:0)
您应该使用after()
函数而不是while
循环,因为使用while循环会导致窗口冻结直到循环结束。
after()
这里是一个示例。
from tkinter import *
root = Tk()
root.geometry("250x250")
Img1 = PhotoImage(file="img1.png") # Image 1
Img2 = PhotoImage(file="img2.png") # Image 2
L = Label(root, image=Img1)
L.pack()
# The image will change in 5000ms ( 5secs )
root.after( 5000, lambda: L.config(image=Img2) )
root.mainloop()