【问题标题】:Can I allow tkinter's mainloop() and GLUT's glutMainLoop() run concurrently?我可以允许 tkinter 的 mainloop() 和 GLUT 的 glutMainLoop() 同时运行吗?
【发布时间】:2020-11-17 08:48:58
【问题描述】:

我正在编写一个 python tkinter 应用程序,它与我也在编写的 C++ 库接口。 C++ 库包含一个封装了一些 GLUT 函数的类。

我的主要功能(python)看起来像这样:

import sys
import tkinter as tk
import myCustomCppLibrary

#This sets up the GLUT bindings.
myCustomCppLibrary.Initialize()

root = tk.Tk()
# ... some stuff

#Something in mainloop() eventually calls glutMainLoop()
root.mainloop()
myCustomCppLibrary.Finalize()
sys.exit(0)

不幸的是,glutMainLoop 阻塞了root.mainloop(),这意味着一旦我的 GLUT 窗口启动,我的 tkinter GUI 就会失去功能。

我确实尝试将std::thread 对象添加到我的包装类中,但glutMainLoop 在退出后似乎退出了整个进程,这意味着在线程中运行它不利于干净退出。

我在想我可以使用 GLUT 的 atexit 向 tkinter 发出信号,它需要关闭并加入线程,但理想情况下,当我关闭 GLUT 窗口时,该过程不会结束(我不认为这会给一个干净的出口)。

是否有可能让这两个循环同时运行并且干净利落?

我想避免修改 GLUT 的源代码。

【问题讨论】:

    标签: python c++ opengl tkinter glut


    【解决方案1】:

    您不能将 GLUT 与其他窗口框架混合使用。至少不是没有经历很多痛苦。但人们不得不怀疑:GLUT 中有什么是您必须使用的?使用一些额外的模块,您可以在 TkInter Tkinter OpenGL context in Python 中创建 OpenGL 上下文

    【讨论】:

    • 有趣,我一定会调查的。我需要访问底层的 opengl 资源(我将一个 CUDA 数组绑定到一个 opengl 纹理)所以希望这是我可以做的。
    • @wvn:……但这如何让你依赖 GLUT?答:不会! – GLUT 只是一些“随机”的框架。最初创建是为了促进快速而肮脏的 OpenGL 修补程序。
    • 你当然是正确的,我绝不会受到 GLUT 的约束。我使用它只是因为我有另一个应用程序可以做类似的事情,所以我去熟悉了。我现在担心的是,如果我通过 Togl 运行我的 OpenGL 上下文,我将需要访问我的外部 C++/CUDA 库中的低级资源。对于像我这样不熟悉 OpenGL 的人来说,这将是一个挑战。无论哪种方式,可能都值得学习。
    • @wvn:就 CUDA 而言,GLUT 与 Togl 的差异:零差异。 OpenGL 几乎是一个“所见即所得”的 API。没有“隐藏的”,低级别的东西正在发生。 OpenGL 上下文是使用窗口系统特定 API(通常包装在框架中)创建的,从那里开始,就是这样。 GLUT 在促进 CUDA 方面没有做任何“特别”的事情(在 CUDA 出现之前很久就放弃了原始 GLUT 的开发)。
    • 再次查看我的一个旧 GLUT 项目的源代码后,实际上似乎做我需要的事情并不困难。我记得 OpenGL 是基于状态的,所以我假设我可以简单地创建和绑定纹理,只要它们都发生在同一个进程中。我认为现在前进的道路很明确。感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 2016-05-01
    • 2015-08-09
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多