界面画好了,然后呢?
很多人兴冲冲地用 PyQt Designer 拖拽出了一个极其漂亮的登录窗口:
输入框对齐了,按钮居中了,连背景色都调得挺有质感。
但当你满怀期待地点击那个「提交」按钮时——
空气突然安静。
没有任何反应,没有任何提示。
它就像一张精美的 JPG 图片,好看,但没用。
这就是 UI 和 业务逻辑 的区别。
很多初学者容易陷入一种错觉:
以为画完界面,程序就完成了一半。
其实,真正的程序灵魂,现在才刚刚开始注入。
我们要做的,就是让 Python 代码去「接管」这个界面:
当用户输入 andy 和 123456 时,它能像个老朋友一样告诉你:“登录成功”;
而当密码输错时,它能铁面无私地弹出一句:“登录失败”。
❝没有逻辑的 UI 是 PPT,有了逻辑的 UI 才是程序。
今天这篇,我们就拿最经典的「用户登录」场景小试牛刀,彻底打通 界面(UI) 到 代码(Code) 的任督二脉。
来综合运用前面学到的知识,包括UI文件的设计、静态加载、信号与槽的基本使用以及控件属性的获取。
先别急着写代码,给项目「大扫除」
在动手写逻辑之前,我们先看一眼你的项目目录。
是不是所有的 .ui 文件、生成的 .py 文件都堆在根目录下?
如果不整理,随着项目变大,你找个文件得找半天。
优秀的程序员,都有点「代码洁癖」。
我们先做个简单的工程化改造:
把所有界面相关的文件(.ui 和生成的 .py)全拖进去。
再新建一个文件夹,叫 **实例:用户登录验证**,把我们的 main.py 也就是主程序放进去。
这时候,你的 main.py 肯定报错了,因为找不到文件。
别慌,我们需要修改一下导入路径。
原来你是直接导入,现在要告诉 Python 去 UI 文件夹里找:
from PyQt6. QtWidgets import QApplication, QMainWindowfrom PyQt6 import uicimport sysfrom UI.login import Ui_MainWindowclassMainWindow(QMainWindow,Ui_MainWindow):def__init__(self, *args, **kwargs):# 调用父类 QWidget 的构造方法# 必须先初始化父类,否则窗口无法正常创建 super().__init__(*args, **kwargs) self.setupUi(self) self.show()if __name__ == '__main__': print(sys.argv)# 创建 QApplication 应用对象,sys.argv 用于接收命令行参数(PyQt 内部可能会用到) app = QApplication(sys.argv)# 创建主窗口对象,此时会自动执行 MainWindow 的 __init__ 方法 w = MainWindow()# sys.exit 用于将 Qt 程序的退出状态码返回给操作系统 sys.exit(app.exec())
把原来那些动态加载的测试代码删掉,我们使用标准的静态加载继承方式。
运行一下,只要界面能弹出来,说明我们的「搬家」工作完成了。如下图所示:

核心机制:信号与槽
现在界面有了,如何让「点击按钮」这个动作,触发「验证密码」的功能?
这里必须提到 PyQt 最核心的概念:信号(Signal)与槽(Slot)。
别被术语吓跑,简单说就是:
- 信号:你做了一个动作(比如点击按钮
clicked)。 - 槽:程序做出的反应(比如执行
login 函数)。
我们要做的,就是把这两者连(connect)起来。
我们先去看看那个提交按钮叫什么名字。
在 UI 文件生成的代码里,它叫 login_button。如下图所示:

在 main.py 的初始化代码中,我们写下这句「牵线搭桥」的关键代码:
from PyQt6. QtWidgets import QApplication, QMainWindowimport sysfrom UI.login import Ui_MainWindowclassMainWindow(QMainWindow,Ui_MainWindow):def__init__(self, *args, **kwargs):# 调用父类 QWidget 的构造方法# 必须先初始化父类,否则窗口无法正常创建 super().__init__(*args, **kwargs) self.setupUi(self)# 点击提交按钮,去执行相应的动作 self.login_button.clicked.connect(self.login) self.show()# 省略部分代码
⚠️ 敲黑板,这里有两个新手必踩的坑:
- 拼写错误:是
clicked(过去分词),不是 click。如果你写成 click,程序会报错说找不到这个信号。 - 括号问题:connect 里面写的是
self.login,千万不要带括号!写 self.login:是告诉程序“绑定这个函数,等会儿用”。写 self.login():是告诉程序“现在立刻执行它”。
编写逻辑:你是谁?
连接建立好了,接下来我们来实现这个login方法。
这就纯粹是 Python 的逻辑了。
我们需要做三件事:
怎么获取输入框的内容?
PyCharm 的代码提示功能这时候就显神威了。输入 self.,找到你的用户名输入框对象(比如 username_edit),然后调用 .text() 方法。具体代码如下:
from PyQt6.QtWidgets import QApplication, QMainWindowimport sysfrom UI.login import Ui_MainWindowclassMainWindow(QMainWindow,Ui_MainWindow):def__init__(self, *args, **kwargs):# 省略部分代码deflogin(self): username = self.username_edit.text() # 获取用户输入的用户名 password = self.password_edit.text() # 获取用户输入的密码 print(username) print(password)if username == 'andy'and password == '123456': print('登录成功')else: print('登录失败')# 省略部分代码
就是这么简单。不需要什么高深的算法,这就是最朴素的业务逻辑。
见证奇迹的时刻
保存代码,重启程序。(注意:每次修改逻辑代码,都需要重启窗口才能生效)。输入用户名 andy,密码 123456。点击「提交」。
看一眼底部的控制台,应该会清清楚楚地打印出:登录成功!如下图所示:

再试个错的,把密码改成 1234567,点击提交:登录失败:用户名或密码错误。如下图所示:
这一步,跨越了一大步
恭喜你,你已经完成了一个完整的 GUI 应用程序闭环。
虽然现在只是在控制台打印文字,但你已经掌握了 PyQt 开发的万能公式:
「画界面 -> 整理目录 -> 绑定信号 -> 获取数据 -> 处理逻辑」。
以后无论是写一个复杂的串口调试助手,还是一个爬虫控制面板,核心思路都在这里。
下一步要做什么?
光在控制台打印太「程序员」了,用户可看不见控制台。
如果登录成功,能不能弹出一个小窗告诉用户?如果失败,能不能让输入框抖动一下?
保持关注,我们下篇继续完善这个「简陋」但「真实」的登录系统。