PyQt5 按钮未连接

2024-02-11

我正在尝试使用 PyQT5 构建一个简单的 GUI,其中有 3 个按钮用于打开文件浏览器,还有一个按钮用于对所选文件进行处理,但我无法让按钮连接到执行此操作所需的功能。

In the Ctrl类,该_connect_signals函数似乎没有被调用_input_select。谁能帮我弄清楚为什么?

import sys

# Import QApplication and the required widgets from PyQt5.QtWidgets
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QVBoxLayout
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QFileDialog


# Create a subclass of QMainWindow to setup the calculator's GUI
class UI(QMainWindow):
    """App's View (GUI)."""

    def __init__(self):
        """View initializer."""
        super().__init__()
        # Set some main window's properties
        self.setFixedSize(300, 150)
        # Set the central widget and the general layout
        self.generalLayout = QVBoxLayout()
        self._centralWidget = QWidget(self)
        self.setCentralWidget(self._centralWidget)
        self._centralWidget.setLayout(self.generalLayout)
        # Create the buttons
        self._create_buttons()

    def _create_buttons(self):
        """Create the buttons."""
        self.buttons = {}
        buttons_layout = QVBoxLayout()
        # Button text | position on the QVBoxLayout
        buttons = {
            "Select input file...": 0,
            "Select config file...": 1,
            "Select output file...": 2,
            "Run": 3,
        }
        # Create the buttons and add them to the grid layout
        for btnText, pos in buttons.items():
            self.buttons[btnText] = QPushButton(btnText)
            buttons_layout.addWidget(self.buttons[btnText], pos)
        # Add buttons_layout to the general layout
        self.generalLayout.addLayout(buttons_layout)


# Create a Controller class to connect the GUI and the model
class Ctrl:
    """App's Controller."""

    def __init__(self, setup, view):
        """Controller initializer."""
        self._view = view
        self._setup = setup
        # Connect signals and slots
        self._connect_signals()

    def _input_select(self):    # Not being called
        print("input selection")

        options = QFileDialog.Options()
        file_select, _ = QFileDialog.getOpenFileNames(
            self,
            'Select Input File...',
            '',
            'CSV Files (*.csv);;All Files (*)',
            options=options
        )
        if file_select:
            self._setup["input"] = file_select

    def _connect_signals(self):
        """Connect signals and slots."""
        self._view.buttons["Select input file..."].clicked.connect(self._input_select)  # Not working!


# Client code
def main():
    """Main function."""
    # Create an instance of `QApplication`
    app = QApplication(sys.argv)
    # Show the app's GUI
    view = UI()
    view.show()
    setup = {}
    # Create instance of the controller
    Ctrl(setup=setup, view=view)
    # Execute app's main loop
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

如果有帮助的话,我从屠宰开始这个示例代码 https://github.com/realpython/materials/blob/master/pyqt-calculator-tutorial/pycalc/pycalc.py来自真正的 Python 教程,但一定已经打破了它。


问题是您没有保留对Ctrl()您正在创建的实例。这会导致 Python 在实例创建后立即对其进行垃圾收集。

要解决这个问题,只需将其分配给一个变量即可:

def main():
    """Main function."""
    # Create an instance of `QApplication`
    app = QApplication(sys.argv)
    # Show the app's GUI
    view = UI()
    view.show()
    setup = {}
    # Create instance of the controller
    ctrl = Ctrl(setup=setup, view=view)
    # Execute app's main loop
    sys.exit(app.exec_())

一些注意事项:

  • 虽然将逻辑与界面分离通常是一种很好的做法,但这个概念需要谨慎使用,因为有时它只会使事情变得比应有的更加复杂。大多数时候(尤其是简单的程序),它只会生成更大的代码库,而不会带来任何实际好处:它更难阅读和调试,并且您可能最终会不断地从逻辑部分和 ui 部分切换代码;
  • 您的代码显示了该概念的缺点之一:当您创建文件对话框时,您正在使用self,但在这种情况下它指的是Ctrl实例,而参数应该是UI相反,实例(这将导致崩溃,因为 Qt 将获得意外的参数类型);您可以使用self._view相反,但是,如前所述,在这种情况下的整个分离只会使事情变得不必要的复杂;
  • 使用字符串作为引用内部对象的字典键很少是一个好主意(特别是当像您一样使用长描述性字符串时);
  • 当从模块导入多个元素时,通常最好将它们分组,而不是使用单行导入:它使代码更整洁,更易于阅读和检查:from PyQt5.QtWidgets import (QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QFileDialog)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQt5 按钮未连接 的相关文章

