鱼C论坛

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

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

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

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

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

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

                               
登录/注册后可看大图

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_())  # 程序主循环
最佳答案
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_())  # 程序主循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-1 10:13:40 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
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_())  # 程序主循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

if name ==main  为什么要这样写?
想知道小甲鱼最近在做啥?请访问 -> 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上,而这次的按钮还没有将点击信号连接到槽函数,所以点击没反应。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我记得按照你说的这个办法改过,但是改完以后好像窗口就成空窗口了,没有按钮和输入框
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


maincode初始化方法改了没?
我用手机写的测不了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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_())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

初始化方法也改了,只能显示一个空窗口,不能显示窗口中的控件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

两种方法都试了,只能显示一个空窗口,不能显示窗口中的控件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢解答,程序已经按照您的方法完美解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢解答,问题已经处理完毕
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

您好:
我有一个地方不是太明白,还请您给讲解一下
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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

这个也是初始化的作用,和super().__init__()作用一样。写法不同,看你个人习惯吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 16:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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