首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的共享库无法在macOS上打开窗口

Python中的共享库无法在macOS上打开窗口
EN

Stack Overflow用户
提问于 2021-12-01 19:12:43
回答 1查看 30关注 0票数 0

我目前正在用C++开发一个强化学习环境游戏。C++代码控制图形和游戏逻辑,而我有Python绑定(通过共享库导入)来控制游戏流程(决策、步进等)。在我的Linux机器上运行这个环境没有问题:当我用Python运行绑定时,它会正确地打开GUI显示。但是,在我的macOS机器上,环境将不会呈现。奇怪的是,当我将C++代码编译为可执行文件而不是共享库并运行它时,图形用户界面窗口可以正确地显示环境。我怀疑Python在macOS上处理共享库的方式有所不同。

我使用CMake作为构建系统,SFML作为图形用户界面,pybind11作为Python绑定。有没有人有关于如何调试这个问题的想法?

下面是我的一些代码片段来说明我的观点:

C++绑定

代码语言:javascript
复制
#include <SFML/Graphics.hpp>                                                       
#include <pybind11/pybind11.h> 
#include <iostream>                                      
                                                                                   
namespace py = pybind11;                                                           
                                                                                   
void openWindow() {                                                                
    sf::RenderWindow window(sf::VideoMode(500, 500), "SFML");                      
    while (window.isOpen())                                                        
    {                                                                              
        // Update the window
        std::cout << 1;                    
        window.clear();                                                            
        window.display();                                                          
    }                                                                              
}                                                                                  
                                                                                   
PYBIND11_MODULE(test, handle) {                                                    
    handle.def("openWindow", &openWindow);                                         
} 

Python代码

代码语言:javascript
复制
from build.test import *                                                           
                                                                                   
def main():                                                                        
    openWindow()                                                                   
                                                                                   
if __name__ == "__main__":                                                         
    main() 

和CMakeLists.txt

代码语言:javascript
复制
make_minimum_required(VERSION 3.10)                                               
                                                                                   
project(main)                                                                      
                                                                                   
find_package(pybind11)                                                             
find_package(SFML 2.5 COMPONENTS REQUIRED graphics system)                         
                                                                                   
pybind11_add_module(test main.cpp)                                                 
target_link_libraries(test PUBLIC sfml-graphics sfml-system)

我知道渲染窗口的循环正在工作,而不是程序完全崩溃,因为在程序执行的整个过程中都会输出1。然而,我仍然不知道为什么窗口不会显示,甚至不知道如何调试这个问题。

EN

回答 1

Stack Overflow用户

发布于 2021-12-03 02:50:00

这就是解决方案。您的代码需要来轮询SFML事件,否则窗口将不会在macOS上呈现。

如果希望渲染代码,请在代码中插入以下代码行。

代码语言:javascript
复制
sf::Event event;
window.pollEvent(event);

再一次,我不确定为什么我的代码在没有这些行的情况下工作得很好,但是出于某种原因,在macOS上轮询事件是必要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70189962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档