如何使用 PyQT5 连接和分离外部应用程序或对接外部应用程序?

2024-02-09

我正在使用 ROS 为多机器人系统开发 GUI,但我对界面中最不想做的事情感到困惑:在我的应用程序中嵌入 RVIZ、GMAPPING 或其他屏幕。我已经在界面中放置了一个终端,但我无法解决如何向我的应用程序添加外部应用程序窗口的问题。我知道 PyQt5 有 createWindowContainer,使用窗口 ID 来停靠外部应用程序,但我没有找到任何示例来帮助我。

如果可能的话,我想将外部窗口拖放到我的应用程序中的选项卡式框架内。但是,如果这是不可能的或太难了,我可以在单击按钮后仅打开选项卡式框架内的窗口。

我已经尝试打开类似于终端方法的窗口(请参阅下面的代码),但 RVIZ 窗口在我的应用程序外部打开。

已经尝试翻译了附加/分离代码 https://stackoverflow.com/questions/54388685/issues-when-attaching-and-detaching-external-app-from-qdockwidget使用 wmctrl 命令将代码写入 linux,但不起作用。看我的代码在这里 https://pastebin.com/kWtKb4UN.

也已经尝试过rviz Python 教程 http://docs.ros.org/indigo/api/rviz_python_tutorial/html/但我收到错误:

回溯(最近一次调用最后一次): 文件“rvizTutorial.py”,第 23 行,位于 导入rviz 文件“/opt/ros/indigo/lib/python2.7/dist-packages/rviz/init.py”,第 19 行,在 导入 librviz_shiboken 导入错误:没有名为 librviz_shiboken 的模块

#  Frame where i want to open the external Window embedded
self.Simulation = QtWidgets.QTabWidget(self.Base)
self.Simulation.setGeometry(QtCore.QRect(121, 95, 940, 367))
self.Simulation.setTabPosition(QtWidgets.QTabWidget.North)
self.Simulation.setObjectName("Simulation")
self.SimulationFrame = QtWidgets.QWidget()
self.SimulationFrame.setObjectName("SimulationFrame")
self.Simulation.addTab(rviz(), "rViz")

# Simulation Approach like Terminal
class rviz(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(rviz, self).__init__(parent)
        self.process = QtCore.QProcess(self)
        self.rvizProcess = QtWidgets.QWidget(self)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.rvizProcess)
        # Works also with urxvt:
        self.process.start('rViz', [str(int(self.winId()))])
        self.setGeometry(121, 95, 940, 367)

我没有专门对此进行测试,因为我有旧版本的 Qt5,现在无法升级,而从 Qt5 5.10 开始,startDetached 还会返回 pid 以及启动进程的 bool 结果。 在我的测试中,我在启动等待创建窗口的 while 循环之前手动设置 procId(通过静态 QInputBox.getInt())。 显然还有其他方法可以做到这一点(并获取窗口的 xid)。

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import gi
gi.require_version('Wnck', '3.0')
from gi.repository import Wnck, Gdk


class Container(QtWidgets.QTabWidget):
    def __init__(self):
        QtWidgets.QTabWidget.__init__(self)
        self.embed('xterm')

    def embed(self, command, *args):
        proc = QtCore.QProcess()
        proc.setProgram(command)
        proc.setArguments(args)
        started, procId = proc.startDetached()
        if not started:
            QtWidgets.QMessageBox.critical(self, 'Command "{}" not started!')
            return
        attempts = 0
        while attempts < 10:
            screen = Wnck.Screen.get_default()
            screen.force_update()
            # this is required to ensure that newly mapped window get listed.
            while Gdk.events_pending():
                Gdk.event_get()
            for w in screen.get_windows():
                if w.get_pid() == procId:
                    window = QtGui.QWindow.fromWinId(w.get_xid())
                    container = QtWidgets.QWidget.createWindowContainer(window, self)                    
                    self.addTab(container, command)
                    return
            attempts += 1
        QtWidgets.QMessageBox.critical(self, 'Window not found', 'Process started but window not found')


