python-3.x tkinter askstring在其可见性更改之前已删除

pnwntuvh  于 2023-01-10  发布在  Python
关注(0)|答案(4)|浏览(187)

我正在尝试做一个弹出窗口,人们可以填写在一个输入框字符串。我已经经历了许多例子,但它不工作。
我在努力做到这一点:

var_entry = simpledialog.askstring("Test", "Test")

我收到此错误消息:

_tkinter.TclError: window ".!_querystring" was deleted before its visibility changed

先谢了!
编辑:发布错误的错误消息

disho6za

disho6za1#

我知道这是一个老线索,但我有同样的问题,到目前为止还没有找到根本原因。
但是,如果其他人需要,此变通方法对我很有效:

#Create a new temporary "parent"

newWin = Tk()

#But make it invisible

newWin.withdraw()

#Now this works without throwing an exception:

retVal = simpledialog.askstring("Enter Value","Please enter a value",parent=newWin)

#Destroy the temporary "parent"

newWin.destroy()
isr3a4wc

isr3a4wc2#

我也能够通过使用上面的workaround suggested by John D来解决这个问题。
我对此做了一些研究,似乎在满足以下所有条件时会引发此异常。

  • 调用simpledialog.askstring方法的线程不是主线程。
  • 父级中指定的Tk窗口或default_root变量中指定的Tk窗口与调用simpledialog.askstring方法的线程不同。

但是,我无法想出一个处理这个问题的过程。我希望这有助于解决问题。

gpfsuwkq

gpfsuwkq3#

这个问题是因为askstring没有在主线程中调用,这是主线程,一定要在主线程中调用这个方法,比如这段代码就很好用。

from tkinter import Tk
from tkinter.simpledialog import askstring
a = Tk()
askstring('1', '2')
a.mainloop()

并且这段代码将在关闭对话框窗口时抛出异常。

from tkinter import Tk
from tkinter.simpledialog import askstring
from threading import Thread
a = Tk()
Thread(target=askstring, args=('1', '2')).start()
a.mainloop()
gmxoilav

gmxoilav4#

如果没有你的代码示例,我不确定,但是我认为这个错误消息意味着你放置'askstring'返回值或initialvalue的变量在对话框窗口完成之前超出了作用域。当我看到这个错误消息时,我把变量声明放在了内部作用域之外。请原谅我在这里使用C概念进行讨论(大多数Python用户宁愿忽略)。

answer = "dummy"
query_str = "dummy" # without these lines query_str and answer 
                    # can be cleaned up by Python 
                    # before the 'askstring' is done with them
while (1):
    query_str = "0"
    answer = simpledialog.askstring("Get Number",
                                   "Enter NextNumber",
                                   initialvalue = query_str)
    print(answer)
    print(query_str)
    time.sleep(1)

在循环作用域之外添加声明对我很有效。

相关问题