运行 open3d 窗口并关闭它后,tkinter 消息框崩溃并给出请求失败的 X 错误:BadWindow(无效的窗口参数)

问题描述 投票:0回答:2

我正在尝试在关闭 open3d 窗口后添加一个消息框,是的,没有问题。

重现错误的代码:

open3d.visualization.draw_geometries([])
#create yes no
dialougdialog = messagebox.askquestion("Remove Object", "Remove Object?", icon='warning')

我无法在网上找到答案,chatgpt 给了我一个我不明白的通用答案。 如果有人遇到此问题或类似问题,我将很高兴知道您如何处理此错误。

提前谢谢您。

点击“是”后出现错误:

X Error of failed request:  BadWindow (invalid Window parameter)
  Major opcode of failed request:  15 (X_QueryTree)
  Resource id in failed request:  0x6a04d88
  Serial number of failed request:  58195
  Current serial number in output stream:  58195
python tkinter open3d
2个回答
4
投票

我猜您正在使用旧的可视化 GUI 内容遇到与以下已关闭的 open3d 问题中描述的相同的情况。

https://github.com/isl-org/Open3D/issues/1715

如上所述,迄今为止找到的最佳解决方案是切换到新的基于灯丝的 GUI,因为它知道不受 open3d 可视化 gl 代码控制的其他窗口。

排序的答案是可视化方法将 gl 窗口的焦点切换到前面,然后假设同一程序中没有其他窗口窃取它们的焦点。因此,当切换到 tkinter gui open3d 可视化代码时,它不会注意到它不是绘制到 gl 窗口,而是绘制到它无法访问的 tkinter。 - 任何其他程序在输入 gl 绘图代码时都会简单地确保它绘制到正确的窗口并抓住焦点。

编辑: 以上内容适用于您在帖子中所写的内容。但是,当您的意思是在标题“运行 open3d 窗口并关闭它之后,tkinter 消息框崩溃并给出请求失败的 X 错误:BadWindow(无效的窗口参数)”时,情况并非如此。

你的帖子让我假设可视化窗口仍然打开。那么你是关闭可视化窗口然后打开 tkinter 窗口还是在 open3d 可视化打开的情况下打开 tkinter 窗口?

编辑 在我自己的项目中做了一些研究。

Tkinter
是令人讨厌的无视野兽。我最终求助于使用
subprocess
模块来沙箱
filedialog.askdirectory
messagebox.askyesnocanel
。您可以在 https://github.com/isl-org/Open3D/issues/6125 上找到我的解决方案。

抱歉没有比说 Tkinter 是坏人和邪恶更好的消息了。


0
投票

虽然@Hernot的解决方案有效,但它非常冗长,并且很难适应一个人的特殊情况。

非常感谢他们的回答,将 Tkinter 与问题联系起来,让我来到这里。 就我而言,出现问题是因为我正在使用模块

tkinter.filedialog

我通过将调用放入线程中并使用 python 列表来检索结果来修复它:

import threading

tkinter_thread_answer = []

ask_open_files = lambda tgt: tgt.append(filedialog.askopenfilenames("""Your arguments..."""))
ask_open_files_t = threading.Thread(target=ask_open_files, args=(tkinter_thread_answer,))
ask_open_files_t.start()
ask_open_files_t.join()

files = tkinter_thread_answer.pop(0) # Retrieve the filedialog answer here

NB:对我来说,问题出现在 Linux Ubuntu 上,但没有出现在 Windows 上。该解决方案适用于两种操作系统。我不知道MacOS。

© www.soinside.com 2019 - 2024. All rights reserved.