首页 > 解决方案 > 如何从另一个 python 文件访问 QPushButton?

问题描述

我正在创建一个应用程序并有一个用于按钮方法的 python 文件。我试图通过单击它来更改按钮的样式表,但是,我无法从类外部更改按钮。

示例:(ui 来自 QtDesigner UI 文件)

Python文件主要:

class Main(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.setupUi(self)
        self.button.clicked.connect(ButtonMethods.buttonPushButtonClicked)

Python文件按钮方法:

from Main import Main
def buttonPushButtonClicked():
    Main.button.setStyleSheet(...)

有可能这样做吗?我有很多按钮,我不想将所有方法都塞进同一个类中。

标签: pythonpython-3.xpyqtpyqt5

解决方案


我宁愿把所有东西都放在一个类中并使用self而不是MaininbuttonPushButtonClicked

class Main(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.setupUi(self)
        self.button.clicked.connect(self.buttonPushButtonClicked)  # <-- self (window instance)

    def buttonPushButtonClicked(self):  # <-- self (window instance)
        self.button.setStyleSheet(...)  # <-- self (window instance)

如果你需要它作为外部的,那么你应该发送也发送实例Main作为参数 - 但这样你将不得不手动完成 - 即。使用lambda参数分配函数`

import ButtonMethods

class Main(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.setupUi(self)
        self.button.clicked.connect(lambda:ButtonMethods.buttonPushButtonClicked(self)) # <-- self (window instance)

# --- file ButtonMethods.py ---

def buttonPushButtonClicked(window):  # <-- window instance
    window.button.setStyleSheet(...)  # <-- window instance

顺便说一句:这样你可以发送按钮实例self.button而不是窗口实例self

import ButtonMethods

class Main(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.setupUi(self)
        self.button.clicked.connect(lambda:ButtonMethods.buttonPushButtonClicked(self.button)) # <-- self.button (button instance)

# --- file ButtonMethods.py ---

def buttonPushButtonClicked(button):  # <-- button instance
    button.setStyleSheet(...)         # <-- button instance

然后您可以使用不同的按钮使用相同的功能。

但也许你应该使用 classPushButton创建自己的 class MyPushButton


推荐阅读