如何解决PyQt5 从在开环中创建的多个按钮中检索 ID 和值
我正在尝试基于条目 (QLineEdit) 创建按钮 (QPushButtons)。这个想法是我希望用户能够创建任意数量的按钮,只需在输入框中添加新文本,然后按“添加标签”(见下图)。
虽然我可以这样做,但我现在无法检索每个按钮的标签值,因为我使用的过程会删除所有以前的值(我只能检索输入的最后一个值)。我希望能够在单击每个按钮时打印每个特定的标签值。
我的代码如下:
from PyQt5.QtWidgets import QApplication,QMainWindow,QPushButton,QLineEdit
import sys
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow,self).__init__()
self.setGeometry(100,100,1500,1500)
self.setWindowTitle("My Program")
self.labelButtons = [] # List of all the buttons displaying labels
self.eraseButtons = [] # List of all the buttons displaying "X"
self.Yposition = 50
self.initUI()
def initUI(self):
self.labelEntry = QLineEdit(self)
self.labelEntry.move(50,self.Yposition)
self.labelEntry.resize(300,40)
self.addLabelButton = QPushButton(self)
self.addLabelButton.setText("Add Label")
self.addLabelButton.move(400,self.Yposition)
self.addLabelButton.resize(300,40)
self.addLabelButton.clicked.connect(self.addNewLabel)
def addNewLabel(self):
self.Yposition += 50
self.newLabelName = self.labelEntry.text()
self.labelButtons.append(self.createButtonLabel(self.newLabelName))
self.eraseButtons.append(self.eraseButtonLabel())
self.updatelabels()
def createButtonLabel(self,labelname):
self.button = QPushButton(self)
self.button.setText(str(labelname))
self.button.resize(300,40)
self.button.move(50,self.Yposition)
self.button.clicked.connect(self.printbutton)
return self.button
def eraseButtonLabel(self):
self.buttonErase = QPushButton(self)
self.buttonErase.setText("X")
self.buttonErase.resize(40,40)
self.buttonErase.move(360,self.Yposition)
self.buttonErase.clicked.connect(self.printbutton)
return self.buttonErase
def updatelabels(self):
for button in self.labelButtons:
button.show()
for button in self.eraseButtons:
button.show()
def printbutton(self):
print(self.button.text())
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())
<!-- end snippet -->
解决方法
使用 Google pyqt clicked event
我发现你必须使用
def printbutton(self):
widget = self.sender()
print(widget.text())
ZetCode:Events and signals in PyQt5
编辑:
至于 erease
按钮 - 您应该从 createButtonLabel
获取按钮并将其发送到 eraseButtonLabel
labelbutton = self.createButtonLabel(self.newLabelName)
erasebutton = self.eraseButtonLabel(labelbutton)
并且您可以使用 lambda
将函数与参数赋值
def eraseButtonLabel(self,labelbutton):
# ... code ...
self.buttonErase.clicked.connect(lambda: self.erasebutton(labelbutton))
和函数应该得到这个参数
def erasebutton(self,button):
widget = self.sender()
print('clicked:',widget.text())
print(' erase:',button.text())
或者你可以将 button
赋值给 buttonErase
中的自己的变量
def eraseButtonLabel(self,labelbutton):
# ... code ...
self.buttonErase.assigned_button = labelbutton
self.buttonErase.clicked.connect(self.erasebutton)
并在函数中使用
def erasebutton(self):
widget = self.sender()
print('clicked:',widget.assigned_button.text())
同时使用两种方法的完整代码,但您只需要一种方法。
from PyQt5.QtWidgets import *
import sys
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow,self).__init__()
self.setGeometry(100,100,1500,1500)
self.setWindowTitle("My Program")
self.labelButtons = [] # List of all the buttons displaying labels
self.eraseButtons = [] # List of all the buttons displaying "X"
self.Yposition = 50
self.initUI()
def initUI(self):
self.labelEntry = QLineEdit(self)
self.labelEntry.move(50,self.Yposition)
self.labelEntry.resize(300,40)
self.addLabelButton = QPushButton(self)
self.addLabelButton.setText("Add Label")
self.addLabelButton.move(400,self.Yposition)
self.addLabelButton.resize(300,40)
self.addLabelButton.clicked.connect(self.addNewLabel)
def addNewLabel(self):
self.Yposition += 50
self.newLabelName = self.labelEntry.text()
labelbutton = self.createButtonLabel(self.newLabelName)
erasebutton = self.eraseButtonLabel(labelbutton)
self.labelButtons.append(labelbutton)
self.eraseButtons.append(erasebutton)
self.updatelabels()
def createButtonLabel(self,labelname):
self.button = QPushButton(self)
self.button.setText(str(labelname))
self.button.resize(300,40)
self.button.move(50,self.Yposition)
self.button.clicked.connect(self.printbutton)
return self.button
def eraseButtonLabel(self,labelbutton):
self.buttonErase = QPushButton(self)
self.buttonErase.setText("X")
self.buttonErase.resize(40,40)
self.buttonErase.move(360,self.Yposition)
self.buttonErase.assigned_button = labelbutton
self.buttonErase.clicked.connect(lambda: self.erasebutton(labelbutton))
#self.buttonErase.clicked.connect(self.erasebutton)
return self.buttonErase
def updatelabels(self):
for button in self.labelButtons:
button.show()
for button in self.eraseButtons:
button.show()
def printbutton(self):
print('clicked:',self.sender().text())
def erasebutton(self,button):
widget = self.sender()
print('clicked:',widget.text())
print(' erase:',button.text())
print(' erase:',widget.assigned_button.text())
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())
编辑:
其他方法是创建自己的小部件,它同时具有 labelbutton
和 erasebutton
按钮,然后 erasebutton
只能直接访问自己的 labelbutton
。
顺便说一句:出于类似的原因,我会将按钮成对保存
self.buttons.append([labelbutton,erasebutton])
代替分隔列表
self.labelButtons.append(labelbutton)
self.eraseButtons.append(erasebutton)
我创建自己的小部件的示例。
from PyQt5.QtWidgets import *
import sys
class MyWidget(QWidget):
def __init__(self,parent,labelname,*args,**kwargs):
super().__init__(parent,**kwargs)
self.resize(350,40)
self.labelButton = QPushButton(self)
self.labelButton.setText(str(labelname))
self.labelButton.resize(300,40)
self.labelButton.move(0,0)
self.labelButton.clicked.connect(self.printbutton)
self.buttonErase = QPushButton(self)
self.buttonErase.setText("X")
self.buttonErase.resize(40,40)
self.buttonErase.move(310,0)
self.buttonErase.clicked.connect(self.erasebutton)
self.show()
def printbutton(self):
print('clicked:',self.labelButton.text())
def erasebutton(self):
print('clicked:',self.buttonErase.text())
print(' erase:',self.labelButton.text())
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow,1500)
self.setWindowTitle("My Program")
self.widgets = []
self.Yposition = 50
self.initUI()
def initUI(self):
self.labelEntry = QLineEdit(self)
self.labelEntry.move(50,40)
self.addLabelButton.clicked.connect(self.addNewLabel)
def addNewLabel(self):
self.Yposition += 50
text = self.labelEntry.text()
widget = MyWidget(self,text)
widget.move(50,self.Yposition)
self.widgets.append(widget)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。