python弹出窗口后卡死_python的tkinter模块GUI编程为啥用了while循环之后就会使得程序出现卡死未响应崩溃?...

这位同学,首先无代码无真相。只能在这里猜测一下,你在GUI界面中点击了某个按钮,调用的函数然后触发了某种while循环,这个时候前台GUI将“未响应”卡死。不过一旦调用函数的while循环结束,GUI界面将再次可用。

不使用线程的话,后台while循环处理和前台GUI显示是依次串行的,做完一件事情才能做另一件。使用线程是GUI通常的做法,可以使后台while循环处理中的信息实时显示在前台GUI上。

关于tkiner的after方法,只是将函数的调用时间向后延时一些,进入调用的函数后与直接调用函数没有区别。

此外,根据题主说的request的事情,继续猜一下。首先来说下线程的事情,处理request的线程不能这样使用

p=Thread(target=a_while_func_about_request, args=(some_args))

p.start()

p.join()

这样使用线程虽然将主线程的while循环移到线程p的内部,但由于主线程一直等待p.join()什么也做不了,相当于主线程直接调用了a_while_func_about_request函数。要利用到线程的并发性能,主线程不能傻傻的p.join(),至少还需要一个标志变量,通过标志变量判断线程p是否完成request请求,例如:

# 主线程

request_done = False

p=Thread(target=a_while_func_about_request, args=(some_args))

p.start()

while request_done == False:

# 继续处理主线程逻辑

...

else:

# 根据request内容进行显示

...

p.join()

# 子线程部分

def a_while_func_about_request(some_args):

# request获取内容部分

...

request_done = True

2. GUI方面也需要根据程序逻辑设计:

情况一:在获取请求request内容的过程中GUI必须等待数据无法进行下一步操作,类似玩游戏时等待读进度条,无法跳过,GUI也无需提供其它操作。这种情况可以在等待期间显示一个“处理中...”的进度条,然后主线程定时检查request_done标志位(可以使用到after方法),等到request_done为True时,主程序知道request获取完毕,可以继续GUI后续的显示。

情况二:在获取request内容时,GUI继续显示某个主界面,稍后通过某个“读取结果”的按钮对结果进行显示,这样类似于游戏在读进度条的时候窗口切出去刷网页什么的,过一会儿再切回来看看进度条是否读好了。这种情况下,每次切回来看看进度条情况的相当于检查request_done标志位,根据是否完成设计GUI后续的显示流程。