鱼C论坛

 找回密码
 立即注册
查看: 1574|回复: 14

[已解决]GUI界面分离程序无法获取按钮点击事件

[复制链接]
发表于 2021-2-1 09:43:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
使用pyqt5只做了一个GUI界面,但是不能获取按钮点击信号,也就是说用户输入用户名和密码,点击确认后获取不到用户的输入,下面是源码,请各位大神给指点一二

                               
登录/注册后可看大图

GUI界面代码如下
  1. # -*- coding: utf-8 -*-

  2. # Form implementation generated from reading ui file 'untitled.ui'
  3. #
  4. # Created by: PyQt5 UI code generator 5.15.2
  5. #
  6. # WARNING: Any manual changes made to this file will be lost when pyuic5 is
  7. # run again.  Do not edit this file unless you know what you are doing.


  8. from PyQt5 import QtCore, QtGui, QtWidgets


  9. class Ui_mainWindow(object):
  10.     def setupUi(self, mainWindow):
  11.         mainWindow.setObjectName("mainWindow")
  12.         mainWindow.resize(487, 381)
  13.         self.centralwidget = QtWidgets.QWidget(mainWindow)
  14.         self.centralwidget.setObjectName("centralwidget")
  15.         self.pushButton = QtWidgets.QPushButton(self.centralwidget)
  16.         self.pushButton.setGeometry(QtCore.QRect(300, 250, 111, 41))
  17.         self.pushButton.setObjectName("pushButton")
  18.         self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
  19.         self.textBrowser.setGeometry(QtCore.QRect(10, 30, 221, 301))
  20.         self.textBrowser.setObjectName("textBrowser")
  21.         self.label_3 = QtWidgets.QLabel(self.centralwidget)
  22.         self.label_3.setGeometry(QtCore.QRect(10, 10, 54, 12))
  23.         self.label_3.setObjectName("label_3")
  24.         self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
  25.         self.layoutWidget.setGeometry(QtCore.QRect(250, 40, 225, 141))
  26.         self.layoutWidget.setObjectName("layoutWidget")
  27.         self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
  28.         self.gridLayout.setContentsMargins(0, 0, 0, 0)
  29.         self.gridLayout.setObjectName("gridLayout")
  30.         self.label = QtWidgets.QLabel(self.layoutWidget)
  31.         self.label.setObjectName("label")
  32.         self.gridLayout.addWidget(self.label, 2, 0, 1, 1)
  33.         self.lineEdit_2 = QtWidgets.QLineEdit(self.layoutWidget)
  34.         self.lineEdit_2.setText("")
  35.         self.lineEdit_2.setObjectName("lineEdit_2")
  36.         self.gridLayout.addWidget(self.lineEdit_2, 4, 1, 1, 1)
  37.         self.label_2 = QtWidgets.QLabel(self.layoutWidget)
  38.         self.label_2.setObjectName("label_2")
  39.         self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1)
  40.         self.lineEdit = QtWidgets.QLineEdit(self.layoutWidget)
  41.         self.lineEdit.setText("")
  42.         self.lineEdit.setObjectName("lineEdit")
  43.         self.gridLayout.addWidget(self.lineEdit, 1, 1, 1, 1)
  44.         self.label_2.raise_()
  45.         self.label.raise_()
  46.         self.lineEdit_2.raise_()
  47.         self.lineEdit.raise_()
  48.         mainWindow.setCentralWidget(self.centralwidget)
  49.         self.menubar = QtWidgets.QMenuBar(mainWindow)
  50.         self.menubar.setGeometry(QtCore.QRect(0, 0, 487, 23))
  51.         self.menubar.setObjectName("menubar")
  52.         self.menugui = QtWidgets.QMenu(self.menubar)
  53.         self.menugui.setObjectName("menugui")
  54.         self.menu = QtWidgets.QMenu(self.menubar)
  55.         self.menu.setObjectName("menu")
  56.         mainWindow.setMenuBar(self.menubar)
  57.         self.statusbar = QtWidgets.QStatusBar(mainWindow)
  58.         self.statusbar.setObjectName("statusbar")
  59.         mainWindow.setStatusBar(self.statusbar)
  60.         self.actioncaidan = QtWidgets.QAction(mainWindow)
  61.         self.actioncaidan.setObjectName("actioncaidan")
  62.         self.menugui.addAction(self.actioncaidan)
  63.         self.menubar.addAction(self.menugui.menuAction())
  64.         self.menubar.addAction(self.menu.menuAction())

  65.         self.retranslateUi(mainWindow)
  66.         # self.pushButton.clicked.connect(self.button_clickked)
  67.         QtCore.QMetaObject.connectSlotsByName(mainWindow)
  68.         mainWindow.setTabOrder(self.lineEdit, self.lineEdit_2)
  69.         mainWindow.setTabOrder(self.lineEdit_2, self.pushButton)
  70.         mainWindow.setTabOrder(self.pushButton, self.textBrowser)

  71.     def retranslateUi(self, mainWindow):
  72.         _translate = QtCore.QCoreApplication.translate
  73.         mainWindow.setWindowTitle(_translate("mainWindow", "第一个GUI"))
  74.         self.pushButton.setText(_translate("mainWindow", "确认"))
  75.         self.label_3.setText(_translate("mainWindow", "信息栏:"))
  76.         self.label.setText(_translate("mainWindow", "请输入密码:"))
  77.         self.lineEdit_2.setPlaceholderText(_translate("mainWindow", "密码"))
  78.         self.label_2.setText(_translate("mainWindow", "请输入用户名:"))
  79.         self.lineEdit.setPlaceholderText(_translate("mainWindow", "用户名"))
  80.         self.menugui.setTitle(_translate("mainWindow", "文件"))
  81.         self.menu.setTitle(_translate("mainWindow", "关于"))
  82.         self.actioncaidan.setText(_translate("mainWindow", "caidan "))
