Пользовательский интерфейс Tkinter перестает отвечать на запросы, пока работает цикл - PullRequest
0 голосов
/ 09 апреля 2019

У меня проблема с тем, что мой пользовательский интерфейс Tkinter полностью зависает и неинтерактивен во время работы for loop.Мой пример кода печатает «Цикл», пока он находится в цикле, и на интерфейсе пользователя есть кнопка «Отмена», которая должна остановить цикл, но так как я не могу нажать кнопку «Отмена», цикл не может быть остановлен,Поэтому мой вопрос заключается в том, как сделать мой tkinter пользовательский интерфейс пригодным для использования во время выполнения цикла.Вот пример кода:

from tkinter import*
import time

root = Tk()

i=10
flag = False

def loop():
    flag = True
    for i in range(100):
        if flag == True:
            time.sleep(0.5)
            print("Looping")


def canc():
    flag = False


btn = Button(root, text="Start Loop", command=loop).pack()
cncl = Button(root, text="Cancel", command=canc).pack()

root.mainloop()

Я попытался создать новый поток для функции loop, но это не работает.

Обновлен код, пользовательский интерфейс реагирует, но при нажатии отмены ничего не происходит:

from tkinter import*
import threading
import time

root = Tk()

i=10
flag = False



def loop():
    flag = True
    for i in range(10):
        if flag == True:
            time.sleep(0.5)
            print("Looping")


def run():
    threading.Thread(target=loop).start()


def canc():
    flag = False


btn = Button(root, text="Start Loop", command=run).pack()
cncl = Button(root, text="Cancel", command=canc).pack()

root.mainloop()

1 Ответ

1 голос
/ 09 апреля 2019

'flag' не является глобальной переменной, поэтому, когда она установлена ​​в False в canc (), значение локальной переменной 'flag' в loop () не изменяется и, следовательно, цикл также не останавливается

root.update () необходимо использовать для обновления графического интерфейса пользователя

Действия по исправлению:

from tkinter import*
import threading
import time

root = Tk()

def loop():

    global flag
    flag = True

    for i in range(10):
        if flag == True:
            root.update()
            time.sleep(0.5)
            print("Looping")

def canc():
    global flag
    flag = False

btn = Button(root, text="Start Loop", command=loop).pack()
cncl = Button(root, text="Cancel", command=canc).pack()

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