为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2022-01-05 10:42:07
我遇到了一个问题,我的 Tkinter UI 在 afor loop运行时变得完全卡住并且无法交互。我的示例代码在循环中打印“循环”,并且 UI 上有一个“取消”按钮应该停止循环,但是由于我无法单击“取消”按钮,因此无法停止循环. 所以我的问题是如何tkinter在循环运行时使我的UI 可用。这是示例代码:from tkinter import*import timeroot = Tk()i=10flag = Falsedef loop():    flag = True    for i in range(100):        if flag == True:            time.sleep(0.5)            print("Looping")def canc():    flag = Falsebtn = Button(root, text="Start Loop", command=loop).pack()cncl = Button(root, text="Cancel", command=canc).pack()root.mainloop()我曾尝试为该loop函数创建一个新线程,但这不起作用。更新代码,用户界面响应,但按下取消时没有任何反应:from tkinter import*import threadingimport timeroot = Tk()i=10flag = Falsedef 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 = Falsebtn = Button(root, text="Start Loop", command=run).pack()cncl = Button(root, text="Cancel", command=canc).pack()root.mainloop()
查看完整描述

2 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

'flag' 不是全局变量,因此当它在 canc() 中设置为 False 时,loop() 中的 'flag' 局部变量的值不会改变,因此循环不会停止


还需要使用 root.update() 来更新 GUI


补救措施:


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


查看完整回答
反对 回复 2022-01-05
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

我找到了解决这个问题的方法:


我在一个线程中开始了我耗时的工作,并检查了我的线程是否仍在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:

            pass

args 部分很重要,因此线程不会立即调用该函数


查看完整回答
反对 回复 2022-01-05
  • 2 回答
  • 0 关注
  • 356 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号