如何使用 PyQt 在按钮单击时调用 python 脚本

2023-12-12

我使用 PyQt4 创建了一个带有按钮的表单。在此按钮上,我想调用另一个 python 脚本,如下所示:

文件1.py:

import sys
from PyQt4 import QtCore, QtGui


from file1_ui import Ui_Form


class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MyForm()
    myapp.show()
    sys.exit(app.exec_())

文件1_ui.py

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(400, 300)
        self.pushButton = QtGui.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(120, 200, 95, 20))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))

        self.retranslateUi(Form)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), Form.close)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("Form", "Close", None, QtGui.QApplication.UnicodeUTF8))

File2.py

import sys
from PyQt4 import Qt
from taurus.qt.qtgui.application import TaurusApplication

app = TaurusApplication(sys.argv)
panel = Qt.QWidget()
layout = Qt.QHBoxLayout()
panel.setLayout(layout)

from taurus.qt.qtgui.panel import TaurusForm

panel = TaurusForm()

model = [ 'test/i1/1/%s' % p for p in props ]
panel.setModel(model)

panel.show()
sys.exit(app.exec_())

File1_ui.py 是从 Qtdesigner 创建的,然后我使用 File1.py 来执行它。因此 File2.py 单独执行时会打开一个面板并显示一些属性。我希望在第一个按钮单击时调用此脚本我使用 Qtdesigner 创建的 form(file1.py)。您能让我知道如何实现此功能吗?谢谢。


您将需要进行一些修改File2.py根据它是否独立运行来进行适当的调用。当您通过启动脚本时File1.py已经有一个QApplication正在运行事件循环的实例,因此尝试创建另一个并运行其事件循环将导致问题。

首先,将脚本的核心部分移至其自己的函数中。这将使您可以轻松地从File1.py。然后,您可以处理脚本独立运行并需要创建一个的情况QApplication实例并启动其事件循环。(我不熟悉您正在使用的 taurus 库,但您可能可以替换 TaurusApplication for QtGui.QApplication)

文件2.py:

import sys
from PyQt4 import QtCore, QtGui

def runscript():
    panel = QtGui.QWidget()
    layout = QtGui.QHBoxLayout(panel)
    return panel # Must return reference or panel will be deleted upon return


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    panel = runscript()
    panel.show()
    sys.exit(app.exec_())

假设您的文件位于同一目录中,您可以简单地编写import File2并使用File2.runscript()运行您的代码。然后您只需将该功能连接到您的按钮clicked()发出运行它的信号。这里唯一的问题是对QWidget从返回runscript()如果直接连接到,功能将丢失(并且对象被删除)runscript()。为此我创建了一个方法launch_script()它保存了一个参考MyForm.

文件1.py:

import sys
from PyQt4 import QtCore, QtGui

from file1_ui import Ui_Form
import File2

class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)

        # This is a bit of a hack.
        self.ui.pushButton.clicked.connect(self.launch_script)

    def launch_script(self):
        self.panel = File2.runscript()
        self.panel.show()


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MyForm()
    myapp.show()
    sys.exit(app.exec_())

我不使用 Qt Designer,所以我不知道将信号连接到的正确方法launch_script()。我编写的代码应该可以工作,但显然违反了 OOP 原则,并且依赖于软件分配的按钮小部件的名称。

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

如何使用 PyQt 在按钮单击时调用 python 脚本 的相关文章

  • 下载 PyQt6 的 Qt Designer 并使用 pyuic6 将 .ui 文件转换为 .py 文件

    如何下载 PyQt6 的 QtDesigner 如果没有适用于 PyQt6 的 QtDesigner 我也可以使用 PyQt5 的 QtDesigner 但是如何将此 ui 文件转换为使用 PyQt6 库而不是 PyQt5 的 py 文件
  • InterfaceError:连接已关闭(使用 django + celery + Scrapy)

    当我在 Celery 任务中使用 Scrapy 解析函数 有时可能需要 10 分钟 时 我得到了这个信息 我用 姜戈 1 6 5 django celery 3 1 16 芹菜 3 1 16 psycopg2 2 5 5 我也使用了psyc
  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • 如何生成给定范围内的回文数列表?

    假设范围是 1 X 120 这是我尝试过的 gt gt gt def isPalindrome s check if a number is a Palindrome s str s return s s 1 gt gt gt def ge
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • Nuitka 未使用 nuitka --recurse-all hello.py [错误] 编译 exe

    我正在尝试通过 nuitka 创建一个简单的 exe 这样我就可以在我的笔记本电脑上运行它 而无需安装 Python 我在 Windows 10 上并使用 Anaconda Python 3 我输入 nuitka recurse all h
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例

