老麦2021 发表于 2021-2-1 09:43:52

GUI界面分离程序无法获取按钮点击事件

使用pyqt5只做了一个GUI界面,但是不能获取按钮点击信号,也就是说用户输入用户名和密码,点击确认后获取不到用户的输入,下面是源码,请各位大神给指点一二
https://img-bbs.csdn.net/upload/202101/30/1612018238_901635.png
GUI界面代码如下
# -*- coding: utf-8 -*-

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


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_mainWindow(object):
    def setupUi(self, mainWindow):
      mainWindow.setObjectName("mainWindow")
      mainWindow.resize(487, 381)
      self.centralwidget = QtWidgets.QWidget(mainWindow)
      self.centralwidget.setObjectName("centralwidget")
      self.pushButton = QtWidgets.QPushButton(self.centralwidget)
      self.pushButton.setGeometry(QtCore.QRect(300, 250, 111, 41))
      self.pushButton.setObjectName("pushButton")
      self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
      self.textBrowser.setGeometry(QtCore.QRect(10, 30, 221, 301))
      self.textBrowser.setObjectName("textBrowser")
      self.label_3 = QtWidgets.QLabel(self.centralwidget)
      self.label_3.setGeometry(QtCore.QRect(10, 10, 54, 12))
      self.label_3.setObjectName("label_3")
      self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
      self.layoutWidget.setGeometry(QtCore.QRect(250, 40, 225, 141))
      self.layoutWidget.setObjectName("layoutWidget")
      self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
      self.gridLayout.setContentsMargins(0, 0, 0, 0)
      self.gridLayout.setObjectName("gridLayout")
      self.label = QtWidgets.QLabel(self.layoutWidget)
      self.label.setObjectName("label")
      self.gridLayout.addWidget(self.label, 2, 0, 1, 1)
      self.lineEdit_2 = QtWidgets.QLineEdit(self.layoutWidget)
      self.lineEdit_2.setText("")
      self.lineEdit_2.setObjectName("lineEdit_2")
      self.gridLayout.addWidget(self.lineEdit_2, 4, 1, 1, 1)
      self.label_2 = QtWidgets.QLabel(self.layoutWidget)
      self.label_2.setObjectName("label_2")
      self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1)
      self.lineEdit = QtWidgets.QLineEdit(self.layoutWidget)
      self.lineEdit.setText("")
      self.lineEdit.setObjectName("lineEdit")
      self.gridLayout.addWidget(self.lineEdit, 1, 1, 1, 1)
      self.label_2.raise_()
      self.label.raise_()
      self.lineEdit_2.raise_()
      self.lineEdit.raise_()
      mainWindow.setCentralWidget(self.centralwidget)
      self.menubar = QtWidgets.QMenuBar(mainWindow)
      self.menubar.setGeometry(QtCore.QRect(0, 0, 487, 23))
      self.menubar.setObjectName("menubar")
      self.menugui = QtWidgets.QMenu(self.menubar)
      self.menugui.setObjectName("menugui")
      self.menu = QtWidgets.QMenu(self.menubar)
      self.menu.setObjectName("menu")
      mainWindow.setMenuBar(self.menubar)
      self.statusbar = QtWidgets.QStatusBar(mainWindow)
      self.statusbar.setObjectName("statusbar")
      mainWindow.setStatusBar(self.statusbar)
      self.actioncaidan = QtWidgets.QAction(mainWindow)
      self.actioncaidan.setObjectName("actioncaidan")
      self.menugui.addAction(self.actioncaidan)
      self.menubar.addAction(self.menugui.menuAction())
      self.menubar.addAction(self.menu.menuAction())

      self.retranslateUi(mainWindow)
      # self.pushButton.clicked.connect(self.button_clickked)
      QtCore.QMetaObject.connectSlotsByName(mainWindow)
      mainWindow.setTabOrder(self.lineEdit, self.lineEdit_2)
      mainWindow.setTabOrder(self.lineEdit_2, self.pushButton)
      mainWindow.setTabOrder(self.pushButton, self.textBrowser)

    def retranslateUi(self, mainWindow):
      _translate = QtCore.QCoreApplication.translate
      mainWindow.setWindowTitle(_translate("mainWindow", "第一个GUI"))
      self.pushButton.setText(_translate("mainWindow", "确认"))
      self.label_3.setText(_translate("mainWindow", "信息栏:"))
      self.label.setText(_translate("mainWindow", "请输入密码:"))
      self.lineEdit_2.setPlaceholderText(_translate("mainWindow", "密码"))
      self.label_2.setText(_translate("mainWindow", "请输入用户名:"))
      self.lineEdit.setPlaceholderText(_translate("mainWindow", "用户名"))
      self.menugui.setTitle(_translate("mainWindow", "文件"))
      self.menu.setTitle(_translate("mainWindow", "关于"))
      self.actioncaidan.setText(_translate("mainWindow", "caidan "))

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

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

