Python 通过connect传递额外参数
是否可以通过插槽传递变量以便打印某些文本? 试图将另一个函数中定义的变量“DiffP”传递到插槽 “DiffP”根据选择的文件进行更改Python 通过connect传递额外参数,python,python-3.x,pyqt,pyqt5,qt-signals,Python,Python 3.x,Pyqt,Pyqt5,Qt Signals,是否可以通过插槽传递变量以便打印某些文本? 试图将另一个函数中定义的变量“DiffP”传递到插槽 “DiffP”根据选择的文件进行更改 def addLineEdit(self): try: self.clearLayout() self.FileButton ={} self.Input = {} self.TotalInput = [] for i in range(int(self.numberLine
def addLineEdit(self):
try:
self.clearLayout()
self.FileButton ={}
self.Input = {}
self.TotalInput = []
for i in range(int(self.numberLine.text())):
self.FileButton[i] = QtWidgets.QPushButton(self.centralwidget)
self.FileButton[i].setText('Case {}'.format(i+1))
self.FileButton[i].setFlat(True)
self.FileButton[i].setMaximumSize(QtCore.QSize(50, 50))
self.hboxlayout[0].addWidget(self.FileButton[i])
self.FileButton[i].clicked.connect(lambda i=i: self.openfile(i))
self.buttonGroup.addButton(self.FileButton[i],i)
self.buttonGroup.buttonClicked['int'].connect(self.input)
def searchfile(self,dir):
with open(dir) as f:
content = f.readlines()
MainList = content[44].split()
RPM = round(float(MainList[0]), 2)
Ps = round(float(MainList[1]), 2)
Ts = round(float(MainList[2]), 2)
Pd = round(float(MainList[3]), 2)
Ratio = round(Pd / Ps, 2)
DiffP = round(Pd - Ps, 2)
@pyqtSlot(int)
def input(self,button_or_id,DiffP):
if isinstance(button_or_id, int):
if button_or_id == 0:
self.TotalInput[0].setText(str(DiffP))
elif button_or_id == 1:
self.TotalInput[54].setText('1')
def openfile(self,i):
filename = QtWidgets.QFileDialog.getOpenFileName(self, 'Choose file')
dir = filename[0]
directory = os.path.split(dir)[0]
return self.searchfile(dir)
问题可以通过两种方式解决: 使用lambda函数: 一般而言:
obj.signal.connect(lambda param1, param2, ..., arg1=val1, arg2= value2, ... : fun(param1, param2,... , arg1, arg2, ....))
def fun(param1, param2,... , arg1, arg2, ....):
[...]
obj.signal.connect(partial(fun, args1, arg2, ... ))
def fun(arg1, arg2, ..., param1, param2, ...):
[...]
其中:
- 参数1,参数2,…:参数是否由信号发送
- arg1,arg2,…:是您想要使用的额外参数
self.buttonGroup.buttonClicked['int'].connect(lambda i: self.input(i, "text"))
@pyqtSlot(int)
def input(self, button_or_id, DiffP):
if isinstance(button_or_id, int):
if button_or_id == 0:
self.TotalInput[0].setText(DiffP)
elif button_or_id == 1:
self.TotalInput[54].setText('1')
from functools import partial
[...]
self.buttonGroup.buttonClicked['int'].connect(partial(self.input, "text"))
@pyqtSlot(int)
def input(self, DiffP, button_or_id):
if isinstance(button_or_id, int):
if button_or_id == 0:
self.TotalInput[0].setText(DiffP)
elif button_or_id == 1:
self.TotalInput[54].setText('1')
使用
functools.partial
:
一般而言:
obj.signal.connect(lambda param1, param2, ..., arg1=val1, arg2= value2, ... : fun(param1, param2,... , arg1, arg2, ....))
def fun(param1, param2,... , arg1, arg2, ....):
[...]
obj.signal.connect(partial(fun, args1, arg2, ... ))
def fun(arg1, arg2, ..., param1, param2, ...):
[...]
其中:
- 参数1,参数2,…:参数是否由信号发送
- arg1、arg2、…:是要发送的额外参数
self.buttonGroup.buttonClicked['int'].connect(lambda i: self.input(i, "text"))
@pyqtSlot(int)
def input(self, button_or_id, DiffP):
if isinstance(button_or_id, int):
if button_or_id == 0:
self.TotalInput[0].setText(DiffP)
elif button_or_id == 1:
self.TotalInput[54].setText('1')
from functools import partial
[...]
self.buttonGroup.buttonClicked['int'].connect(partial(self.input, "text"))
@pyqtSlot(int)
def input(self, DiffP, button_or_id):
if isinstance(button_or_id, int):
if button_or_id == 0:
self.TotalInput[0].setText(DiffP)
elif button_or_id == 1:
self.TotalInput[54].setText('1')
我添加了更多代码来显示我的问题。”DiffP'是另一个函数的变量。我一开始不是很具体。我使用slot来确定按下了哪个按钮,但是我想从searchfile函数中获取变量并在slot中使用它们,这可能吗?是的,文件将根据用户选择的内容进行更改。所以“DiffP”可能是不同的值。我使用QButtonGroup来跟踪按钮,并为每个按钮添加一个id,我所能想到的就是确保哪个按钮是从另一个函数单击的复制和粘贴的,并且没有删除它,我更改了上面的代码以反映它。以防我需要通过按键访问某个按钮