如何使用带有 2 个参数的函数,包括 Python 中的 'self'?
How can I use function with 2 arguments includes 'self' in Python?
为了解决封闭式问题,我post这里有完整的代码。
import os
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
form_class = uic.loadUiType(BASE_DIR + "./test.ui")[0]
class WindowClass(QMainWindow, form_class):
def __init__(self) :
super().__init__()
self.setupUi(self)
self.button.clicked.connect(self.func)
def func(self, a):
global b
b = a
if __name__ == "__main__" :
app = QApplication(sys.argv)
myWindow = WindowClass()
myWindow.show()
app.exec_()
并且它还需要 ui 同一目录中的文件,
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>298</width>
<height>197</height>
</rect>
</property>
<property name="maximumSize">
<size>
<width>298</width>
<height>197</height>
</size>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QPushButton" name="button">
<property name="geometry">
<rect>
<x>100</x>
<y>80</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>PushButton</string>
</property>
</widget>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
在此代码中,
class WindowClass(QMainWindow, form_class):
def __init__(self) :
super().__init__()
self.setupUi(self)
self.button.clicked.connect(self.func(1))
def func(self, a):
global b
b = a
这会导致参数错误(TypeError:参数 1 具有意外类型 'NoneType')。有什么方法可以使用函数 func
?
我尝试了 wc = WindowClass()
并将代码更改为:
class WindowClass(QMainWindow, form_class):
def __init__(self) :
super().__init__()
self.setupUi(self)
wc = WindowClass()
self.button.clicked.connect(wc.func(1))
def func(self, a):
global b
b = a
这会导致致命的初始化错误(致命的 Python 错误:_Py_CheckRecursiveCall:无法从堆栈溢出中恢复。
Python 运行时状态:已初始化
当前线程 0x000097e8(最近调用最先):).
代码在以下情况下运行完美:
class WindowClass(QMainWindow, form_class):
def __init__(self) :
super().__init__()
self.setupUi(self)
self.button.clicked.connect(self.func)
def func(self):
global b
b = 1
但是,我必须使用 func
作为 2 个参数。我该怎么做?
尝试使用部分:
from functools import partial
self.button.clicked.connect(partial(self.func, 1))
我的猜测是 connect 需要一个 0 参数函数。部分固定参数并创建一个 0 参数函数。
为了解决封闭式问题,我post这里有完整的代码。
import os
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
form_class = uic.loadUiType(BASE_DIR + "./test.ui")[0]
class WindowClass(QMainWindow, form_class):
def __init__(self) :
super().__init__()
self.setupUi(self)
self.button.clicked.connect(self.func)
def func(self, a):
global b
b = a
if __name__ == "__main__" :
app = QApplication(sys.argv)
myWindow = WindowClass()
myWindow.show()
app.exec_()
并且它还需要 ui 同一目录中的文件,
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>298</width>
<height>197</height>
</rect>
</property>
<property name="maximumSize">
<size>
<width>298</width>
<height>197</height>
</size>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QPushButton" name="button">
<property name="geometry">
<rect>
<x>100</x>
<y>80</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>PushButton</string>
</property>
</widget>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
在此代码中,
class WindowClass(QMainWindow, form_class):
def __init__(self) :
super().__init__()
self.setupUi(self)
self.button.clicked.connect(self.func(1))
def func(self, a):
global b
b = a
这会导致参数错误(TypeError:参数 1 具有意外类型 'NoneType')。有什么方法可以使用函数 func
?
我尝试了 wc = WindowClass()
并将代码更改为:
class WindowClass(QMainWindow, form_class):
def __init__(self) :
super().__init__()
self.setupUi(self)
wc = WindowClass()
self.button.clicked.connect(wc.func(1))
def func(self, a):
global b
b = a
这会导致致命的初始化错误(致命的 Python 错误:_Py_CheckRecursiveCall:无法从堆栈溢出中恢复。 Python 运行时状态:已初始化 当前线程 0x000097e8(最近调用最先):).
代码在以下情况下运行完美:
class WindowClass(QMainWindow, form_class):
def __init__(self) :
super().__init__()
self.setupUi(self)
self.button.clicked.connect(self.func)
def func(self):
global b
b = 1
但是,我必须使用 func
作为 2 个参数。我该怎么做?
尝试使用部分:
from functools import partial
self.button.clicked.connect(partial(self.func, 1))
我的猜测是 connect 需要一个 0 参数函数。部分固定参数并创建一个 0 参数函数。