复制代码


之后有创建一个GUI1.py程序,实现界面分离,但是运行后,界面虽然现实正常,但是在界面输入用户名和密码后不能获取

以下是执行程序代码
  1. import sys
  2. from untitled import Ui_mainWindow
  3. from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog

  4. class MainCode(QMainWindow, Ui_mainWindow):

  5.     def __init__(self):
  6.         QMainWindow.__init__(self)
  7.         Ui_mainWindow.__init__(self)
  8.         self.setupUi(self)
  9.         # super().setupUi(mainWindow)
  10.         self.pushButton.clicked.connect(self.on_save) #  获取按钮点击
  11.     #  信号槽
  12.     def on_save(self):
  13.         password = self.lineEdit_2.text()
  14.         name = self.lineEdit.text()
  15.         print(password)
  16.         print(name)
  17. if __name__ == '__main__':
  18.     app = QApplication(sys.argv)
  19.     mainWindow = QMainWindow()  # 创建主窗口
  20.     w = MainCode()   # 调用ui中的ui_mainWindow类,并赋值给w
  21.     w.setupUi(mainWindow)  # 调用ui文件中的ui_mainWindow类中的setupUi函数,并传给主窗口mainWindow
  22.     mainWindow.show()  # 显示窗口
  23.     sys.exit(app.exec_())  # 程序主循环
复制代码
最佳答案
2021-2-1 10:13:40
MainCode类初始化时直接将
  1. QMainWindow.__init__(self)
  2. Ui_mainWindow.__init__(self)
复制代码

合并为
  1. super().__init__()
复制代码
就可以了。

问题在if name == main那里,改为
  1. if __name__ == '__main__':
  2.     app = QApplication(sys.argv)
  3.     mainWindow = MainCode()  # 创建主窗口
  4.     mainWindow.show()  # 显示窗口
  5.     sys.exit(app.exec_())  # 程序主循环
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-2-1 10:13:40 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
MainCode类初始化时直接将
  1. QMainWindow.__init__(self)
  2. Ui_mainWindow.__init__(self)
复制代码

合并为
  1. super().__init__()
复制代码
就可以了。

问题在if name == main那里,改为
  1. if __name__ == '__main__':
  2.     app = QApplication(sys.argv)
  3.     mainWindow = MainCode()  # 创建主窗口
  4.     mainWindow.show()  # 显示窗口
  5.     sys.exit(app.exec_())  # 程序主循环
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-1 10:38:26 | 显示全部楼层
hrp 发表于 2021-2-1 10:13
MainCode类初始化时直接将
合并为就可以了。

if name ==main  为什么要这样写?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-1 11:09:15 From FishC Mobile | 显示全部楼层
老麦2021 发表于 2021-2-1 10:38
if name ==main  为什么要这样写?

