使用 cython 编译代码后无法 运行 pyqt5 应用程序
Fail to run pyqt5 app after compiling the code using cython
这是一个简单的 PyQt5 应用程序。其中有一个 QCheckBox
,我将其 clicked
信号连接到 foo()
函数。通过单击此复选框,我将两个参数传递给 foo()
函数并将这些参数打印到控制台。它工作正常但是在我通过单击此复选框使用 cython 编译器编译此代码后我得到一个 TypeError
.
main.py:
from PyQt5.QtWidgets import QMainWindow, QApplication, QCheckBox
from functools import partial
import sys
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.chb = QCheckBox(self)
self.chb.setText('My CheckBox')
self.chb.move(10, 10)
self.chb.clicked.connect(
partial(self.foo, 'para1', 'para2')
)
def foo(self, p1, p2):
print(p1, p2)
def main():
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
错误:
Traceback (most recent call last):
File "main.pyx", line 15, in main.MainWindow.foo
def foo(self, p1, p2):
TypeError: foo() takes exactly 3 positional arguments (4 given)
setup.py:
from setuptools import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize("main.pyx"))
我在 windows 10 机器上使用 python 3.7。
Cython==0.29.24 和 PyQt5==5.15.4
似乎在 cythonized 时发送了默认参数,因此一个可能的解决方案是将该参数传递给它:
def foo(self, p1, p2, checked):
print(p1, p2)
另一种选择是不使用 functools.partial 而是嵌套函数:
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.chb = QCheckBox(self)
self.chb.setText("My CheckBox")
self.chb.move(10, 10)
self.chb.clicked.connect(self.foo('para1', 'para2'))
def foo(self, p1, p2):
def wrapper():
print(p1, p2)
return wrapper
这是一个简单的 PyQt5 应用程序。其中有一个 QCheckBox
,我将其 clicked
信号连接到 foo()
函数。通过单击此复选框,我将两个参数传递给 foo()
函数并将这些参数打印到控制台。它工作正常但是在我通过单击此复选框使用 cython 编译器编译此代码后我得到一个 TypeError
.
main.py:
from PyQt5.QtWidgets import QMainWindow, QApplication, QCheckBox
from functools import partial
import sys
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.chb = QCheckBox(self)
self.chb.setText('My CheckBox')
self.chb.move(10, 10)
self.chb.clicked.connect(
partial(self.foo, 'para1', 'para2')
)
def foo(self, p1, p2):
print(p1, p2)
def main():
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
错误:
Traceback (most recent call last):
File "main.pyx", line 15, in main.MainWindow.foo
def foo(self, p1, p2):
TypeError: foo() takes exactly 3 positional arguments (4 given)
setup.py:
from setuptools import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize("main.pyx"))
我在 windows 10 机器上使用 python 3.7。
Cython==0.29.24 和 PyQt5==5.15.4
似乎在 cythonized 时发送了默认参数,因此一个可能的解决方案是将该参数传递给它:
def foo(self, p1, p2, checked):
print(p1, p2)
另一种选择是不使用 functools.partial 而是嵌套函数:
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.chb = QCheckBox(self)
self.chb.setText("My CheckBox")
self.chb.move(10, 10)
self.chb.clicked.connect(self.foo('para1', 'para2'))
def foo(self, p1, p2):
def wrapper():
print(p1, p2)
return wrapper