RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1553900
Accepted
Clark Devlin
Clark Devlin
Asked:2023-11-30 19:15:37 +0000 UTC2023-11-30 19:15:37 +0000 UTC 2023-11-30 19:15:37 +0000 UTC

如何将按钮绑定到 PyQt 中的输入字段?

  • 772

告诉我,如何将按钮与输入字段关联起来,以便按下按钮时,从与其关联的输入字段中获取信息?

很明显,您可以编写一个函数来处理该值并将其与使用的按钮关联起来clicked.connect(),但是我有很多相同类型的字段和按钮,我需要按钮来执行相应字段的功能,并且我不想创建一座相同类型的代码。

主要.py:


from PyQt6 import QtCore, QtGui, QtWidgets


class Ui_test(object):
    def setupUi(self, test):
        test.setObjectName("test")
        test.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(parent=test)
        self.centralwidget.setObjectName("centralwidget")
        self.form1 = QtWidgets.QLineEdit(parent=self.centralwidget)
        self.form1.setGeometry(QtCore.QRect(40, 30, 113, 22))
        self.form1.setObjectName("form1")
        self.btn1 = QtWidgets.QPushButton(parent=self.centralwidget)
        self.btn1.setGeometry(QtCore.QRect(180, 30, 93, 28))
        self.btn1.setObjectName("btn1")
        self.form2 = QtWidgets.QLineEdit(parent=self.centralwidget)
        self.form2.setGeometry(QtCore.QRect(40, 80, 113, 22))
        self.form2.setObjectName("form2")
        self.form3 = QtWidgets.QLineEdit(parent=self.centralwidget)
        self.form3.setGeometry(QtCore.QRect(40, 130, 113, 22))
        self.form3.setObjectName("form3")
        self.form4 = QtWidgets.QLineEdit(parent=self.centralwidget)
        self.form4.setGeometry(QtCore.QRect(40, 180, 113, 22))
        self.form4.setObjectName("form4")
        self.btn2 = QtWidgets.QPushButton(parent=self.centralwidget)
        self.btn2.setGeometry(QtCore.QRect(180, 70, 93, 28))
        self.btn2.setObjectName("btn2")
        self.btn3 = QtWidgets.QPushButton(parent=self.centralwidget)
        self.btn3.setGeometry(QtCore.QRect(180, 130, 93, 28))
        self.btn3.setObjectName("btn3")
        self.btn4 = QtWidgets.QPushButton(parent=self.centralwidget)
        self.btn4.setGeometry(QtCore.QRect(180, 180, 93, 28))
        self.btn4.setObjectName("btn4")
        test.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(parent=test)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        self.menubar.setObjectName("menubar")
        test.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(parent=test)
        self.statusbar.setObjectName("statusbar")
        test.setStatusBar(self.statusbar)

        self.retranslateUi(test)
        QtCore.QMetaObject.connectSlotsByName(test)

    def retranslateUi(self, test):
        _translate = QtCore.QCoreApplication.translate
        test.setWindowTitle(_translate("test", "MainWindow"))
        self.btn1.setText(_translate("test", "PushButton"))
        self.btn2.setText(_translate("test", "PushButton"))
        self.btn3.setText(_translate("test", "PushButton"))
        self.btn4.setText(_translate("test", "PushButton"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    test = QtWidgets.QMainWindow()
    ui = Ui_test()
    ui.setupUi(test)
    test.show()
    sys.exit(app.exec())

python
  • 1 1 个回答
  • 51 Views

1 个回答

  • Voted
  1. Best Answer
    S. Nick
    2023-11-30T20:36:35Z2023-11-30T20:36:35Z

    根据表单的编译方式,我们可以提供以下选项:

    '''
    from PyQt6 import QtCore, QtGui, QtWidgets
    '''
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_test(object):
        def setupUi(self, test):
            test.setObjectName("test")
            test.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(parent=test)
            self.centralwidget.setObjectName("centralwidget")
            self.form1 = QtWidgets.QLineEdit(parent=self.centralwidget)
            self.form1.setGeometry(QtCore.QRect(40, 30, 113, 22))
            self.form1.setObjectName("form1")
            self.btn1 = QtWidgets.QPushButton(parent=self.centralwidget)
            self.btn1.setGeometry(QtCore.QRect(180, 30, 93, 28))
            self.btn1.setObjectName("btn1")
            self.form2 = QtWidgets.QLineEdit(parent=self.centralwidget)
            self.form2.setGeometry(QtCore.QRect(40, 80, 113, 22))
            self.form2.setObjectName("form2")
            self.form3 = QtWidgets.QLineEdit(parent=self.centralwidget)
            self.form3.setGeometry(QtCore.QRect(40, 130, 113, 22))
            self.form3.setObjectName("form3")
            self.form4 = QtWidgets.QLineEdit(parent=self.centralwidget)
            self.form4.setGeometry(QtCore.QRect(40, 180, 113, 22))
            self.form4.setObjectName("form4")
            self.btn2 = QtWidgets.QPushButton(parent=self.centralwidget)
            self.btn2.setGeometry(QtCore.QRect(180, 70, 93, 28))
            self.btn2.setObjectName("btn2")
            self.btn3 = QtWidgets.QPushButton(parent=self.centralwidget)
            self.btn3.setGeometry(QtCore.QRect(180, 130, 93, 28))
            self.btn3.setObjectName("btn3")
            self.btn4 = QtWidgets.QPushButton(parent=self.centralwidget)
            self.btn4.setGeometry(QtCore.QRect(180, 180, 93, 28))
            self.btn4.setObjectName("btn4")
            test.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(parent=test)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
            self.menubar.setObjectName("menubar")
            test.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(parent=test)
            self.statusbar.setObjectName("statusbar")
            test.setStatusBar(self.statusbar)
    
            self.retranslateUi(test)
            QtCore.QMetaObject.connectSlotsByName(test)
    
        def retranslateUi(self, test):
            _translate = QtCore.QCoreApplication.translate
            test.setWindowTitle(_translate("test", "MainWindow"))
            self.btn1.setText(_translate("test", "PushButton"))
            self.btn2.setText(_translate("test", "PushButton"))
            self.btn3.setText(_translate("test", "PushButton"))
            self.btn4.setText(_translate("test", "PushButton"))
    
    
    class Window(QtWidgets.QMainWindow, Ui_test):
        def __init__(self):
            super(Window, self).__init__()
            self.setupUi(self)
            
            self.btn1.clicked.connect(
                lambda ch, btn = self.btn1: self.btn_clicked(btn))
            self.btn2.clicked.connect(
                lambda ch, btn = self.btn2: self.btn_clicked(btn))
            self.btn3.clicked.connect(
                lambda ch, btn = self.btn3: self.btn_clicked(btn))
            self.btn4.clicked.connect(
                lambda ch, btn = self.btn4: self.btn_clicked(btn))
                
        def btn_clicked(self, btn):
            btn_objectName = btn.objectName()
            if btn_objectName == "btn1":
                print(f'{btn_objectName}: {self.form1.text()}')  
            elif btn_objectName == "btn2":
                print(f'{btn_objectName}: {self.form2.text()}')    
            if btn_objectName == "btn3":
                print(f'{btn_objectName}: {self.form3.text()}')
            if btn_objectName == "btn4":
                print(f'{btn_objectName}: {self.form4.text()}')            
    
    
    if __name__ == "__main__":
        import sys
        
        app = QtWidgets.QApplication(sys.argv)
        test = Window()
        test.show()
        sys.exit(app.exec())
    

    在此输入图像描述

    我不明白你接下来会发生什么,所以我怀疑你的形式是否最优。不过那是另一回事了。


    更新:

    这很接近我想要的。如果您想象有一百个这样的按钮怎么办?
    真的需要在条件中列出所有内容吗?
    也许 Qt Designer 有一个用于此类链接的内置函数?

    您可以使用setattr()/getattr() 使用如下行动态创建变量:

    '''
    from PyQt6 import QtCore, QtGui, QtWidgets
    '''
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Window(QtWidgets.QMainWindow):
        def __init__(self):
            super(Window, self).__init__()
            self.centralwidget = QtWidgets.QWidget()
            self.setCentralWidget(self.centralwidget)
            
            flay = QtWidgets.QFormLayout(self.centralwidget)
    
            self.texts = [
                ["name", "какое-то имя"], 
                ["address", "какой-то адрес"], 
                ["phone", "какой-то телефон"],
                ["email", "какой-то email"],
                ["Заметки", "какие-то Заметки"],
                # ...
            ]
            
            for i, text in enumerate(self.texts):
                self.btn = QtWidgets.QPushButton(f'{text[0]}: ', self)
                self.btn.clicked.connect(lambda ch, i=i: self.create_txt(i))    
                self.lineEdit = QtWidgets.QLineEdit(self, placeholderText=text[1])
                flay.addRow(self.btn, self.lineEdit)
    
                # Атрибут класса создается с помощью setattr()                    # !!!
                obj = setattr(self, f"btn_{i+1:0>2}", self.btn)                   # !
                setattr(self, f"lineEdit_{i+1:0>2}", self.lineEdit)               # !
    
        def create_txt(self, i):
            obj_btn = getattr(self, f"btn_{i+1:0>2}")                             # !!!
            obj_edit = getattr(self, f"lineEdit_{i+1:0>2}")                       # !!!
            print(f'{obj_btn.text()}: {obj_edit.text()}')             
            
    
    if __name__ == "__main__":
        import sys
        
        app = QtWidgets.QApplication(sys.argv)
        test = Window()
        test.show()
        sys.exit(app.exec())
    

    在此输入图像描述

    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5