gpt4 book ai didi

python - 区分 PySide 中的信号源

转载 作者:太空狗 更新时间:2023-10-30 00:37:05 26 4
gpt4 key购买 nike

在 PySide/PyQt 中是否有简单或优雅的方法来区分许多相同类型的信号源?

我正在学习 PySide。我编写了简单的应用程序,它将来自两个不同 QLineEdit() 对象的两个数字相乘。结果显示在第三个 QLineEdit 中。

乘数和被乘数 QLineEdit.textChanged() 信号连接到一个方法 (TxtChanged)。在这种方法中,我必须区分信号源。经过一些试验后,我想出了一些基于占位符文本的解决方法(下面 4 行“还有其他方法吗?”在我的代码中注释)

代码:

import sys
from PySide import QtGui, QtCore

class myGUI(QtGui.QWidget):

def __init__(self, *args, **kwargs):
QtGui.QWidget.__init__(self, *args, **kwargs)

self.multiplier = 0
self.multiplicand = 0

self.myGUIInit()

def myGUIInit(self):
# input forms
a1_label = QtGui.QLabel("a1")
a1_edit = QtGui.QLineEdit()
a1_edit.setPlaceholderText("a1")

a2_label = QtGui.QLabel("a2")
a2_edit = QtGui.QLineEdit()
a2_edit.setPlaceholderText("a2")

# output form
a1a2_label = QtGui.QLabel("a1*a2")
self.a1a2_edit = QtGui.QLineEdit()
self.a1a2_edit.setReadOnly(True)


# forms events
a1_edit.textChanged.connect(self.TxtChanged)
a2_edit.textChanged.connect(self.TxtChanged)

# grid
grid = QtGui.QGridLayout()
grid.setSpacing(10)

grid.addWidget(a1_label,1,0)
grid.addWidget(a1_edit,1,1)

grid.addWidget(a2_label,2,0)
grid.addWidget(a2_edit,2,1)

grid.addWidget(a1a2_label,3,0)
grid.addWidget(self.a1a2_edit,3,1)

self.setLayout(grid)
self.setGeometry(100,100,200,200)
self.setWindowTitle("a*b")
self.show()

def TxtChanged(self,text):
sender = self.sender()
sender_text = sender.text()
if sender_text == '': sender_text = '0'

# is there another way?
if sender.placeholderText() == 'a1':
self.multiplicand = sender_text
else:
self.multiplier = sender_text

product = int(self.multiplier) * int(self.multiplicand)

print(self.multiplier,self.multiplicand,product)

self.a1a2_edit.setText(str(product))


def main():
app = QtGui.QApplication(sys.argv)
mainWindow = myGUI()
sys.exit(app.exec_())

main()

最好的问候,奥斯特日兹

最佳答案

您可以使用 functools.partial 函数 - 因此将您的信号直接连接到您的方法/函数,而不是连接到一个 python 对象,该对象将使用您传递给它的一些额外数据自动调用您的函数:

from functools import partial
...
....
a1_edit.textChanged.connect(partial(self.TxtChanged, a1_edit))
a2_edit.textChanged.connect(partial(self.TxtChanged, a2_edit))
...

def TxtChanged(self,sender, text):
# and here you have the "sender" parameter as it was filled in the call to "partial"
...

partials 是 stdlib 的一部分,可读性很强,但总是可以使用 lambda 而不是 partial 来达到相同的效果 -

a1_edit.textChanged.connect(lambda text: self.TxtChanged(a1_edit, text))

通过这种方式,lambda 表达式产生的对象将是一个临时函数,它将使用当前局部变量(在单击按钮时)中的“self”和“a1_edit”的值,并且名为“文本”将由 Pyside 的回调提供。

关于python - 区分 PySide 中的信号源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9144936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com