随机推荐

  • ASP.NET 5 Identity 3 用户在一段时间后注销

    我使用 RC1 位和外部 Google 身份验证 没有 Identity EntityFramework 在登录过程中 我设置了 记住我 标志 登录用户在浏览器重新启动 我看到 cookie 设置为 14 天后过期 和网站重新启动后仍然存在
  • 如何解决上下文中重新渲染过多的问题?

    每当我更新的时候user object in users array 在上下文中 所有使用的组件users重新渲染 我尝试过的 我有一个使用上下文中的值的组件 const DashboardCardList gt const context
  • MySQL - 从 PHP 插入日语 - 编码问题

    我正在尝试在 mysql 表中插入一些日语单词 如果我使用 phpMyAdmin 插入 则 phpMyAdmin 可以正常显示该单词 但如果我尝试通过 php 插入它 如下所示 mysql connect Host User Passwor
  • 使用xpath和java解析xml

    现在我想解析来自 webservice 的 xml 为了解析 我使用了xpath和java 我有以下代码 package test client import com sun org apache xpath internal NodeSe
  • 如何使用“api”或“implementation”指令从 gradle 插件获取依赖项

    背景 运行 Android Studio 3 0 beta7 并尝试获取一个适用于 Android 库的 javadoc 任务 事实上 这首先不能作为现成的任务提供 这真的很奇怪 我设法调整了一个根据我的需要回答不同的问题 最后得到这个代码
  • Pygame-创建更多 USEREVENT 类型事件的方法?

    这个问题是由于需要创建大量 USEREVENT 类型事件而产生的 由于我找不到有关如何创建超出限制的用户事件的信息 因此我来这里寻求帮助 目前我知道USEREVENT类型事件的值为24 最大允许的id为31 我还发现一些id s被保留 至少
  • 如何更改 Android Things 设备上的日期?

    我正在 Raspberry Pi 3 Model B 上使用 Android Things Developer Preview 有什么方法可以设置正确的日期 时间 时区 最简单的方法可能是使用date通过 ADB 执行 shell 命令 它
  • 检测何时按下标签栏项目

    我有一个根视图控制器 它没有设置为故事板上任何视图控制器的自定义类 相反 我的所有视图控制器都像这样子类化此类 RootViewController class RootViewController UIViewController UIT
  • Java中字符串结束符

    我正在解决一个简单的问题 在Java中删除字符数组中的某些字符 想法很简单 static void remove char char arr char c int r 0 for int i 0 i lt arr length i if a
  • 实时音频队列录音回放

    嘿伙计们 我正在尝试构建一个用于实时变声的应用程序 第一步 我设法将音频数据录制到指定文件并在录制后播放 现在我尝试更改在循环录制音频缓冲区后立即播放音频缓冲区的代码 我的问题是 如何直接从录音音频队列中读取音频数据 而不是 如文档中所示
  • 从 adb 获取包的可启动活动名称

    有没有办法从使用中获取包的可启动活动adb 对于未root的手机 即无需从中拉出apk data app目录并检查appt 我尝试了 dumpsys 但它不包含有关默认可启动活动的信息 Thanks 您不需要 root 即可从中提取 apk
  • 100% CPU 使用率下的 Java 线程优化

    我有一个应用程序 它接受队列上的工作 然后旋转该工作以在独立线程上完成 线程数量并不多 比如最多 100 个 但这些都是密集型任务 可以快速将 CPU 提升到 100 为了以最快的速度完成最多的工作 当我需要做更多的工作时 我最好只启动更多
  • 杀死在 Matlab 中创建的 Excel 进程

    鉴于我写入工作簿 目前我会终止所有 Excel 进程 以便我的代码在循环调用时可以正常工作 xlswrite path values system taskkill F IM EXCEL EXE 这使得我在处理另一个 Excel 文件时无法
  • Chrome Webstore 内联安装与 AngularJS

    我是 AngularJS 的新手 并尝试按照以下步骤安装 Chrome 扩展网上商店内联安装指南 在我的 html 文件中
  • 使用 Google Sheets API 和服务帐户时收到 403 禁止

    我有一个使用服务帐户的应用程序 因为它从 cron 作业运行 所以我无法让它通过浏览器中的用户进行授权 以下是我创建床单服务的方法 private static final String APPLICATION NAME my app pr
  • XStream 中的单元素数组错误

    如果你有这样的函数 List
  • 动态添加 Django 表单集实例并使用 HTMX POST 的正确方法是什么?

    我正在制作一个表格嵌套动态表单集 using htmx我 想逃避使用JS 但如果没有选择 实例更多表单集字段为了使动态嵌套形式 但是当我POST 仅数据来自1 个实例 of the Chlid formset 最后一个 已发布 表单的其余部
  • jQuery 事件处理程序的 JavaScript 闭包

    我有一个对象列表 每个对象都有一个 bullet 它是一个 SPAN 我想将跨度上的单击绑定到处理程序 而不是使用 jQuery 在跨度上执行特定操作 我看到一些我不理解的行为 所以我希望有人可以解释发生了什么 基本上 第一个代码示例有效
  • 使用鼠标中键滚动按钮禁用浏览器滚动

    我的页面上有一个 Flash 元素 您可以使用鼠标中滚轮与其进行交互 页面很长 因此 当使用鼠标滚轮滚动时 它会与 Flash 元素交互并滚动浏览器窗口 有没有办法在 Flash 元素处于活动状态时禁用浏览器滚动
  • 如何使用 PyQt 在按钮单击时调用 python 脚本

    我使用 PyQt4 创建了一个带有按钮的表单 在此按钮上 我想调用另一个 python 脚本 如下所示 文件1 py import sys from PyQt4 import QtCore QtGui from file1 ui impor