[tkinter]在非主线程中调用askinteger ()方法出错解决

本文讲述了在Tkinter中,由于GUI操作必须在主线程中执行,所以在非主线程中调用如askinteger等方法时会出现错误。提供了两种解决方案:设置parent属性或创建一个不可见的Toplevel窗口。
摘要由CSDN通过智能技术生成

在非主线程中,调用tkinter.simpledialog中的弹窗方法,报错:_tkinter.TclError: window .!_queryinteger was deleted before its visibility changed

在Tkinter中,所有的GUI操作都应该在主线程(即Tkinter的事件循环线程)中执行。

两个解决方法

1.askinteger ()中设置parent属性

      retVal = simpledialog.askstring("Enter Value","Please enter a value",parent=newWin)
         子线程中,创建主窗口后,askstring中加一个 parent参数

转载:https://stackoverflow.com/a/62582066/23750398

2.创建一个Toplevel()窗口

        通过创建一个Toplevel()窗口 (tkinter中一个窗口控件,虽然是一个独立窗口但又依赖于根窗口不能独立存在) 建立的对话框: 

<pre class="brush: python;"> class Dialog(Toplevel): def __init__(self, parent, title = None): Toplevel.__init__(self, parent) </pre>

        

        而在默认没有指定父控件的情况下会使用默认的根窗口进行初始化:

<pre class="brush: python;"> if not parent: parent = tkinter._default_root </pre>

        既然在主线程的调用工作的很好,而子线程调用就出问题,很可能就是多线程冲突的问题,那解决办法就很简单了:将调用到主线程的东西(根窗口对象)改为new一个新的根窗口传给Toplevel,但同时由于这个新窗口我们其实并不想要看到它,所以还需要让它不可见,并且及时销毁:

<pre class="brush: python;"> t_root = tk.Tk() t_root.withdraw() str = askstring(parent=t_root, title='title', prompt="message") t_root.destroy() </pre>

转载:[tkinter]在非主线程中调用askstring()方法出错的解决方案 - bush20000的个人空间 - OSCHINA - 中文开源技术交流社区

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值