随机推荐

  • Ada.Containers.Functional_Maps 在 Ada2012 中可用吗?

    有关的信息Ada Containers Functional Maps https docs adacore com gnat rm docs html gnat rm gnat rm the gnat library html ada c
  • Hugo 帖子目录出现在主页上,但不显示帖子

    对于我的 blogdown 创建的网站 使用Xmin https themes gohugo io hugo xmin 主题 帖子目录 我可以从中查看单个帖子 出现在主页上 而不是单个帖子 https joshuamrosenberg co
  • 使用 QuickBooks Web 连接器的身份验证问题:未将对象引用设置为对象的实例

    我有一个 SOAP 服务器来处理来自 QuickBooks Web Connector 的连接 它调用的第一个方法是 authenticate 它正确返回它期望的数据 但是它给了我错误 QBWC1012 Authentication fai
  • 每 X 行将 pandas 数据框装箱

    我有一个简单的数据框 我想每 3 行对其进行装箱 它看起来像这样 col1 0 2 1 1 2 3 3 1 4 0 我想把它变成这样 col1 0 2 1 0 5 我已经发过类似的问题了here https stackoverflow co
  • 通过构造进行 VBA 继承的后续操作,构造函数不起作用?

    这是后续this https stackoverflow com questions 42235854 vba inheritance via construction constructor not working 42236148 no
  • 如何确定 pip3 在何处安装非用户安装的二进制文件/脚本? [复制]

    这个问题在这里已经有答案了 我可以确定 pip 在哪里安装软件包二进制文件 脚本pip3 install user mypackage using python3 m site user base bin 是否有一种机制可以确定在哪里non
  • 在 R 中创建数据框的更好方法

    我使用相对原始且某种 愚蠢 的方式创建了下面的示例数据框 我想知道是否有更短 更简洁的方法这样做 万分感谢 library pedquant PECCPC lt md stock c 600028 601857 00386 HK 00857
  • Android 声音池时序

    有没有可靠的方法来防止声音池中的声音被截断 我在声音之间使用 sleep 函数取得了一些成功 但有时它们仍然会在开始另一个声音之前错过最后一点声音 我的应用程序按顺序播放短声音 杰瑞 虽然这是一个老问题 但我想我应该在这里发布一些东西 因为
  • 如何使用当前conda环境的python路径作为脚本的shebang?

    假设您有 2 个 conda 环境 py3 env and py3 clone env 如果你有一个script py具有以下结构 shebang import sys def main print hello world file sys
  • R 可以就地进行 cumsum 等操作吗?

    在Python中我可以这样做 a np arange 100 print id a shows some number a np cumsum a print id a shows the same number 我在这里所做的是替换con
  • .NET4.0:更新字典及其值的线程安全方式

    我有一个静态字典 我想安全地更新它 最初 字典将为空 但在应用程序的生命周期中 它将添加新值 此外 整数值将充当可以递增和递减的单独计数器 private static Dictionary
  • 该 ER 图是否应该使用三元关系

    我一直在查看 ER 图的示例以更好地理解它们 我发现了一张 ER 图 我不确定它是否正确 这是问题 规范 UPS 自豪地拥有有关每个邮件的处理和当前位置的最新信息 已发货的物品 为此 UPS 依靠全公司范围的信息系统 运送的物品有 UPS
  • AccessibilityNodeInfo - 发送文本

    我正在开发一个 Android 应用程序 我必须将文本发送到焦点EditText其他应用领域 我已经做到了API level 18及以上使用AccessibilityService 当我找到EditText 我从剪贴板粘贴数据 这是代码 p
  • 需要在多维数组中查找或计算重复项

    我需要计算多维数组中重复项的数量 并在发现重复项时发出警报 Arr 2 sk 3 df 7 uz 3 df 7 gh 建议 计数可以通过这种方式完成 如果 arr 0 位置等于下一个即将到来的位置 那么它必须给出一个计数并需要检查两个值组合
  • 将 socket.io 与 redux 结合使用

    这是我第一次使用socket io在生产中 我在用React Redux 我最近集成了socket io使用 redux 及其工作正常 但我不确定这是否是实现我所做的事情的最佳方法 因为我还没有找到带有 redux 的 socket io
  • 使用 XObject 包含外部图像的 PDF

    我正在尝试构建一个带有外部文件链接的 PDF 文件 我正在使用规范https www adobe com content dam Adobe en devnet acrobat pdfs pdf reference 1 7 pdf http
  • VSCode 远程容器 - 错误:ENOSPC:设备上没有剩余空间

    我一直在使用VSCode 远程容器插件 https marketplace visualstudio com items itemName ms vscode remote remote containers一段时间没有问题 但是今天 当我
  • Python运行时:重新编译和重用C库

    我正在开发一个用于用户定义函数的数值分析的工具 这个想法是用 Python 制作一个方便的 UI 用户可以在其中输入 C 函数 然后按下按钮 并接收一些输出数据 计算可能需要几分钟或几小时 因此仅使用 Numpy 的性能是不可接受的 我尝试
  • 确定android CPU速度?

    我的一位朋友从事手机游戏开发 那么他面临的问题是这样的 在他的游戏中 一些 root 的手机用户能够获得非常高的分数 这是完全不可能的 除非 Android 设备的 CPU 或系统时钟速度很慢 情况就是如此 这些用户使用一些第三方应用程序
  • PyQt5 按钮未连接

    我正在尝试使用 PyQT5 构建一个简单的 GUI 其中有 3 个按钮用于打开文件浏览器 还有一个按钮用于对所选文件进行处理 但我无法让按钮连接到执行此操作所需的功能 In the Ctrl类 该 connect signals函数似乎没有