猿问

For 循环运行时,Tkinter UI 变得无响应

我遇到了一个问题,我的 Tkinter UI 在 afor loop运行时变得完全卡住并且无法交互。我的示例代码在循环中打印“循环”,并且 UI 上有一个“取消”按钮应该停止循环,但是由于我无法单击“取消”按钮,因此无法停止循环. 所以我的问题是如何tkinter在循环运行时使我的UI 可用。这是示例代码:


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()


慕哥6287543
浏览 357回答 2
2回答

德玛西亚99

'flag' 不是全局变量,因此当它在 canc() 中设置为 False 时,loop() 中的 'flag' 局部变量的值不会改变,因此循环不会停止还需要使用 root.update() 来更新 GUI补救措施:from tkinter import*import threadingimport timeroot = 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 = Falsebtn = Button(root, text="Start Loop", command=loop).pack()cncl = Button(root, text="Cancel", command=canc).pack()root.mainloop()

慕码人8056858

我找到了解决这个问题的方法:我在一个线程中开始了我耗时的工作,并检查了我的线程是否仍在while 循环中运行,并且在其中,我确实更新了我的Tkinter根目录。这是我的代码: def start_axis(input):    print(input)    time.sleep(5)def axis():    t = threading.Thread(target=start_axis, args=("x"))            t.start()    while t.is_alive():        try:            root.update()        except:            passargs 部分很重要,因此线程不会立即调用该函数
随时随地看视频慕课网APP

相关分类

Python
我要回答