app = QtWidgets.QApplication(sys.argv)
w = Container()
w.show()
sys.exit(app.exec_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 PyQT5 连接和分离外部应用程序或对接外部应用程序? 的相关文章

  • 如何在 Python 中使用 Selenium 运行无头 Chrome?

    我正在尝试使用 selenium 进行一些操作 我真的希望我的脚本能够快速运行 我认为使用无头 Chrome 运行我的脚本会使其速度更快 首先 这个假设是否正确 或者我是否使用无头驱动程序运行我的脚本并不重要 我希望无头 Chrome 能够
  • pyqt5调用url时处于无响应状态

    我刚刚在 pyqt 中实现了登录 但在调用 url 和获取响应之间 qt 窗口显示无响应状态 谁能建议我如何避免不响应状态 code class Login QDialog def init self height width parent
  • 使用另一个索引数组正确索引多维 Numpy 数组

    我正在尝试索引多维数组P与另一个数组indices 它指定我想要沿最后一个轴的哪个元素 如下所示 import numpy as np M N 20 10 P np random rand M N 2 9 index into the la
  • 我应该如何优化这个文件系统 I/O 绑定程序?

    我有一个 python 程序 它执行如下操作 从 csv 文件中读取一行 对其进行一些变换 将其分解为实际的行 因为它们将被写入数据库 将这些行写入单独的 csv 文件 除非文件已完全读取 否则返回步骤 1 运行 SQL Loader 并将
  • 如何管理返回到 QML 的动态分配的 QObject 的生命周期?

    我有这个代码 QVariant componentFromCode QString code QQmlComponent component new QQmlComponent engine engine gt setObjectOwner
  • Pymacs 助手在 30 秒后未启动

    我见过其他关于此的问题 但没有一个得到真正的回答 而且没有一个是我的问题 我有一个新系统 emacs 23 1 Centos 6 2 我认为 我下载了最新的 pymacs 并安装了它 但是 我得到 error Pymacs helper d
  • 使用 PyQt4 在 QWidget 上进行 eventFilter

    我有一个 QMainWindow 其中包含DrawingPointsWidget 该小部件随机绘制红点 我通过使用以下命令为 MouseHovering 事件安装事件过滤器 在 QMainWindow 的状态栏中显示鼠标坐标self ins
  • scikit-learn - 具有置信区间的 ROC 曲线

    我可以使用 ROC 曲线scikit learn with fpr tpr thresholds metrics roc curve y true y pred pos label 1 where y true是基于我的黄金标准的值列表 即
  • 计算两个表中等效行的交集

    我有两个 FITS 文件 让我们考虑一下例如第一个文件有 100 行和 2 列 第二个文件有 1000 行和 2 列 FITS FILE 1 FITS FILE 2 A B C D 1 2 1 2 1 3 1 2 2 4 1 2 我需要采取
  • 一个阻塞但非模态的 QDialog?

    我有一堆图像 我想对其执行一些操作 处理完每个图像后 我的程序应该弹出一个对话框 提示用户是否要继续处理下一个图像或中止 在此之前 他们应该有机会对图像或参数进行一些手动更改 无论如何 他们必须能够访问应用程序的窗口 而调用对话框的方法的执
  • 使用请求和多处理时的奇怪问题

    请检查这个Python代码 usr bin env python import requests import multiprocessing from time import sleep time from requests import
  • 在 Python 中删除表达式树及其每个子表达式树中第一个元素周围的括号

    目标是实现简化操作 删除表达式树及其每个子表达式树中第一个元素周围的括号 其中表达式作为括在各个括号中的字符串输入给出 这必须适用于任意数量的括号 例如 12 3 45 6 gt 123 45 6 删除 12 周围的括号 然后删除 45 周
  • Pytest - 如何将参数传递给 setup_class?

    我有一些代码 如下所示 我得到了too few args当我运行它时出错 我没有打电话setup class明确地 所以不确定如何向它传递任何参数 我尝试用以下方法装饰该方法 classmethod 但仍然看到相同的错误 我看到的错误是这样
  • python:Windows终端中的unicode,使用的编码?

    我在 Windows 7 终端中使用 Python 解释器 我正在尝试了解 unicode 和编码 I type gt gt gt s gt gt gt s x89 gt gt gt u u gt gt gt u u xeb 问题1 字符串
  • hashlib 和 urandom 哪个更随机?

    我正在和一个朋友一起开发一个项目 我们需要生成随机哈希 在我们有时间讨论之前 我们都提出了不同的方法 并且因为他们使用不同的模块 我想问你们大家什么会更好 如果有这样的事情的话 hashlib sha1 str random random
  • Python:使用 FOR 循环插入字典

    我已经在论坛中进行了搜索 但不明白是否可以使用以下构造将新条目插入到我的 Python 字典中 而不将其转换为列表 for x in range 3 pupils dictionary new key input Enter new key
  • Python-打印字符串一定次数[重复]

    这个问题在这里已经有答案了 可能的重复 Python 多次打印 https stackoverflow com questions 6293421 python printing multiple times 我想知道如何打印 String
  • 如何提取Python代码文件中使用的函数?

    我想创建代码文件中使用的所有函数的列表 例如 如果我们在名为 add random py 的文件中有以下代码 import numpy as np from numpy import linalg def foo print np rand
  • 如何使用 Google Drive API 通过服务帐户访问域中的共享文件?

    我一直在尝试从 Python 3 7 脚本访问有关 Google Shared Drive 文件的一些简单信息 上次修改共享云端硬盘上的 Google 表格文件的时间 我创建了一个服务帐户在 GCP Drive API 菜单中 它可以通过
  • 将下载的字体添加到 Tkinter

    我想下载一个开源字体并在我的 Python Tkinter 程序中使用它 如何告诉 Tkinter 从目录导入字体或将字体放在与程序相同的文件夹中 Note 我已经寻找答案一段时间了 甚至阅读了 Tkinter 的 API 参考 了解我能找

随机推荐

  • Ruby:意外的输入结束,需要 if 语句的 keywords_end

    我使用 Java 工作了几个月 现在正在转回 Ruby 我从以下代码中收到一个奇怪的错误 def count divisors divisor hash 25 times do i divisor hash i find dividends
  • << 目标 c 枚举中的运算符?

    我正在寻找一些东西并进入这个枚举是apple UITableViewCell h 如果这是微不足道的 我很抱歉 但我想知道 好奇这有什么意义 我知道 ruby 中的 enum UITableViewCellStateDefaultMask
  • 使用 javascript/jquery 用 html 填充 div

    这是我的问题 我有一个div div div 我想在某些条件下用其他代码填充它 p Showing results Key img src lt 1 nbsp img src lt 2 nbsp img src lt 3 nbsp img
  • FTP 脚本在放置后保留文件的时间戳

    我知道 FTP 不支持传输和保留文件日期 时间戳 想知道是否有人有任何想法 脚本 Shell perl 可以在放置操作后保留传输文件的时间戳 您是否可以尝试以 tar 文件传输文件 从 tar 中提取后 时间戳将被恢复
  • 处理器“org.thymeleaf.spring5.processor.SpringInputGeneralFieldTagProcessor”执行期间出错

    我正在尝试使用 thymeleaf 和 Spring boot 构建简单的搜索选项卡 这是我的代码和 html 文件 scCountry html
  • React Native (expo) 加载 Markdown 文件

    我在加载 Markdown 文件时遇到一些问题 md 进入我的本机反应 非独立的世博项目 找到了这个很棒的包 可以让我渲染它 但不知道如何加载本地 md文件作为字符串 import react from react import PureC
  • 如何阻止特定网站浏览器代理?

    最近 我遇到了数据挖掘机器人的一些问题 每天在一天中的某些时间从我的网站提取数据 这不仅会浪费我的带宽 还会向我的谷歌分析提供错误的数据 他们通常使用 amazonaws IP 进入 但最近他们已切换到其他主机 保持不变的是它们使用相同的用
  • 使用 jFreeChart 绘制磁滞回线

    我需要绘制磁滞环 然后计算环内闭合的面积 我正在使用 jFreeChart 考虑以下数据 hyst 0 0 hyst 1 0 hyst 2 0 0098 hyst 3 0 0196 hyst 4 0 0489 hyst 5 0 0879 h
  • Eclipse:“重构 - 重命名”完全混乱,替换文件中的任意字符

    在重构类名时 Eclipse 最近表现出非常奇怪的行为 例如 让我们看一下我们的一个课程 public class CampaignCSVPanel extends ContentPanel private FileUploadField
  • 如何向现有对象方法添加装饰器?

    如果我使用我无法控制的模块 类 我将如何装饰其中一个方法 我明白我可以 my decorate method target method 但我希望这种情况发生在任何地方target method无需执行搜索 替换即可调用 有可能吗 不要这样
  • Python DataFrame打印样式随机变化

    我正在使用 python 3 7 7 和 Visual Studio 代码 1 58 2 我正在使用 pyodbc 查询 mysql 数据库 但我相信我看到的问题发生在这之外 import pyodbc as po import panda
  • 如何删除领域对象及其子关系?

    我有一个大对象 它与其他对象有很多关系 这些对象也与其他对象有关系 因此 当我删除根对象时 我发现只有父对象被删除 而其所有关系都没有被删除 有没有办法在同一事务中删除整个树 领域不支持cascading delete目前 您可以为该功能投
  • 锁定(“Kiosk 模式”)Android 设备 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 在满足以下要求的同时 您将如何锁定 Android 设备 访问 Wifi 网络 访问单个公司的应用程序 能够下载 更新到公司应用程序的新版本 访问蓝牙
  • 嵌套 iframe,又名 Iframe Inception

    我正在尝试使用 jQuery 访问 div id element div div 所有 iframe 都位于同一域中 不存在 www 非 www 问题 我已成功选择第一个 iframe 中的元素 但未成功选择第二个嵌套 iframe 中的元
  • 单击图像后未出现日期选择器

    我有一个显示日期选择器的小提琴 我在下面编写了相同的代码 但没有任何反应 我做错了什么 当我单击绿色时 不会生成日期选择器 但在小提琴中它运行良好 我在哪里做错了 http jsfiddle net cBwEK 10 http jsfidd
  • C 在缓冲区中创建额外字节

    我今天一直在摆弄 C 当我注释掉这段代码中的第三个缓冲区时 我不明白输出的差异 include
  • 如何将样式应用于元素的所有子元素

    我有一个元素class myTestClass 如何将 css 样式应用于此元素的所有子元素 我只想将样式应用于元素子元素 不是它的孙子 我可以用 myTestClass gt div margin 0 20px 对所有人都有效div孩子们
  • 如何使用 C# 在 Windows 控制台应用程序中创建 ASCII 动画?

    我希望它能够显示非闪烁的动画 就像这个很棒的 Linux 命令一样 sl http www youtube com watch v 9GyMZKWjcYU http www youtube com watch v 9GyMZKWjcYU 我
  • 无法从 Windows 命令提示符运行 Spyder3

    我在已经安装了 Python2 的笔记本电脑上下载了 Python3 位于两个文件夹中Python3 and Python27分别 我有 Windows 10 64 位 Spyder exeand Spyder3 exe都在Scripts安
  • 如何使用 PyQT5 连接和分离外部应用程序或对接外部应用程序?

    我正在使用 ROS 为多机器人系统开发 GUI 但我对界面中最不想做的事情感到困惑 在我的应用程序中嵌入 RVIZ GMAPPING 或其他屏幕 我已经在界面中放置了一个终端 但我无法解决如何向我的应用程序添加外部应用程序窗口的问题 我知道