循环创建PyQt5按钮:所有按钮触发相同的回调

2023-12-08

我应该提到,我已经阅读了这些内容,但我仍然无法实现我的目标:

[在 for 循环中使用字典来创建按钮不起作用

[循环中的 QtCore.QObject.connect 仅影响最后一个实例

我的目标是制作一个 Linux“启动器”应用程序。按钮的创建、放置等工作就像一个魅力,但有一个问题 - 所有按钮都会触发相同的回调 - 最后一个在按钮创建循环中连接。

这是脚本的基本版本,用于说明我想要做什么:

class App(QMainWindow):

    def launch(self, filepath):
        subprocess.run(filepath)


    def __init__(self):
        super(App, self).__init__()

        for btn in matrix:

            filepath = matrix[btn]['path']
            icon = matrix[btn]['setIcon']
            posx = matrix[btn]['posx']
            posy = matrix[btn]['posy']

            matrix[btn] = QToolButton(self)
            matrix[btn].setIcon(QIcon(icon))
            matrix[btn].setIconSize(QSize(64, 64))
            matrix[btn].resize(100, 100)
            matrix[btn].move(posx, posy)
            matrix[btn].clicked.connect(lambda launch: self.launch(filepath))

        self.initUI()


    def initUI(self):

        self.setGeometry(150, 150, 1250, 650)
        self.setWindowTitle('LinuxLauncher')

        self.show()


    if __name__ == '__main__':

        app = QApplication(sys.argv)
        ex = App()
        sys.exit(app.exec_())

我知道有一个答案,但我已经研究了几个小时 - 我很感激有人能帮助我摆脱困境 - 谢谢!


我不明白矩阵是什么类型的结构,但我认为它相当于一个字典列表。

问题是您必须将其作为参数传递给分配它的 lambda 函数,单击的信号采用一个布尔值作为参数,该布尔值指示按钮是否被选中(默认情况下此属性被禁用,因此该值为 false ),您必须添加另一个参数。

class App(QMainWindow):
    def launch(self, filepath):
        subprocess.run(filepath)

    def __init__(self):
        super(App, self).__init__()

        matrix = [{"path": "path1", "setIcon": "icon1", "posx": 0, "posy": 0}, 
        {"path": "path2", "setIcon": "icon2", "posx": 0, "posy": 150},
        {"path": "path3", "setIcon": "icon3", "posx": 0, "posy": 300}]

        for value in matrix:

            filepath = value['path']
            icon =  value['setIcon']
            posx = value['posx']
            posy = value['posy']

            btn = QToolButton(self)
            btn.setIcon(QIcon(icon))
            btn.setIconSize(QSize(64, 64))
            btn.resize(100, 100)
            btn.move(posx, posy)
            btn.clicked.connect(lambda checked, arg=filepath: self.launch(arg))

        self.initUI()

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

循环创建PyQt5按钮:所有按钮触发相同的回调 的相关文章

随机推荐

  • 调整jqGrid页面编辑框的大小

    在我的 ASP NET MVC 3 应用程序中 我在 jqGrid 上启用了寻呼机 如下图所示 Page 的文本框 图像的中心 其中有数字 1 非常宽 比它需要的宽得多 有谁知道如何调整这个盒子的大小 当我的网格比这个窄时 这尤其是一个问题
  • Laravel API 连接多个数据库

    我正在使用 Laravel Lumen 构建 REST API 这个 API 的想法是为多个订餐网站提供后端 它们共享相同的后端逻辑 模型 控制器等 这样每个网站只需要它自己的前端应用程序 我计划为此使用 Angular 每个网站都有自己的
  • 尝试使用 PDO 连接访问数据库

    我正在尝试连接到 C 驱动器上的访问数据库 我在 INI 文件中取消了访问扩展 pdo 的注释 我运行了驱动程序测试 它显示 odbc 驱动程序已安装 我正在将 wamp 与 apache 服务器一起使用 但我不断收到此错误 SQLSTAT
  • 与 Typescript 一起使用的 ThemeProvide 出现错误

    我想创建一个组件 const StyledDiv styled div width 10rem height 3rem border radius 0 2rem background color theme colorVariant col
  • R 中近似子串匹配的位置

    我正在使用 R 进行字符串处理 我有一个带有一列字符串的数据框 例如 df lt data frame textcol c In this substring would like to find the position of this
  • Apache Beam Google Datastore ReadFromDatastore 实体 protobuf

    我正在尝试使用 apache beam 的 google datastore api 来 ReadFromDatastore p beam Pipeline options options p Read from Datastore gt
  • 宏重载

    是否可以定义这样的东西 define FOO x y BAR define FOO x sth y BAR sth 这样 FOO daf sfdas FOO fdsfs something 5 翻译成这样 BAR BAR something
  • UITableViewController 中的状态栏

    我用一个UITableViewController into a Navigation Controller当出现UIButton按下 当按钮被按下时TableViewController出现时没有状态栏 如果我选择一个单元格TableVi
  • FRestore文档onUpdate:仅针对特定字段触发

    在我的云功能中 我有下一个功能 export const collectionOnUpdate functions firestore document cards id onUpdate async change context gt a
  • Node.js + Socket.io |在服务器上设置自定义标头

    我使用 Helmet 和 Express 从服务器端设置相当多的安全 HTTP 标头 当在 Node js 应用程序顶部渲染客户端页面时 使用以下命令 这做得很好 var app express app use helmet res ren
  • 在另一个 IQueryable 中使用 IQueryable

    我有一个扩展方法 它返回一个 IQueryable 来获取公司产品 我只想在 IQueryable 中使用它作为子查询 public static class DBEntitiesCompanyExtensions public stati
  • 通过 JSF 将 PDF 发送到浏览器

    我正在尝试将 JasperReports 生成的 PDF 文件发送到用户的浏览器 我找不到托管 bean 方法中的问题 以下是一个片段 System out println Making pdf FacesContext fc FacesC
  • Windows Phone 8 上的 HttpWebRequest 同步

    为了设计 重用可用于 WPF 应用程序 Windows Phone 8 应用程序和更高版本的 Windows 8 RT 应用程序的库 我们需要进行一些 HttpWebRequest 调用 最好是同步调用 以免破坏现有应用程序 问题是已经存在
  • 使用 AJAX 和 JQuery 通过 PHP 进行简单验证

    我是新来的AJAX 我想学习如何验证表单 假设我有一个带有两个输入字段的表单 当我点击提交时 我想用 php 脚本检查页面 验证成功后我想重定向到action submitForm php 当一个或多个字段根据validation php我
  • OpenVINO:如何使用推理引擎构建 OpenCV 以支持从模型优化器加载模型

    我安装了 OpenVINO 并想在 Windows 10 上运行以下代码 import numpy as np import cv2 import sys from get face id import face id getter fro
  • 如何在 Oracle 11gr2 中安装 Procedural Option

    我一直在尝试在计算机上本地安装的 Oracle 11gR2 上创建 PL SQL 包并运行过程 但一直收到 ORA 00900 错误 基于此article 看来Procedural Option还没有安装 这是我登录时 sqlplus 的输
  • 事件驱动编程如何帮助仅执行 IO 的 Web 服务器?

    我正在考虑为我们的新后端项目使用一些框架 编程方法 它涉及 BackendForFrontend 实现 聚合下游服务 为简单起见 以下是它所经历的步骤 请求进入网络服务器 Web服务器发出下游请求 下游请求返回结果 Web服务器返回请求 事
  • CodeIgniter 2.0 - 验证数组

    我在将一段表单验证代码转换为 CI 2 0 时遇到一些问题 我正在尝试验证一组复选框 但由于某种原因验证无法运行回调或不验证 如何验证一组复选框 以便至少选中一个并且值必须是选项之一 选项数组的键 EDIT 这是对我失败的地方的更好解释 可
  • 使用 na.approx 在数据框中插入 NA 值

    我正在尝试删除NA通过插值从我的数据框中获取na approx 但无法删除所有NAs 我的数据帧是 4096x4096 其中 270 15 作为无效值的标志 我需要在所有点上连续的数据来提供气象模型 昨天我询问并获得了关于如何基于另一个数据
  • 循环创建PyQt5按钮:所有按钮触发相同的回调

    我应该提到 我已经阅读了这些内容 但我仍然无法实现我的目标 在 for 循环中使用字典来创建按钮不起作用 循环中的 QtCore QObject connect 仅影响最后一个实例 我的目标是制作一个 Linux 启动器 应用程序 按钮的创