class MainCode(QMainWindow, Ui_mainWindow):

    def __init__(self):
      QMainWindow.__init__(self)
      Ui_mainWindow.__init__(self)
      self.setupUi(self)
      # super().setupUi(mainWindow)
      self.pushButton.clicked.connect(self.on_save) #获取按钮点击
    #信号槽
    def on_save(self):
      password = self.lineEdit_2.text()
      name = self.lineEdit.text()
      print(password)
      print(name)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = QMainWindow()# 创建主窗口
    w = MainCode()   # 调用ui中的ui_mainWindow类,并赋值给w
    w.setupUi(mainWindow)# 调用ui文件中的ui_mainWindow类中的setupUi函数,并传给主窗口mainWindow
    mainWindow.show()# 显示窗口
    sys.exit(app.exec_())# 程序主循环

hrp 发表于 2021-2-1 10:13:40

MainCode类初始化时直接将QMainWindow.__init__(self)
Ui_mainWindow.__init__(self)
合并为super().__init__()就可以了。

问题在if name == main那里,改为
if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainCode()# 创建主窗口
    mainWindow.show()# 显示窗口
    sys.exit(app.exec_())# 程序主循环

老麦2021 发表于 2021-2-1 10:38:26

hrp 发表于 2021-2-1 10:13
MainCode类初始化时直接将
合并为就可以了。



if name ==main为什么要这样写?

hrp 发表于 2021-2-1 11:09:15

老麦2021 发表于 2021-2-1 10:38
if name ==main为什么要这样写?

因为maincode的初始化方法已经setupui并将信号连接槽函数了,你在name==main再setupui一次,ui就会覆盖到上一个ui上,而这次的按钮还没有将点击信号连接到槽函数,所以点击没反应。

老麦2021 发表于 2021-2-1 13:33:07

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

我记得按照你说的这个办法改过,但是改完以后好像窗口就成空窗口了,没有按钮和输入框

hrp 发表于 2021-2-1 13:44:46

老麦2021 发表于 2021-2-1 13:33
我记得按照你说的这个办法改过,但是改完以后好像窗口就成空窗口了,没有按钮和输入框

maincode初始化方法改了没?
我用手机写的测不了。

YunGuo 发表于 2021-2-1 14:48:00

本帖最后由 YunGuo 于 2021-2-1 14:58 编辑

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

class MainCode(QMainWindow):
    def __init__(self):
      QMainWindow.__init__(self)
      self.main_ui = luntan.Ui_mainWindow()
      self.main_ui.setupUi(self)
      self.main_ui.pushButton.clicked.connect(self.on_save)

    def on_save(self):
      password = self.main_ui.lineEdit_2.text()
      name = self.main_ui.lineEdit.text()
      print(password)
      print(name)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainCode()
    win.show()
    app.exit(app.exec_())

或者这样

import sys
from PyQt5.QtWidgets import *
from luntan import Ui_mainWindow

class MainCode(QMainWindow, Ui_mainWindow):
    def __init__(self):
      super(MainCode, self).__init__()
      self.setupUi(self)
      self.pushButton.clicked.connect(self.on_save)

    def on_save(self):
      password = self.lineEdit_2.text()
      name = self.lineEdit.text()
      print(password)
      print(name)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainCode()
    win.show()
    app.exit(app.exec_())

老麦2021 发表于 2021-2-1 19:08:18

YunGuo 发表于 2021-2-1 14:48
这样写




两种方法全部都是窗口没有控件,不显示任何按钮与输入框
由于不能上传图片,只能放到网盘
链接: https://pan.baidu.com/s/1hPv72_R02Us6tK3yYHRM9Q 提取码: hnn5

老麦2021 发表于 2021-2-1 19:09:23

hrp 发表于 2021-2-1 13:44
maincode初始化方法改了没?
我用手机写的测不了。

初始化方法也改了,只能显示一个空窗口,不能显示窗口中的控件

老麦2021 发表于 2021-2-1 19:10:12

YunGuo 发表于 2021-2-1 14:48
这样写




两种方法都试了,只能显示一个空窗口,不能显示窗口中的控件

老麦2021 发表于 2021-2-1 19:45:39

hrp 发表于 2021-2-1 13:44
maincode初始化方法改了没?
我用手机写的测不了。

感谢解答,程序已经按照您的方法完美解决

老麦2021 发表于 2021-2-1 19:46:35

YunGuo 发表于 2021-2-1 14:48
这样写




感谢解答,问题已经处理完毕

老麦2021 发表于 2021-2-1 19:55:04

YunGuo 发表于 2021-2-1 14:48
这样写




您好:
我有一个地方不是太明白,还请您给讲解一下
super(MainCode, self).__init__()这一句为什么要加上MainCode
class MainCode(QMainWindow, Ui_mainWindow):
    def __init__(self):
      super(MainCode, self).__init__()
      self.setupUi(self)
      self.pushButton.clicked.connect(self.on_save)

YunGuo 发表于 2021-2-3 15:52:28

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

我执行都没有问题,你执行有问题,兄弟你看看你写的代码和我的对比,哪里写多了,哪里写少了呢?至少我看你网盘这张图片,就有一个问题,if __name__ == '__main__':下面调用那个QMainWindow是啥?

YunGuo 发表于 2021-2-3 16:13:44

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

这个也是初始化的作用,和super().__init__()作用一样。写法不同,看你个人习惯吧。
页: [1]
查看完整版本: GUI界面分离程序无法获取按钮点击事件