【问题标题】:Object with multiple functions with optional arguments in another thread在另一个线程中具有多个带有可选参数的函数的对象
【发布时间】:2017-03-23 16:05:04
【问题描述】:

我有一个工作对象,它有很多功能,我想在额外的线程上使用它们。所以,我跟着this 回答,如果我将固定数量的参数传递给函数,它就可以工作,或多或少像这样:

    _signalCommand = QtCore.pyqtSignal(str, str)
    self._signalCommand.connect(self.nanomax.test)
    self._signalCommand.emit('testA', 'testB')

但就我而言,我不能使用固定数量的参数。我需要可选的,我的功能是这样的:

 def test(self, test1='test1', test2='test2'):
    print test1
    print test2

所以,为了解决我使用 lambda 的问题,如下所示:

    _signalCommand = QtCore.pyqtSignal()
    self._signalCommand.connect(lambda: self.nanomax.test('testA', 'testB')
    self._signalCommand.emit()

这样做确实可以解决我的可选参数问题,但它会使对象在主线程中运行。我认为这是因为 lambda 创建了另一个函数,就像我之前分享的答案中提到的那样直接调用 worker (self.nanomax.test('testA', 'testB')。

有没有办法避免这种情况?提前谢谢你。

【问题讨论】:

  • 在您在这里描述的情况下,您有两个可选参数并且您提前知道它们的值,我看不出有任何问题。只需创建一个信号 _signalCommand = QtCore.pyqtSignal() 和另一个 _signalCommand2 = QtCore.pyqtSignal(str, str) 将它们连接起来,然后根据您是否要使用默认值来发出您喜欢的信号。
  • 问题是在我的程序中我需要从一个列表中获取所有可选参数。这个列表会给我带来任意数量的任意值的参数。

标签: multithreading lambda pyqt keyword-argument


【解决方案1】:

你可能会为此使用 partial

例如:

from functools import partial
...

_signalCommand = QtCore.pyqtSignal()
    self._signalCommand.connect(partial(self.nanomax.test, 'testA', 'testB'))
    self._signalCommand.emit()

【讨论】:

  • 谢谢,它接缝它正在工作,但唯一的问题是我不能像这样使用解包运算符传递列表值:self._signalCommand.connect(partial(self.nanomax.test, *self.arg[1:])),还有其他方法吗?传递与列表一样多的参数?
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2017-02-17
相关资源
最近更新 更多