我正在尝试在关闭 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
我猜您正在使用旧的可视化 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 是坏人和邪恶更好的消息了。
虽然@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。