только последняя модификация Label показывается в Python - Tkinter.Зачем? - PullRequest
0 голосов
/ 24 мая 2018

Я изучаю разработку GUI с использованием Tkinter.Я хочу показать несколько сообщений на этикетке, которые я сохранил в строке.Я использовал сон, чтобы просмотреть изменения. Однако, только последняя строка сообщения отображается при исполнении.

from tkinter import *
import time
master = Tk()


def onClick():
    for i in range(0,len(list_of_str)):
        w.configure(text=list_of_str[i])
        time.sleep(5)

list_of_str = ['first','second','third','fourth','fifth']

w = Label(master, text="Hello, world!")
b = Button(master,text='Click me',command = onClick)
w.pack()
b.pack()



mainloop()

Я - нуби.Так что спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Простое решение вашей проблемы - использовать комбинацию метода try / исключением и использование after().

В tkinter sleep() приостановит приложение вместо предоставления таймера.Для tkinter вы хотите использовать метод after(), чтобы запланировать событие по истечении заданного промежутка времени.Метод after() предназначен именно для этой проблемы и является тем, что вы всегда будете использовать в tkinter для отложенного события.

В моем примере ниже я изменил вашу функцию onClick, чтобы она принимала 1 аргумент и использовала егов нашем методе after() для выбора следующего элемента в списке через 5 секунд.Обратите внимание, что для метода after() время указывается в миллисекундах, поэтому 5000 равно 5 секундам.

from tkinter import *


master = Tk()

def onClick(ndex):
    try:
        w.configure(text=list_of_str[ndex])
        master.after(5000, onClick, ndex+1)
    except:
        print("End of list")

list_of_str = ['first','second','third','fourth','fifth']

w = Label(master, text="Hello, world!")
b = Button(master,text='Click me',command = lambda: onClick(0))
w.pack()
b.pack()

mainloop()
0 голосов
/ 24 мая 2018

Я думаю, вы хотите это:

from tkinter import *
import time
master = Tk()

global i
i = 0

def onClick():
    master.after(1, change)      

def change():
    global i
    if i == len(list_of_str):
        pass
    else:
        w.configure(text=list_of_str[i])
        i += 1
        master.after(1000, onClick)

list_of_str = ['first','second','third','fourth','fifth']

w = Label(master, text="Hello, world!")
b = Button(master,text='Click me',command = onClick)
w.pack()
b.pack()

mainloop()

time.sleep - это нет-нет в tkinter.Я советую вам сделать свой графический интерфейс в классе, и это будет проще.

пример с классом:

import tkinter as tk
from tkinter import *

class GUI:

    def __init__(self, master):
        self.list_of_str = ['first','second','third','fourth','fifth']
        self.count = 0
        self.master = master
        self.w = Label(master, text="Hello, world!")
        self.w.pack()
        self.b = Button(master,text='Click me',command = self.onClick)
        self.b.pack()

    def onClick(self, event=None):
        if self.count == len(self.list_of_str):
            pass
        else:
            self.w.configure(text=self.list_of_str[self.count])
            self.count += 1
            self.master.after(1000, self.onClick)

def main(): 
    root = tk.Tk()
    app = GUI(root)
    root.mainloop()

if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...