Метка Tkinter не выполняется - PullRequest
0 голосов
/ 19 апреля 2019

Я пишу приложение, используя модуль tkinter в Python.Часть кода, с которой у меня возникают проблемы:

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)

Команда label.pack перед циклом while не отображается в моем окне.Я пытаюсь заставить его отображаться в течение 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()

1 Ответ

0 голосов
/ 19 апреля 2019

Вы должны использовать функцию after() вместо цикла while, потому что использование цикла while заставляет окно зависать до завершения цикла.

Если вы хотите знать, как использовать after()

Перейти к этой записи


Теперь, как вы можете получить изображение для отображения в течение 5 секунд?

Вот пример.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...