В программе Tkinter, как я могу предотвратить отставание поведения виджета, если оно помещено в трудоемкую функцию? - PullRequest
0 голосов
/ 18 марта 2020

У меня есть программа GUI, такая, что при нажатии кнопки должна отображаться метка, указывающая, что какая-то обработанная часть запущена, а затем должен начаться процесс. Я поместил все это в функцию, которая вызывается при нажатии кнопки. Это приводит к тому, что ярлык не появляется сразу. Я думаю, это потому, что окно Tkinter работает в циклах и вся функция должна завершиться до того, как какое-либо изменение отразится в окне, это правильно? Как это можно обойти?

import time
from tkinter import *

def function1():
    myLabel = Label(root, text="process started...").grid(row=6, column=3)
    time.sleep(3)
    #or some time consuming process...
root = Tk()
root.geometry("600x500")

button = Button (root, text="trial", command=function1)
button.grid(row=7, column=2)


root.mainloop()

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Вы можете использовать модуль многопоточности threading для запуска чего-либо в другом потоке. Если вы запустите его в другом потоке, окно Tkinter не будет ожидать завершения всей функции до sh, так как эта функция выполняется в другом потоке, чем окно Tkinter.

  1. Импорт модуля Threading
import threading

Создайте функцию, для которой вы хотите запустить новый поток

Создайте новый поток и передайте созданную вами функцию

thread = threading.Thread(target=function, args=arguments)

Где target - функция, которую вы хотите вызвать в этом новом шаге, а args - аргументы, которые необходимо передать в вашу функцию (вы можете опустить args, если нет аргументов для передачи в )

Запустить новый поток
thread.start()

Редактирование чего-либо в объекте Tk() должно выполняться в том же потоке, в котором он был создан (в основном вы не можете ничего редактировать в одно и то же окно, в 2-х разных темах).

0 голосов
/ 18 марта 2020

Одним из решений является добавление root.update() сразу после Label (перед функцией).

import time
from tkinter import *

def function1():
    myLabel = Label(root, text="process started...").grid(row=6, column=3)
    root.update()  # So it will display the Label right now 
    time.sleep(3)
    # Or some time consuming process...
root = Tk()
root.geometry("600x500")

button = Button (root, text="trial", command=function1)
button.grid(row=7, column=2)


root.mainloop()

Это обновит окно, поэтому вы сразу увидите, что Label.

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