pysunred 发表于 2023-3-15 16:50:03

通过双击事件,弹出一个新窗口,关闭原窗口后报错

我想通过双击事件,打开一个窗口,显示双击的数据详细信息。
同时关闭原来的窗口,
以下命令不关闭原来窗口,是不会报错,
添加了all_tk.destroy(),关闭原来窗口就报错。

请教下高手,是什么原因?
有没有解决方法,

命令如下:
    def doubleClick(event):
      global mody_data
      e = event.widget# 取得事件控件
      iid = e.identify("item", event.x, event.y)# 取得双击项目id
      mody_data = e.item(iid, "values")# 取得双击项目数据
       # print(mody_data)
      revise(mody_data)      # 新窗口
      all_tk.destroy()          # 关闭现有窗口



报错信息如下:
invalid command name ".!treeview"
    while executing
"$w identify row $x $y"
    (procedure "ttk::treeview::DoubleClick" line 2)
    invoked from within
"ttk::treeview::DoubleClick .!treeview 450 381 "
    (command bound to event)

isdkz 发表于 2023-3-15 16:53:06

根据您提供的错误信息,看起来是与 Tkinter 的事件处理机制相关的问题。在事件处理函数中使用 all_tk.destroy() 可能会导致该窗口被关闭,而 Tkinter 同时也会尝试调用事件处理函数。这可能会导致在事件处理函数中对已销毁窗口的引用,从而导致 invalid command name 错误。

解决这个问题的方法是在事件处理函数中避免使用 destroy() 方法关闭主窗口。相反,您可以使用 withdraw() 方法隐藏窗口,然后在打开新窗口之后再关闭主窗口。以下是一个可能的解决方案:

def doubleClick(event):
    global mody_data
    e = event.widget# 取得事件控件
    iid = e.identify("item", event.x, event.y)# 取得双击项目id
    mody_data = e.item(iid, "values")# 取得双击项目数据
    # print(mody_data)
    all_tk.withdraw()# 隐藏现有窗口
    revise(mody_data)# 新窗口
    all_tk.destroy()   # 关闭现有窗口
这个解决方案使用了 withdraw() 方法来隐藏主窗口,然后在打开新窗口之后再调用 destroy() 方法关闭主窗口。这应该可以避免出现上述错误。

pysunred 发表于 2023-3-15 17:36:25

isdkz 发表于 2023-3-15 16:53
根据您提供的错误信息,看起来是与 Tkinter 的事件处理机制相关的问题。在事件处理函数中使用 all_tk.destr ...

刚刚测试了下,还是会报错

Threebody1 发表于 2023-3-15 18:41:36

pysunred 发表于 2023-3-15 17:36
刚刚测试了下,还是会报错

try except

pysunred 发表于 2023-3-16 10:37:38

Threebody1 发表于 2023-3-15 18:41
try except

怎么做?

Threebody1 发表于 2023-3-16 16:42:03

pysunred 发表于 2023-3-16 10:37
怎么做?

try:
    #代码
except:
    # 如果报错
页: [1]
查看完整版本: 通过双击事件,弹出一个新窗口,关闭原窗口后报错