将python函数作为arg传递给PyQt5中的函数

Posted

技术标签:

【中文标题】将python函数作为arg传递给PyQt5中的函数【英文标题】:Passing a python function as an arg to a function in PyQt5 【发布时间】:2020-02-21 00:59:15 【问题描述】:

很抱歉发了这么长的帖子,但希望尽可能多地给予

这里没有显示很多代码,但我正在尝试清理 PyQt5 Gui 中的大量按钮功能

我有一个 GUI 输出,一切正常,我现在正在尝试删除重复的代码并创建一个函数来创建按钮。

在功能名称 initUI 中,我有大约 20 个按钮。从代码中可以看出,旧的方式是分别创建一个。

我所做的是创建一个将参数发送到的函数,然后创建它们。

除了发送到按钮的 defRun arg 之外,这确实有效。 这是传递对另一个函数的调用我已经用 >>>>arg 突出显示

class iac2tf(QMainWindow):
    def __init__(self):
        super(iac2tf, self).__init__()
        self.initUI()
        self.setGeometry(0, 0, 1700, 1000)........

     def button (self, buttonName, buttonText, >>>>defRun<<<<, buttonWidth, buttonHeight, buttonx, buttony):
            self.buttonName = QtWidgets.QPushButton(buttonText,self)
        >>>>self.buttonName.clicked.connect(lambda:self.defRun)<<<<
            self.buttonName.resize(buttonWidth,buttonHeight)
            self.buttonName.move(buttonx,buttony)   
            self.buttonName.show()

    def initUI(self): 
            #passed style
            self.openFilebutton = self.button('openFile', 'Open File', >>>'open()'<<<< ,110,30,5,50)

            #Old style
            self.ProcessFile = QtWidgets.QPushButton('Process File',self)
            self.ProcessFile.clicked.connect(self.processFile)
            self.ProcessFile.resize(110,30)
            self.ProcessFile.move(5, 80)  


/......
   ....../


def open(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        file, _ = QFileDialog.getOpenFileNames(self, 'Ope....... 


app = QApplication(sys.argv)
win = iac2tf()
win.show()


我试过通过知道有些会失败,但想覆盖所有基地并且被激怒了

str(打开)

GUI 打开

<built-in function open>

点击按钮

  File "/home/bob/present/proj/WorksArea/gui.py", line 38, in <lambda>
    self.buttonName.clicked.connect(lambda:self.defRun)
AttributeError: 'iac2tf' object has no attribute 'defRun'

str(open())
self.openFilebutton = self.button('openFile', 'Open File', str(open()) ,110,30,5,50)
TypeError: Required argument 'file' (pos 1) not found


str(self.open)

GUI 打开

<bound method iac2tf.open of <__main__.iac2tf object at 0x7f87e73da948>>

点击按钮

Traceback (most recent call last):
  File "/home/bob/present/proj/WorksArea/gui.py", line 38, in <lambda>
    self.buttonName.clicked.connect(lambda:self.defRun)
AttributeError: 'iac2tf' object has no attribute 'defRun'

str(self.open())

打开文件选择菜单即开始打开功能


self.open

GUI 启动

<bound method iac2tf.open of <__main__.iac2tf object at 0x7fdcb2dee948>>

点击按钮

Traceback (most recent call last):
  File "/home/bob/present/proj/WorksArea/gui.py", line 38, in <lambda>
    self.buttonName.clicked.connect(lambda:self.defRun)
AttributeError: 'iac2tf' object has no attribute 'defRun'

'self.open' 'self.open()' 'open()' '打开'

无错误打开 GUI

点击按钮

Traceback (most recent call last):
  File "/home/bob/present/proj/WorksArea/gui.py", line 38, in <lambda>
    self.buttonName.clicked.connect(lambda:self.defRun)
AttributeError: 'iac2tf' object has no attribute 'defRun'

打开

打开 GUI
   <built-in function open>

点击按钮

 Traceback (most recent call last):
  File "/home/bob/present/proj/WorksArea/gui.py", line 38, in <lambda>
    self.buttonName.clicked.connect(lambda:self.defRun)
AttributeError: 'iac2tf' object has no attribute 'defRun'

打开()
self.openFilebutton = self.button('openFile', 'Open File', open() ,110,30,5,50)
TypeError: Required argument 'file' (pos 1) not found

将以上所有内容传递给本地函数 var,但原样:(

【问题讨论】:

提供minimal reproducible example 好的,谢谢,明天再做,谢谢 试试:self.buttonName.clicked.connect(defRun)self.openFilebutton = self.button('openFile', 'Open File', self.open, 110,30,5,50) 干杯,会的。你认为 lambda 会跳闸吗?你能解释一下吗(我正在学习) 我所说的是一个假设,因为您提供的代码并没有给我必要的保证它可以正常工作,所以我希望您提供我要求您提供更多详细信息的信息。 【参考方案1】:

这是一个将函数作为参数传递的示例。

class Template(QWidget):

    def __init__(self):
        super().__init__()
        self.vbox = QVBoxLayout(self)
        self.create_button('Open', self.open)
        self.create_button('Close', self.close)

    def create_button(self, text, slot):
        btn = QPushButton(text)
        btn.clicked.connect(slot)
        self.vbox.addWidget(btn)

    def open(self):
        QFileDialog.getOpenFileName(self)

另外值得注意的是,arg buttonName 从未在此函数中实际使用过:

def button (self, buttonName, buttonText, >>>>defRun<<<<, buttonWidth, buttonHeight, buttonx, buttony):
    self.buttonName = QtWidgets.QPushButton(buttonText,self)
    . . .

该变量只存在于函数的局部范围内,self.buttonName 完全引用了另一个对象。也就是说,如果你想引用你创建的按钮,你通过'openFile'buttonName arg,它不会被称为self.openFile,它会被称为self.buttonName。但是,您可以使用exec() 来实现此目的,尽管通常不鼓励这样做。

【讨论】:

干杯我会给它一个狂欢。这可能是个大问题。我假设该按钮将被命名为 openFile 只是查看我的错误,它实际上是 buttonName.... 现在感觉很傻?。我没有只见树木不见森林。如前所述,谢谢,我会尝试并报告

以上是关于将python函数作为arg传递给PyQt5中的函数的主要内容,如果未能解决你的问题,请参考以下文章

pyqt5 继承python类可以传递信号函数吗

如何正确地将 ComboBox 的模型从 python (pyQt5) 传递给 QML?

将数组/列表传递给 Python 函数

如何使用pyqt5将输入值传递给input()?

python怎么向类中的函数传递参数

将传递分配给Python中的函数