使用方法作为部分命令的参数

Posted

技术标签:

【中文标题】使用方法作为部分命令的参数【英文标题】:Use methods as arguments for a partial command 【发布时间】:2020-01-13 02:01:52 【问题描述】:

我可以在部分语句中使用带参数的方法作为参数吗?

我正在使用 partial 并且可以传递字符串,但是当我尝试传递带有变量作为参数的方法时,单击消息框按钮时没有得到任何结果,但是当工具打开并执行 parial 语句时我无需与工具交互即可获得结果

self.ui.psh_bttn_go.clicked.connect(partial(self.yes_no_messagebox, 'poop', 'loop'))# this works

self.ui.psh_bttn_go.clicked.connect(partial(self.yes_no_messagebox, (partial(self.test_fn, 'Help')), (partial(self.test_fn, 'meeeeee!'))))) # This produces nothing

# Using the following methods

def yes_no_messagebox(self, yes_fn, no_fn):
    yes_no_msg_box = QMessageBox()
    yes_no_msg_box.setWindowTitle("Continue?")
    yes_no_msg_box.setText('This is the message box message')
    yes_no_msg_box.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
    yes_no_msg_box.setDefaultButton(QMessageBox.No)
    yes_no_msg_box_ex = yes_no_msg_box.exec_()

    if yes_no_msg_box_ex == QMessageBox.Yes:
        yes_fn
    elif yes_no_msg_box_ex == QMessageBox.No:
        no_fn

def test_fn(self, msg = ''):
    print msg

我希望部分语句能够工作,因为我只传递了一个应该被识别为参数的条件。论点是部分陈述是否重要?

【问题讨论】:

【参考方案1】:

partial(fun, x) 生成一个可调用对象,因此如果要调用该函数,必须使用 ()

# ...
if yes_no_msg_box_ex == QMessageBox.Yes:
    yes_fn() # <---
elif yes_no_msg_box_ex == QMessageBox.No:
    no_fn()  # <---

MWE:

from functools import partial

from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QPushButton


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        button = QPushButton("Press me")
        self.setCentralWidget(button)

        button.clicked.connect(
            partial(
                self.yes_no_messagebox,
                (partial(self.test_fn, "Help")),
                (partial(self.test_fn, "meeeeee!")),
            )
        )

    def yes_no_messagebox(self, yes_fn, no_fn):

        yes_no_msg_box = QMessageBox()
        yes_no_msg_box.setWindowTitle("Continue?")
        yes_no_msg_box.setText("This is the message box message")
        yes_no_msg_box.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        yes_no_msg_box.setDefaultButton(QMessageBox.No)
        yes_no_msg_box_ex = yes_no_msg_box.exec_()

        if yes_no_msg_box_ex == QMessageBox.Yes:
            yes_fn()
        elif yes_no_msg_box_ex == QMessageBox.No:
            no_fn()

    def test_fn(self, arg):
        print(arg)


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)

    w = MainWindow()
    w.show()

    sys.exit(app.exec_())

【讨论】:

不幸的是,这不起作用,只会使工具崩溃。yes_fn 和 no_fn 只是消息框方法的变量,所以我应该可以随意传递它,但它不起作用使用 partial 作为消息框方法的参数。我所说的部分陈述是否可行/正确? @PyHulk 真奇怪,我添加了一个 MWE 以便您进行测试,如果它适用于您,那么问题出在您未显示的代码部分,因此您必须提供 @987654321 @ 感谢您的回复,该课程可以正常工作,所以我会考虑将其与我所拥有的结合起来。抱歉,如果这篇文章没有提供应有的信息,我将确保在未来提供更多的信息。再次感谢。 @PyHulk 如果我的回答对您有所帮助,请不要忘记标记为正确,如果您不知道该怎么做,请查看tour 我已标记为正确。有一段时间没上,所以我的礼仪有点不对劲,但我会记住未来的。谢谢。

以上是关于使用方法作为部分命令的参数的主要内容,如果未能解决你的问题,请参考以下文章

Wix安装程序使用参数执行cmd

将 QT 程序作为窗口和命令行运行

如何在命令行上将运行时参数传递给 dotnet test?

将命令行参数传递给颤振应用程序

Linux入门基础之 中

在 Spring MVC 中使用部分 URL 作为控制器的参数