Как изменить метку tkinter во время работы другого процесса? - PullRequest
0 голосов
/ 04 мая 2018

У меня большой код, при котором нажатие кнопки должно запускать код, выполнение которого займет примерно 15 секунд. В течение этого времени я хочу отобразить ярлык с надписью «Обработка, пожалуйста, подождите» или что-то в этом роде. Однако в python весь графический интерфейс пользователя, созданный с помощью tkinter, будет зависать и размораживаться после завершения процедуры. Как мне это сделать? Я создал меньший код, чтобы мне было легче объяснять.

from tkinter import *
from threading import Thread
import os
import sys
import time

master = Tk()
master.geometry("500x500")
master.resizable(False,False)

def tryout():
    sign2.config(text = "AAA")
    for x in range(5):
        print(x)
        time.sleep(1)
    sign2.config(text = "BBB")
    for x in range(5):
        print(x)
        time.sleep(1)
    sign2.config(text = "CCC")

def close_window(): 
    master.destroy()
    sys.exit()

sign1 = Label(master, text = "VNA GUI").grid(pady=10, padx=10)
sign2 = Label(master, text = "Choose option to continue")
sign2.grid(pady=10, padx=10, ipadx=50)
Button(master, text='Exit', command=close_window).grid(pady=10, padx=20)
butTest = Button(master, text='test', command=tryout)
butTest.grid(pady=10, padx=20)

master.mainloop( )

Таким образом, в этом коде я ожидаю увидеть сначала «ААА» на этикетке, затем «ВВВ» в середине счета от 0 до 4, а затем «ССС» в конце окончательного счета от 0 до 4. То, что здесь происходит, - это то, что графический интерфейс вначале зависает, счет продолжается, и я просто вижу «CCC». Как мне обойти это?

Ответы [ 2 ]

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

Вы можете попробовать многопоточность. Я внес изменения в код ниже и протестировал его здесь, и он работал.

from tkinter import *
from threading import Thread
import os
import sys
import time
import threading  # NEW

master = Tk()
master.geometry("500x500")
master.resizable(False,False)

def tryout():
    sign2.config(text = "AAA")
    for x in range(5):
        print(x)
        time.sleep(1)
    sign2.config(text = "BBB")
    for x in range(5):
        print(x)
        time.sleep(1)
    sign2.config(text = "CCC")

def close_window():
    master.destroy()
    sys.exit()

def thread(): # NEW
    threading.Thread(target=tryout).start() # NEW


sign1 = Label(master, text = "VNA GUI").grid(pady=10, padx=10)
sign2 = Label(master, text = "Choose option to continue")
sign2.grid(pady=10, padx=10, ipadx=50)    
Button(master, text='Exit', command=close_window).grid(pady=10, padx=20)
butTest = Button(master, text='test', command=thread)  # Changed
butTest.grid(pady=10, padx=20)

master.mainloop( )
0 голосов
/ 04 мая 2018

Для выполнения многопоточности требуется всего несколько изменений.

Сначала создайте функцию start_tryout:

def start_tryout():
    Thread(target=tryout, daemon=True).start() # deamon=True is important so that you can close the program correctly

Затем создайте кнопку с новой командой:

butTest = Button(master, text='test', command=start_tryout)

Тогда он больше не должен замораживать графический интерфейс, и вы сможете увидеть изменение метки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...