因为maincode的初始化方法已经setupui并将信号连接槽函数了,你在name==main再setupui一次,ui就会覆盖到上一个ui上,而这次的按钮还没有将点击信号连接到槽函数,所以点击没反应。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-1 13:33:07 | 显示全部楼层
hrp 发表于 2021-2-1 11:09
因为maincode的初始化方法已经setupui并将信号连接槽函数了,你在name==main再setupui一次,ui就会覆盖到 ...

我记得按照你说的这个办法改过,但是改完以后好像窗口就成空窗口了,没有按钮和输入框
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-1 13:44:46 From FishC Mobile | 显示全部楼层
老麦2021 发表于 2021-2-1 13:33
我记得按照你说的这个办法改过,但是改完以后好像窗口就成空窗口了,没有按钮和输入框


maincode初始化方法改了没?
我用手机写的测不了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-1 14:48:00 | 显示全部楼层
本帖最后由 YunGuo 于 2021-2-1 14:58 编辑

这样写
  1. import sys
  2. from PyQt5.QtWidgets import *
  3. import luntan  # ui文件

  4. class MainCode(QMainWindow):
  5.     def __init__(self):
  6.         QMainWindow.__init__(self)
  7.         self.main_ui = luntan.Ui_mainWindow()
  8.         self.main_ui.setupUi(self)
  9.         self.main_ui.pushButton.clicked.connect(self.on_save)

  10.     def on_save(self):
  11.         password = self.main_ui.lineEdit_2.text()
  12.         name = self.main_ui.lineEdit.text()
  13.         print(password)
  14.         print(name)

  15. if __name__ == '__main__':
  16.     app = QApplication(sys.argv)
  17.     win = MainCode()
  18.     win.show()
  19.     app.exit(app.exec_())
复制代码


或者这样

  1. import sys
  2. from PyQt5.QtWidgets import *
  3. from luntan import Ui_mainWindow

  4. class MainCode(QMainWindow, Ui_mainWindow):
  5.     def __init__(self):
  6.         super(MainCode, self).__init__()
  7.         self.setupUi(self)
  8.         self.pushButton.clicked.connect(self.on_save)

  9.     def on_save(self):
  10.         password = self.lineEdit_2.text()
  11.         name = self.lineEdit.text()
  12.         print(password)
  13.         print(name)

  14. if __name__ == '__main__':
  15.     app = QApplication(sys.argv)
  16.     win = MainCode()
  17.     win.show()
  18.     app.exit(app.exec_())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-1 19:08:18 | 显示全部楼层

两种方法全部都是窗口没有控件,不显示任何按钮与输入框
由于不能上传图片,只能放到网盘
链接: https://pan.baidu.com/s/1hPv72_R02Us6tK3yYHRM9Q 提取码: hnn5
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-1 19:09:23 | 显示全部楼层
hrp 发表于 2021-2-1 13:44
maincode初始化方法改了没?
我用手机写的测不了。

初始化方法也改了,只能显示一个空窗口,不能显示窗口中的控件
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-1 19:10:12 | 显示全部楼层

两种方法都试了,只能显示一个空窗口,不能显示窗口中的控件
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-1 19:45:39 | 显示全部楼层
hrp 发表于 2021-2-1 13:44
maincode初始化方法改了没?
我用手机写的测不了。

感谢解答,程序已经按照您的方法完美解决
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-1 19:46:35 | 显示全部楼层

感谢解答,问题已经处理完毕
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-1 19:55:04 | 显示全部楼层

您好:
我有一个地方不是太明白,还请您给讲解一下
super(MainCode, self).__init__()这一句为什么要加上MainCode
  1. class MainCode(QMainWindow, Ui_mainWindow):
  2.     def __init__(self):
  3.         super(MainCode, self).__init__()
  4.         self.setupUi(self)
  5.         self.pushButton.clicked.connect(self.on_save)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 15:52:28 | 显示全部楼层
老麦2021 发表于 2021-2-1 19:08
两种方法全部都是窗口没有控件,不显示任何按钮与输入框
由于不能上传图片,只能放到网盘
链接: https: ...

我执行都没有问题,你执行有问题,兄弟你看看你写的代码和我的对比,哪里写多了,哪里写少了呢?至少我看你网盘这张图片,就有一个问题,if __name__ == '__main__':下面调用那个QMainWindow是啥?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 16:13:44 | 显示全部楼层
老麦2021 发表于 2021-2-1 19:55
您好:
我有一个地方不是太明白,还请您给讲解一下
super(MainCode, self).__init__()这一句为什么要 ...

这个也是初始化的作用,和super().__init__()作用一样。写法不同,看你个人习惯吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-28 09:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表