找到
105
篇与
寒烟似雪
相关的结果
- 第 4 页
-
PyQt5布局管理器进阶:网格布局与表单布局(附实战代码) 第6篇:PyQt5布局管理器进阶:网格布局与表单布局(完整代码) mjw558rv.png图片 哈喽~ 欢迎来到PyQt5系列的第6篇!上一章我们通过“简易文本编辑器”实战,巩固了线性布局(QVBoxLayout/QHBoxLayout)的用法。但在实际开发中,很多复杂界面(比如计算器、用户信息表单、数据展示表格)无法只用线性布局满足——要么控件排列混乱,要么自适应效果差。今天我们就来学习两种进阶布局管理器:网格布局(QGridLayout)和表单布局(QFormLayout),彻底解决复杂界面的排版难题! 一、先明确:进阶布局的核心作用 在学习具体布局前,先搞清楚两种布局的适用场景,避免用错地方: 网格布局(QGridLayout):控件按“行×列”的网格排列,适合需要精准控制控件位置的场景(如计算器按钮、表格数据展示);支持控件跨多行/多列,灵活性极高; 表单布局(QFormLayout):专门用于“标签+输入框”的表单场景(如用户注册/登录表单、信息填写窗口),自动对齐标签和输入框,界面规整且开发高效。 核心优势:两种布局都支持自适应——窗口缩放时,控件会按预设规则自动调整大小和位置,无需手动计算坐标。 二、网格布局(QGridLayout)详解:从基础到实战 网格布局的核心逻辑是“划分网格、给控件分配行和列”,比如将界面划分为3行3列,每个控件占1个“格子”,也可以让控件占2行1列(跨行吗)、1行2列(跨列)。 1. 网格布局基础用法(完整代码) 先实现一个简单的3×3网格,放置9个按钮,演示基础的行、列分配: import sys from PyQt5.QtWidgets import ( QApplication, QWidget, QPushButton, QGridLayout, QLabel ) from PyQt5.QtCore import Qt class GridLayoutDemo(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setWindowTitle("QGridLayout网格布局基础演示") self.resize(400, 300) # 1. 创建网格布局实例 grid_layout = QGridLayout() # 设置控件间距(格子之间的距离) grid_layout.setSpacing(10) # 设置边距(布局与窗口边缘的距离) grid_layout.setContentsMargins(20, 20, 20, 20) # 2. 创建控件并添加到网格布局 # 核心方法:addWidget(控件, 行号, 列号, 占用行数, 占用列数) # 行号、列号从0开始;占用行数/列数默认是1(可不写) for i in range(3): # 行:0、1、2 for j in range(3): # 列:0、1、2 btn = QPushButton(f"按钮({i},{j})") # 添加到网格的(i,j)位置,占1行1列 grid_layout.addWidget(btn, i, j) # 3. 额外添加一个跨列控件(占1行2列) cross_col_btn = QPushButton("跨2列按钮") grid_layout.addWidget(cross_col_btn, 3, 0, 1, 2) # 第4行(索引3),第0列,占1行2列 # 4. 额外添加一个跨行控件(占2行1列) cross_row_btn = QPushButton("跨2行按钮") grid_layout.addWidget(cross_row_btn, 0, 3, 2, 1) # 第0行,第4列(索引3),占2行1列 # 5. 将布局绑定到窗口 self.setLayout(grid_layout) if __name__ == "__main__": app = QApplication(sys.argv) window = GridLayoutDemo() window.show() sys.exit(app.exec_())mjw55cag.png图片 2. 网格布局关键方法解析 网格布局的核心是addWidget()方法,参数含义必须记牢: addWidget(控件, row, column, rowSpan, columnSpan) # row:控件所在的行号(从0开始) # column:控件所在的列号(从0开始) # rowSpan:控件占用的行数(默认1,即不跨行) # columnSpan:控件占用的列数(默认1,即不跨列)其他常用方法: setSpacing(像素值):设置相邻控件之间的间距,避免控件挤在一起; setContentsMargins(左, 上, 右, 下):设置布局与窗口边缘的距离,提升界面美观度; setRowStretch(行号, 拉伸系数):设置某一行的拉伸权重(窗口缩放时,拉伸系数大的行占更多空间); setColumnStretch(列号, 拉伸系数):设置某一列的拉伸权重,同理。 3. 网格布局实战:简易计算器界面(核心场景) 计算器是网格布局的典型应用——按钮按固定网格排列,部分按钮(如“0”“=”)跨列。我们实现一个简易计算器的界面(含输入框+按钮区): import sys from PyQt5.QtWidgets import ( QApplication, QWidget, QPushButton, QGridLayout, QLineEdit ) from PyQt5.QtCore import Qt class SimpleCalculator(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setWindowTitle("简易计算器(网格布局实战)") self.resize(350, 400) # 1. 创建主布局(垂直布局:输入框在上,按钮区在下) main_layout = QGridLayout() main_layout.setSpacing(10) main_layout.setContentsMargins(15, 15, 15, 15) # 2. 创建输入框(占1行4列) self.input_edit = QLineEdit() self.input_edit.setAlignment(Qt.AlignRight) # 文本右对齐(符合计算器习惯) self.input_edit.setStyleSheet("font-size: 20px; padding: 10px;") self.input_edit.setReadOnly(True) # 输入框只读,通过按钮输入 main_layout.addWidget(self.input_edit, 0, 0, 1, 4) # 第0行,第0列,占1行4列 # 3. 定义计算器按钮文本(按网格顺序排列) btn_texts = [ '7', '8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', '0', '.', '=', '+', 'C' # 清空按钮 ] # 4. 给按钮分配行和列,添加到网格布局 row = 1 # 从第1行开始(第0行是输入框) col = 0 for text in btn_texts: btn = QPushButton(text) btn.setStyleSheet("font-size: 16px; padding: 15px;") # 特殊处理:0按钮跨2列,C按钮跨2列 if text == '0': main_layout.addWidget(btn, row, col, 1, 2) # 占1行2列 col += 2 # 列号+2(跳过一个格子) elif text == 'C': main_layout.addWidget(btn, row, col, 1, 2) # 占1行2列 col += 2 else: main_layout.addWidget(btn, row, col) # 默认占1行1列 col += 1 # 每4列换行(计算器是4列按钮) if col >= 4: col = 0 row += 1 # 5. 绑定布局到窗口 self.setLayout(main_layout) # 6. 绑定按钮点击信号(简单演示:点击按钮显示文本到输入框) for i in range(main_layout.count()): widget = main_layout.itemAt(i).widget() if isinstance(widget, QPushButton): widget.clicked.connect(self.on_btn_click) def on_btn_click(self): """按钮点击槽函数:将按钮文本显示到输入框""" sender = self.sender() text = sender.text() if text == 'C': # 清空输入框 self.input_edit.clear() elif text == '=': # 简单计算(实际项目需处理异常,此处简化) try: result = eval(self.input_edit.text()) self.input_edit.setText(str(result)) except: self.input_edit.setText("错误") else: # 拼接文本 current_text = self.input_edit.text() self.input_edit.setText(current_text + text) if __name__ == "__main__": app = QApplication(sys.argv) calculator = SimpleCalculator() calculator.show() sys.exit(app.exec_())4. 计算器界面亮点 用网格布局精准还原计算器的按钮排列,“0”和“C”按钮跨列,符合实际计算器的交互习惯; 结合垂直布局的思路,将输入框和按钮区整合,界面层次清晰; 实现了基础的计算逻辑(数字拼接、清空、结果计算),信号与槽绑定简洁高效。 三、表单布局(QFormLayout)详解:高效实现表单界面 表单布局是“标签+输入框”的专用布局,无需手动调整对齐方式——它会自动将标签放在左侧、输入控件放在右侧,且所有标签和输入框分别对齐,开发效率极高。 1. 表单布局基础用法(完整代码) 实现一个简单的用户注册表单,包含“用户名、密码、邮箱、电话”四个字段: import sys from PyQt5.QtWidgets import ( QApplication, QWidget, QLabel, QLineEdit, QPushButton, QFormLayout, QVBoxLayout, QComboBox ) from PyQt5.QtCore import Qt class FormLayoutDemo(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setWindowTitle("QFormLayout表单布局基础演示") self.resize(400, 300) # 1. 创建主布局(垂直布局:表单在上,按钮在下) main_layout = QVBoxLayout() main_layout.setSpacing(20) main_layout.setContentsMargins(30, 30, 30, 30) # 2. 创建表单布局实例 form_layout = QFormLayout() form_layout.setSpacing(15) # 标签与输入框、行与行之间的间距 # 3. 创建标签和输入控件,添加到表单布局 # 核心方法:addRow(标签文本/标签控件, 输入控件) # 方式1:直接传标签文本(自动生成QLabel) form_layout.addRow("用户名:", QLineEdit()) # 方式2:传QLabel控件(可自定义标签样式) pwd_label = QLabel("密码:") pwd_label.setStyleSheet("color: #e74c3c;") pwd_edit = QLineEdit() pwd_edit.setEchoMode(QLineEdit.Password) # 密码隐藏 form_layout.addRow(pwd_label, pwd_edit) # 方式3:输入控件可以是其他类型(如下拉框) form_layout.addRow("性别:", QComboBox()) # 方式4:添加提示标签(跨两列) tip_label = QLabel("* 带星号的为必填项") tip_label.setStyleSheet("color: #95a5a6; font-size: 12px;") form_layout.addRow(tip_label) # 无输入控件时,标签跨两列 # 4. 调整标签对齐方式(默认左对齐,可改为右对齐) form_layout.setLabelAlignment(Qt.AlignRight) # 5. 创建提交按钮 submit_btn = QPushButton("提交表单") submit_btn.setStyleSheet("background-color: #3498db; color: white; padding: 8px;") # 6. 将表单布局和按钮添加到主布局 main_layout.addLayout(form_layout) main_layout.addWidget(submit_btn, alignment=Qt.AlignCenter) # 7. 绑定布局到窗口 self.setLayout(main_layout) if __name__ == "__main__": app = QApplication(sys.argv) window = FormLayoutDemo() window.show() sys.exit(app.exec_())2. 表单布局关键方法解析 addRow(标签, 输入控件):核心方法,添加一行表单;标签可以是字符串(自动生成QLabel)或QLabel实例,输入控件可以是QLineEdit、QComboBox等任意交互控件; setLabelAlignment(对齐方式):设置标签的对齐方式(如Qt.AlignRight让标签右对齐,与输入框间距更紧凑); setSpacing(像素值):设置“标签与输入框之间”和“相邻行之间”的间距; setFieldGrowthPolicy(策略):设置输入控件的拉伸策略(如QFormLayout.ExpandingFieldsGrow让输入控件随窗口缩放而拉伸)。 3. 表单布局实战:完整用户信息登记表单 整合表单布局和之前学的控件,实现一个完整的用户信息登记表单,包含输入框、下拉框、复选框,添加表单验证逻辑: import sys from PyQt5.QtWidgets import ( QApplication, QWidget, QLabel, QLineEdit, QPushButton, QFormLayout, QVBoxLayout, QComboBox, QCheckBox, QMessageBox ) from PyQt5.QtCore import Qt class UserInfoForm(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setWindowTitle("用户信息登记表单(表单布局实战)") self.resize(450, 350) self.setStyleSheet("font-size: 14px; color: #2c3e50;") # 1. 主布局 main_layout = QVBoxLayout() main_layout.setSpacing(20) main_layout.setContentsMargins(30, 30, 30, 30) # 2. 表单布局 form_layout = QFormLayout() form_layout.setSpacing(15) form_layout.setLabelAlignment(Qt.AlignRight) # 设置输入控件拉伸(随窗口缩放) form_layout.setFieldGrowthPolicy(QFormLayout.ExpandingFieldsGrow) # 3. 表单控件初始化 self.user_edit = QLineEdit() self.user_edit.setPlaceholderText("请输入用户名(3-10个字符)") self.pwd_edit = QLineEdit() self.pwd_edit.setEchoMode(QLineEdit.Password) self.pwd_edit.setPlaceholderText("请输入密码(6-16个字符)") self.email_edit = QLineEdit() self.email_edit.setPlaceholderText("请输入邮箱(如xxx@xxx.com)") self.gender_combo = QComboBox() self.gender_combo.addItems(["男", "女", "保密"]) self.phone_edit = QLineEdit() self.phone_edit.setPlaceholderText("请输入手机号(11位数字)") # 4. 添加表单行 form_layout.addRow("用户名*:", self.user_edit) form_layout.addRow("密码*:", self.pwd_edit) form_layout.addRow("邮箱*:", self.email_edit) form_layout.addRow("性别:", self.gender_combo) form_layout.addRow("手机号:", self.phone_edit) # 同意条款复选框(跨两列) self.agree_check = QCheckBox("我已阅读并同意《用户服务条款》") form_layout.addRow(self.agree_check) # 5. 提交按钮 self.submit_btn = QPushButton("提交信息") self.submit_btn.setStyleSheet(""" QPushButton { background-color: #27ae60; color: white; padding: 10px; border: none; border-radius: 4px; } QPushButton:hover { background-color: #219653; } """) # 6. 结果显示标签 self.result_label = QLabel("") self.result_label.setAlignment(Qt.AlignCenter) # 7. 添加到主布局 main_layout.addLayout(form_layout) main_layout.addWidget(self.submit_btn, alignment=Qt.AlignCenter) main_layout.addWidget(self.result_label) # 8. 绑定布局和信号 self.setLayout(main_layout) self.submit_btn.clicked.connect(self.check_form) def check_form(self): """表单验证逻辑:检查必填项、格式正确性""" # 1. 获取表单内容 username = self.user_edit.text().strip() password = self.pwd_edit.text().strip() email = self.email_edit.text().strip() gender = self.gender_combo.currentText() phone = self.phone_edit.text().strip() # 2. 验证必填项 if not username: QMessageBox.warning(self, "验证失败", "用户名不能为空!") return if not password: QMessageBox.warning(self, "验证失败", "密码不能为空!") return if not email: QMessageBox.warning(self, "验证失败", "邮箱不能为空!") return if not self.agree_check.isChecked(): QMessageBox.warning(self, "验证失败", "请同意用户服务条款!") return # 3. 验证格式(简化版) if len(username) < 3 or len(username) > 10: QMessageBox.warning(self, "验证失败", "用户名长度需在3-10个字符之间!") return if len(password) < 6 or len(password) > 16: QMessageBox.warning(self, "验证失败", "密码长度需在6-16个字符之间!") return if "@" not in email: QMessageBox.warning(self, "验证失败", "邮箱格式不正确(需包含@)!") return if phone and len(phone) != 11: QMessageBox.warning(self, "验证失败", "手机号需为11位数字!") return # 4. 验证通过,显示结果 result = f""" 信息提交成功! 用户名:{username} 性别:{gender} 邮箱:{email} 手机号:{phone if phone else "未填写"} """ self.result_label.setText(result) self.result_label.setStyleSheet("color: #27ae60;") if __name__ == "__main__": app = QApplication(sys.argv) form = UserInfoForm() form.show() sys.exit(app.exec_())5. 实战表单亮点 用表单布局快速实现规整的表单界面,标签右对齐,输入框自适应拉伸,开发效率高; 添加了完整的表单验证逻辑(必填项检查、格式验证),用QMessageBox弹出提示,提升用户体验; 结合了多种控件(输入框、下拉框、复选框),覆盖实际表单的常见场景; 美化了按钮样式(悬停效果、圆角),界面更美观。 四、布局嵌套技巧:复杂界面的核心思路 实际开发中,很少用单一布局完成复杂界面,而是通过“布局嵌套”组合使用——比如“主布局(垂直)”包含“表单布局”和“网格布局”,再搭配“水平布局”排列按钮。 嵌套核心原则: 先划分界面大区域(如“顶部标题区、中间内容区、底部按钮区”),用主布局(垂直/水平)管理; 每个小区域内部,根据控件类型选择合适的子布局(网格/表单/线性); 用addLayout()方法将子布局添加到主布局,实现层次化管理。 五、常见问题排查 问题1:网格布局控件重叠/位置错乱 → 解决:检查行号、列号是否正确,避免多个控件分配到同一个格子;跨行列时注意rowSpan和columnSpan的数值; 问题2:表单布局标签和输入框不对齐 → 解决:用setLabelAlignment()统一标签对齐方式;避免手动设置输入控件的固定宽度(让布局自动适配); 问题3:窗口缩放时控件不拉伸 → 解决:给布局添加拉伸系数(setRowStretch/setColumnStretch),或设置输入控件的拉伸策略(如表单布局的setFieldGrowthPolicy); 问题4:布局嵌套后界面混乱 → 解决:先画界面草图,明确大区域和子区域的划分;给每个布局添加setSpacing和setContentsMargins,避免间距混乱。 总结 本章我们掌握了两种进阶布局管理器的核心用法: 网格布局(QGridLayout):适合“行×列”的规整排列场景(如计算器),支持控件跨行列,灵活性极高; 表单布局(QFormLayout):专门用于“标签+输入框”的表单场景,自动对齐,开发效率高; 布局嵌套是复杂界面的核心思路,先划分大区域,再用子布局管理小区域。 下一章我们将学习PyQt5的文本与表格控件(QTextEdit与QTableWidget),进一步拓展界面的功能边界。如果在布局实操中遇到问题,或者有复杂界面的排版需求,欢迎在评论区留言讨论~ -
免费分享石大导航网站HTML源码 - 学生专属简洁校园导航工具 石大导航网站HTML源码:免费学生专属简洁导航资源分享 给大家免费分享一款专为学生群体打造的实用导航资源——HTML简洁大气石大导航网站源码!无需付费,石大学子、学生群体及需要简洁导航的用户都能免费获取,界面清爽简约,贴合日常上网与学习需求,不管是快速访问校园官网、学习平台,还是常用工具网站,都能高效直达,妥妥的轻量化便捷导航工具! mjw50t1c.png图片 一、核心资源信息 核心定位(资源核心价值):专为石大学子定制开发,聚焦校园学习与日常上网场景,整合校园官网、学习平台、工具网站、娱乐平台等各类常用网址,分类清晰直观,解决网址查找繁琐的问题,提升上网与学习效率;同时兼顾通用需求,普通用户也可按需修改使用。 技术与部署(资源实用性):基于HTML+JavaScript开发,属于纯静态源码,无需数据库支持,部署门槛极低,上传服务器即可使用,适配各类主机空间;界面简洁无冗余,加载速度快,无需复杂配置,学生或初学者都能轻松上手操作。 注意事项(资源使用提醒):源码集成的天气插件已无法使用,需在HTML代码底部更换为其他天气插件,避免影响网站打开速度与使用体验。 二、核心功能与特色(免费解锁清爽导航体验) 精准网址分类:预设贴合学生需求的网址分类,包括常用(石河子大学官网、各学院官网、教务处官网、一站式服务平台等校园核心网址)、学习(智慧树、雨课堂、U校园、优慕课、itest等学习平台)、工具与娱乐(QQ音乐、网易云音乐、抖音、哔哩哔哩等),无需手动收藏,快速定位目标网站。 实用附加功能:页面内置日历显示,方便查看日期;支持关键词搜索功能,若未输入关键词,将自动跳转到自定义网址,满足个性化使用需求。 界面与体验优势:整体设计简洁大气、清爽简约,无冗余信息干扰,视觉体验舒适;操作逻辑简单,无需学习成本,学生群体可直接上手使用,提升上网浏览心情。 三、资源适用场景(免费资源适配多需求) 这款免费分享的源码用途明确,适配场景集中: 石大学子:作为日常上网与学习的专属导航,快速访问校园官网、学习平台,省去记忆或查找网址的麻烦,提升学习与办事效率。 其他学生群体:可根据自身学校的常用网址,修改替换预设链接,打造专属校园导航网站,适配不同高校学生的需求。 个人用户:喜欢简洁导航风格的用户,可用于整理个人常用网址,打造干净无广告的私人导航页面。 初学者:作为HTML+JavaScript静态网站开发的学习案例,熟悉基础功能集成(日历、搜索跳转)与页面布局,积累建站经验。 资源获取 免费分享石大导航网站HTML源码 - 学生专属简洁校园导航工具 下载地址:https://pan.quark.cn/s/fbc10fe3f6eb 提取码: 免费又实用,针对性强且部署简单,尤其适合学生群体使用,只需替换失效的天气插件,就能快速拥有专属简洁导航平台,值得获取体验! -
免费分享Webstack纯静态网址导航源码 - HTML响应式导航网站搭建工具 Webstack纯静态网址导航系统HTML源码:免费开源导航资源分享 给大家免费分享一款实用的网址导航类资源——Webstack纯静态大气网址导航系统HTML源码!无需付费,个人用户、初学者或需要快速搭建导航网站的使用者都能免费获取,不用复杂配置,上传服务器即可使用,不管是整理常用网址、搭建个人导航平台,还是做小型工具导航站点,都能轻松满足需求,妥妥的轻量化高效资源! mjw4sngr.png图片 一、核心资源信息 核心定位(资源核心价值):源自WordPress主题的纯静态网址导航系统,专注提供清晰的网址分类与简洁大气的前台界面,整合一言API和和风天气API,额外补充实用信息(需替换为个人API密钥,避免共享密钥导致服务中断),打造个性化导航体验。 技术与部署(资源实用性):基于HTML开发,无需数据库支持,属于绿色源码,适用于各类主机空间;无复杂后台管理系统,上传到服务器就能直接运行,部署门槛极低,初学者也能快速上手;采用响应式设计,自动适配桌面电脑、平板电脑、智能手机等不同设备屏幕尺寸,兼容IE6-IE9、Firefox、Chrome、Opera、Safari等多种浏览器,使用无兼容顾虑。 二、核心功能与特色(免费解锁便捷导航体验) (一)核心优势 响应式适配:自动匹配不同设备屏幕,不管是电脑还是手机访问,都能保持界面美观、操作便捷,满足多终端使用需求。 部署零门槛:纯静态架构,无需配置数据库和复杂环境,上传服务器即可启用,省去繁琐安装步骤,节省时间成本。 自定义性强:网页内容可通过记事本、写字板或网页编辑器直接修改,无需专业编程知识,就能轻松定制网址分类、网站样式和展示内容,适配个人或小型需求。 轻量化无负担:源码体积小巧,不占用过多主机空间,运行流畅,无惧网络攻击,稳定性有保障。 实用API整合:内置一言API和和风天气API,能在导航页面展示随机语录和天气信息,丰富网站功能,提升用户体验。 (二)存在不足 代码结构杂乱:因源自WordPress主题扒取,代码缺乏规整,需要先美化整理后,才方便后续修改和二次开发。 管理效率较低:纯静态页面无后台管理系统,后续添加、修改网址或更新内容时,需手动编辑文件,批量操作不便,不适合大规模网址管理场景。 三、资源适用场景(免费资源适配多需求) 这款免费分享的源码用途十分广泛: 个人用户:搭建专属私人导航网站,整理常用网址(如工具类、影视类、学习类),告别浏览器收藏夹杂乱,快速访问目标网站。 初学者:作为HTML静态网站开发学习案例,熟悉响应式设计、API调用等基础技能,提升实操能力;同时体验零门槛部署流程,积累建站经验。 小型需求场景:搭建小型工具导航、兴趣圈层导航(如影视资源导航、设计工具导航),满足小范围人群的集中访问需求,无需投入过多技术和服务器成本。 临时展示站点:快速搭建临时网址汇总页面,用于活动推广、团队内部资源共享等场景,部署快、维护简单。 源码获取 免费分享Webstack纯静态网址导航源码 - HTML响应式导航网站搭建工具 下载地址:https://pan.quark.cn/s/84426ecdd655 提取码: 免费又实用,轻量化部署且自定义灵活,适合追求简单高效的导航需求,若无需大规模管理,这款Webstack纯静态导航源码绝对值得入手! -
雨云rainyun.com推荐 - 专属优惠码 MzM2MjI4 高性价比云服务器 实测推荐!雨云rainyun.com:高性价比云服务+专属优惠码,开发者/创业者必入 作为常年和服务器、云产品打交道的技术人,今天给大家安利一款亲测好用的云计算平台——雨云(rainyun.com),不仅产品矩阵齐全、性能稳定,还带来了专属优惠码和直达链接,新老用户都能薅福利,不管是搭建网站、部署源码,还是运行游戏服务器,都能满足需求! mjv8cgbw.png图片 一、雨云核心优势:为什么值得选? 产品丰富,一站式覆盖全场景 雨云的云产品完全能满足从个人开发者到企业的多元需求:云服务器性能强劲,支持弹性扩展,适配源码部署、网站搭建;游戏云(VPS/面板)低延迟、高稳定,玩游戏、开私服都流畅;还有裸金属物理机、显卡/网吧云、对象存储等,甚至包含域名注册、备案、免费SSL证书服务,不用跨平台折腾,一站式搞定所有云计算需求。 稳定靠谱,资质齐全有保障 作为正规云计算平台,雨云拥有《中华人民共和国增值电信业务经营许可证》(B1-20231485)、粤ICP备19052839号、粤公网安备44010302111123等完整资质,平台系统还取得了软件著作权(登记号:2023SR0336952),不用担心服务合规问题。节点监控实时可见,运行过程中几乎无宕机,技术团队响应及时,后续使用更放心。 优惠活动多,性价比拉满 除了日常的拼团优惠,雨云还推出了推广合伙人、雨创计划、润雨赞助计划等福利活动,降低使用成本。现在通过专属链接注册,再使用优惠码,还能额外享受折扣,对比同类型平台,价格优势明显,学生党、个人开发者也能轻松负担。 二、专属福利:优惠码+直达链接,省钱快人一步 专属直达链接:雨云 独家优惠码:MzM2MjI4 使用方式:打开直达链接注册雨云账号,选择心仪的云产品(云服务器、游戏云等),下单时输入优惠码MzM2MjI4,即可享受专属折扣,新用户首购更划算! 三、适用人群&使用场景推荐 开发者:部署开源源码、搭建测试环境,云服务器弹性扩展,配合免费SSL证书,快速上线个人项目; 游戏玩家/腐竹:游戏云(VPS/面板)低延迟、高带宽,支持各类游戏服务器搭建,多人联机不卡顿; 创业者/企业:裸金属物理机、对象存储满足高负载需求,域名备案、企业级安全防护一站式配齐,降低运营成本; 自媒体/站长:搭建个人博客、商业网站,稳定的节点和售后保障,确保网站全年正常访问。 四、额外加分项:细节拉满的用户体验 官方文档详细,新手也能快速上手部署,遇到问题还能通过QQ群、论坛等交流社区求助,用户和官方技术人员都会热心解答; 支持节点监控,实时查看服务器状态,还有完善的服务条款、退款政策,权益有保障; 定期更新产品功能和优惠活动,近期动态及时公示,长期使用能持续享受新福利。 总结 如果你正在寻找一款“产品全、性能稳、价格香”的云计算平台,雨云绝对值得一试!现在注册,输入优惠码MzM2MjI4,就能解锁专属折扣,不管是个人使用还是企业部署,都能省不少钱~ 亲测靠谱,赶紧冲起来! (提示:优惠活动可能有期限,建议尽早注册使用,有任何问题可联系雨云官方客服咨询~) -
免费分享意象桌面扫码点餐系统源码 - 微信小程序+H5餐饮多端运营解决方案 意象桌面扫码点餐系统源码:免费开源餐饮解决方案,多端适配助力商家高效运营 给大家免费分享一款专为餐饮行业打造的全能型开源资源——意象桌面扫码点餐系统源码!无需付费,个体餐饮商户、连锁品牌、餐饮创业者以及开发者都能免费获取,不管是搭建扫码点餐平台、拓展外卖与自取业务,还是实现会员营销与多门店统一管理,都能一站式满足需求,妥妥的餐饮行业降本增效利器! mjunri92.png图片 一、核心资源信息 核心定位(资源核心价值):聚焦餐饮全业务场景,提供从用户点餐到商家运营的完整闭环解决方案,覆盖扫码点餐、在线外卖、到店自取、提前预约、会员管理、营销推广等核心需求,帮助餐饮商家摆脱传统点餐模式的低效束缚,实现数字化、智能化运营,提升服务效率与客户体验。 技术架构(资源硬核配置):采用前后端分离架构,技术栈先进且成熟稳定,适配各类部署场景—— 后端:基于Spring Boot 3构建核心框架,搭配Spring Security OAuth2权限认证、MyBatis Plus数据访问、Redis缓存优化、JWT安全验证,同时整合Lombok、Hutool等实用工具,大幅提升开发效率与系统性能; 前端:PC端后台管理界面采用Vue3 + Element UI开发,界面清晰、操作便捷;移动端通过uni-app(Vue3)实现,无缝适配微信小程序与H5页面,覆盖用户主流访问场景; 项目结构:模块化划分明确,包含后端Java工程、后台管理前端工程、移动端uni-app工程,代码注释完善、逻辑清晰,便于理解与二次开发。 部署与适配(资源实用优势):支持本地服务器快速部署、云平台部署以及私有化部署,满足不同商家的服务器配置需求;兼容JDK 17、MySQL 8、Redis 6+、Node.js 16+等主流开发环境,搭配IDEA、VSCode、HBuilder等常用开发工具即可快速启动项目;同时支持SaaS多租户架构,既能满足个体商户的单门店运营,也能适配连锁品牌的多门店统一管理需求。 二、核心功能资源(免费解锁餐饮全场景运营能力) (一)用户端功能(微信小程序/H5双端支持) 灵活点餐模式:支持桌面扫码点餐,单人点餐高效便捷,多人协同点餐互不干扰,无需服务员手动记录,减少沟通成本;同时提供外卖配送与到店自取两种选择,用户可根据需求自由切换,外卖模式支持物流信息实时查看,自取模式无需排队等待,提升用餐体验。 丰富商品展示:支持多规格商品(SKU)管理,商品详情页包含图文介绍、价格、库存等信息,分类清晰(如新品推荐、招牌热卖、主食、饮品等),用户可快速找到心仪菜品,下单更直观。 多元支付与订单管理:支持微信支付、余额支付、积分+金额混合支付等多种支付方式,满足不同用户的支付习惯;用户可随时查看历史订单、当前订单状态(待支付、待出单、待收货、已完成等),订单信息一目了然,还能便捷处理退款申请。 完善会员体系:用户可维护个人信息、管理收货地址,查看积分明细与优惠券;积分可用于兑换商品或抵扣订单金额,优惠券支持领取与核销,增强用户粘性与复购意愿;同时提供余额充值功能,支持微信支付充值,方便用户快速下单支付。 提前预约功能:用户可提前预约到店时间,商家提前做好备餐准备,避免到店后长时间等待,提升用餐效率,尤其适合高峰时段用餐需求。 (二)商家后台功能(PC端专属管理) 商品与店铺管理:支持商品添加、编辑、上下架操作,可灵活配置商品规格、分类与图文详情;支持多门店信息维护,连锁品牌可统一管理旗下所有门店,独立设置各门店的商品、价格、配送范围等参数;内置图片素材库,商品图片、轮播图等素材可统一存储与管理,方便快速调用。 订单与桌台管理:实时查看所有订单信息,支持订单状态更新(接单、出单、完成、退款等)、订单打印,对接云打印机可实现小票自动打印,提升出单效率;支持桌号配置、扫码绑定桌台,实时查看桌台占用状态(空闲、已点餐、用餐中、已结账),便于合理安排座位,优化店内运营流程。 会员与营销管理:可设置会员等级、积分规则,查看会员充值记录、消费明细,支持黑名单管理,精准筛选优质客户;提供丰富的营销工具,包括优惠券创建与发放、充值活动配置(如充值送积分、送优惠券),助力商家吸引新客户、留住老客户,提升营业额。 收银与数据管理:内置收银台功能,支持扫码枪、扫码盒子等设备收款,适配线下门店直接收银场景;实时统计今日营业额、订单数量、访客人数、退单数量等核心数据,商家可直观掌握门店运营状况,为经营决策提供数据支持。 微信公众号对接:支持微信公众号关注引导、自定义菜单配置,可向用户推送订单通知、活动公告等消息,增强与用户的互动,提升品牌曝光与用户活跃度。 (三)技术支撑功能(保障系统稳定高效运行) 安全机制:采用JWT认证与OAuth2安全框架,保障用户信息与交易数据的传输安全;严格的权限控制体系,不同角色(管理员、门店操作员等)分配专属权限,避免数据误操作。 性能优化:通过Redis缓存热点数据(如商品信息、会员积分等),减少数据库查询压力,提升系统响应速度,即使高峰时段多用户同时点餐也能保持流畅。 开发便捷:整合Lombok、Hutool等工具简化代码编写,开发环境配置清晰,本地部署流程简单,开发者可快速搭建开发环境,开展二次开发工作。 三、资源特色(免费资源优势拉满) 技术先进且稳定:基于Spring Boot 3、Vue3等主流技术栈构建,架构设计合理,兼容性强、扩展性好,能够适应餐饮行业的业务变化与规模扩张,长期使用无后顾之忧。 多场景全面适配:覆盖扫码点餐、外卖、自取、预约、会员营销、多门店管理等餐饮核心场景,无论是快餐店、饮品店、特色餐厅,还是连锁餐饮品牌,都能精准匹配需求。 开源免费无套路:采用MIT License开源协议,完全开源可商用,无强制保留作者信息或版权信息的要求,商家可直接部署使用,开发者可自由修改、定制功能,大幅降低开发与运营成本。 可定制性极强:代码结构清晰、模块化设计合理,附带完善注释与相关文档,二次开发门槛低,商家可根据自身业务特点添加特色功能(如专属营销活动、定制化支付方式等),开发者可基于源码拓展更多餐饮相关功能,打造个性化解决方案。 运营效率翻倍:通过数字化点餐流程减少人工干预,降低服务员工作量与人为失误;多端协同与实时数据统计让商家运营管理更高效,会员营销工具助力提升用户复购与营业额,全方位为餐饮商家降本增效。 四、资源适用场景(免费资源适配多类需求) 这款免费分享的意象桌面扫码点餐系统源码,适用场景十分广泛: 个体餐饮商户(快餐店、饮品店、小吃店等):快速搭建扫码点餐平台,减少人工点餐压力,提升翻台率;支持外卖与自取业务,拓展销售渠道,增加营收来源。 连锁餐饮品牌:借助SaaS多租户架构实现多门店统一管理,同步商品信息、营销活动,实时监控各门店运营数据,规范品牌运营标准,降低管理成本。 餐饮创业者:无需投入高额资金开发定制系统,直接基于源码快速搭建专属点餐平台,缩短项目上线周期,聚焦核心产品与服务,提升创业成功率。 开发者/技术团队:作为餐饮行业系统开发的参考案例,学习前后端分离架构、多端适配、权限管理等技术实现;或基于源码二次开发,为餐饮客户提供定制化解决方案,提升项目交付效率。 餐饮行业服务商:整合源码功能,为合作餐饮商家提供一站式数字化运营解决方案,涵盖点餐、会员、营销等模块,增强服务竞争力。 下载 下载点餐小程序源码 下载地址:https://pan.quark.cn/s/b8b58d03cbb2 提取码: 免费又实用,功能全面且技术成熟,不管是直接部署使用,还是二次开发定制专属功能,这款意象桌面扫码点餐系统源码都能为餐饮行业从业者带来实实在在的价值,强烈推荐获取体验! -
字节曜博客 2026 元旦快乐!愿技术同行新岁顺意,万事可期 元旦快乐!愿新岁如朝阳,温暖而明亮 元旦的钟声已经敲响,时光的年轮又增添了新的一圈。在这辞旧迎新的时刻,我谨向所有字节曜博客的读者们致以最诚挚的祝福:元旦快乐,万事胜意! mju9a26l.png图片 一、岁序更替:告别与迎接的仪式感 站在2026年的门槛上,我们不禁回望刚刚过去的一年。那些欢笑与泪水,成功与挑战,都已沉淀为生命中宝贵的财富。旧岁已展千重锦,新年再进百尺竿。元旦,不仅仅是一个时间节点,更是一个充满仪式感的新起点,让我们有机会重新审视自己,整理行囊,带着希望与梦想再次出发。 二、新年新愿:多元祝福送给特别的你 1. 愿你如阳光般明媚 新的一年,愿阳光洒满你的每一天,温暖而不刺眼。愿你的笑容如春日般灿烂,烦恼如冰雪般消融。当生活偶尔阴霾,请记得:你本就是自己生命中最耀眼的光芒。 2. 愿你如星辰般璀璨 在追求梦想的道路上,愿你像夜空中的星辰一样,既保持自己独特的光芒,又与周围的世界和谐共处。愿你的努力被看见,付出有回报,在属于自己的领域里闪闪发光。 3. 愿你如流水般从容 面对生活的起伏跌宕,愿你拥有流水般的智慧:遇山绕行,遇石分流,始终保持前进的方向。学会在忙碌中寻找安宁,在挑战中锤炼韧性,在变化中把握机遇。 4. 愿你如大地般厚实 新的一年,愿你拥有坚实的根基和广阔的胸怀。像大地一样,默默耕耘,静待花开;像大地一样,包容万物,涵养生命。愿你的内心充满力量,足以支撑你走过每一段路程。 三、字节同行:技术赋能,共赴新程 作为字节曜博客的编辑,我特别想对所有技术爱好者说:2026年,让我们继续在技术的海洋中探索,在代码的世界里创造。愿我们的每一行代码都能解决实际问题,每一个创新都能带来真实价值,每一次分享都能点亮他人的智慧。 在这个AI与大数据交织的时代,愿我们保持"Always Day 1"的初心,不断学习,持续成长,用技术的力量为世界增添美好。 四、结语:携手同行,未来可期 元旦的意义,不仅在于迎接新的一年,更在于我们对未来的共同期待。愿2026年的每一个日子,都能带给你新的惊喜和成长;愿我们在字节曜博客这个平台上,继续分享知识,交流思想,共同进步。 最后,再次祝愿大家:元旦快乐,阖家幸福,身体安康,万事顺遂! 让我们一起,以饱满的热情迎接充满希望的2026年! -
免费分享bujuan开源播放器 - 安卓第三方网易云音乐轻量工具(跨平台) bujuan开源音乐播放器:安卓端免费第三方网易云工具分享 给大家免费分享一款专注音乐体验的播放器资源——bujuan开源第三方网易云音乐播放器!无需付费,网易云音乐爱好者、开发者都能免费获取,安卓用户可直接下载使用,它去除冗余功能、聚焦核心播放体验,不管是日常听歌,还是开发者学习二次开发,都是性价比超高的优质资源! mju3e9tq.png图片 一、核心资源信息 核心定位(资源核心价值):专为网易云音乐用户打造的第三方播放器,专注核心音乐播放功能,剔除原生APP中不必要的社交、视频等冗余模块,让界面更简洁、操作更流畅,沉浸式享受音乐。 技术与适配(资源实用性):基于Flutter框架开发,具备超强跨平台兼容性,支持Android、iOS、Windows、macOS、Linux五大系统(目前官方仅提供安卓APP下载);项目目录结构清晰,包含多平台支持文件,技术成熟且易扩展。 二、核心功能与特色(免费解锁纯粹音乐体验) 便捷账号登录:支持手机号登录和二维码扫码登录两种方式,直接关联网易云音乐账号,无需额外注册,快速同步个人音乐数据。 核心播放功能:覆盖网易云核心音乐服务,包括每日推荐、私人FM、电台播放、云盘歌曲播放,满足日常听歌的各类需求;还能按歌曲、专辑、歌手精准搜索,快速找到想听的音乐。 个性化推荐:内置智能推荐系统,基于用户听歌习惯推送契合口味的音乐,像私人雷达、歌单推荐等功能,精准捕捉音乐偏好。 多平台统一体验:依托Flutter框架优势,不同系统上的界面风格、操作逻辑保持一致,不管后续切换到iOS、Windows等平台,都能快速适应。 开源可定制:项目代码完全开源,开发者可自由修改、定制功能,或打包适配其他平台,适合作为Flutter开发学习案例,也能二次开发打造专属播放器。 轻量中文友好:体积轻巧不占过多设备内存,中文界面简洁直观,国内用户使用无门槛,上手就能顺畅操作。 三、资源适用场景(免费资源适配多需求) 这款免费分享的播放器资源,用途十分广泛: 网易云音乐爱好者:想摆脱原生APP冗余功能,追求纯粹听歌体验,用它能专注音乐本身,界面干净、操作流畅。 跨平台需求用户:后续计划在iOS、Windows、macOS、Linux等设备上使用统一播放器,可等待官方版本或自行编译,实现多设备音乐体验同步。 开发者:学习Flutter跨平台开发技术,研究音乐播放器的功能实现逻辑;或基于开源代码二次开发,添加个性化功能、定制界面风格。 获取APP bujuan播放器 下载地址:https://pan.quark.cn/s/49a886393fee 提取码: 免费又纯粹,专注音乐体验且支持多平台扩展,不管是普通用户日常听歌,还是开发者学习实践,这款bujuan开源播放器都值得一试! -
免费分享基于ThinkPHP在线证书查询系统源码 - 多端证书管理查询工具 基于ThinkPHP在线证书查询系统源码:免费开源资源分享 给大家免费分享一款实用的证书管理类资源——基于ThinkPHP开发的在线证书查询系统源码!无需付费,教育机构、培训机构或任何需要管理和查询证书信息的组织都能免费获取,不管是搭建官方证书查询平台,还是规范证书数据管理流程,都能轻松满足需求,妥妥的高效管理工具资源! mju39ijg.png图片 一、核心资源信息 核心定位(资源核心价值):专注在线证书查询与管理全需求,支持证书信息快速查询、后台统一管理,解决证书真伪核验、数据规范存储等问题,让用户便捷查询证书详情,组织高效管控证书数据,适配各类需要公开或内部查询证书的场景。 技术与适配(资源实用性):基于ThinkPHP框架开发,采用PHP+MySQL作为核心技术组合,技术成熟稳定,易维护易扩展;采用响应式设计,完美适配PC端和手机端,不同设备访问都能获得良好体验,兼容主流浏览器,使用无门槛。 二、核心功能与特色(免费解锁高效证书管理体验) 证书查询与管理:用户可通过证书编号等相关信息快速查询证书详情,核验真伪;管理员在后台能全面管理证书信息,包括添加、修改、删除等操作,流程简洁高效。 批量数据操作:支持JSON、CSV、Excel等多种格式的数据批量导入和导出,不用逐个录入或整理数据,大幅提升证书数据处理效率,节省人力成本。 权限与数据安全:支持多管理员角色设置,可给不同角色分配专属权限,避免数据误操作或泄露;通过加密传输和严格权限控制,全方位保障证书数据和用户信息安全。 界面与体验优化:前端查询界面和后台管理界面都精心设计,清新简洁,操作直观易懂,新手也能快速上手;特别修复了之前版本中证书照片错位、遮挡证件号码的问题,确保证书信息准确可读。 三、资源适用场景(免费资源适配多需求) 这款免费分享的源码用途十分广泛: 教育机构:用于学生毕业证、资格证书等信息管理,方便学生和用人单位在线查询核验,提升管理规范性。 培训机构:管理培训结业证书、技能证书数据,学员可自行查询证书信息,机构高效维护数据,降低沟通成本。 企业/行业组织:针对内部认证证书、职业资格证书等进行管理,实现证书信息公开查询,提升公信力。 其他组织:任何需要集中管理证书数据、提供在线查询服务的场景,都能直接部署使用或二次开发适配。 源码下载 多端证书管理查询工具 下载地址:https://pan.quark.cn/s/877adf53a2b8 提取码: 免费又实用,功能全面且体验流畅,不管是直接搭建使用,还是根据需求二次开发,这款基于ThinkPHP的在线证书查询系统源码都值得入手! -
免费分享酷瓜云课堂PHP源码 - 开源在线教育网校知识付费系统 酷瓜云课堂PHP源码:免费在线教育开源资源分享 mju2gi6m.png图片 给大家免费分享一款超实用的在线教育类资源——酷瓜云课堂PHP开源免费在线教育系统源码!无需付费,教育机构、企业、有知识分享需求的个人或开发者都能免费获取,不管是搭建网课平台、网校系统,还是做知识付费、企业内部培训平台,都能轻松实现,妥妥的低成本高效解决方案! 一、核心资源信息 核心定位(资源核心价值):专注在线教育全场景需求,提供开源的网课、网校、知识付费一体化系统,支持教学全流程管理——从课程发布、直播授课,到作业布置、考试考核、学习进度跟踪,一站式满足线上教学与培训需求,全功能可免费商用,不用顾虑版权问题。 技术与部署(资源实用性):基于高性能C扩展Phalcon框架开发,遵循GPL-2.0开源协议,运行响应快速且安全可靠;采用容器化部署方式,屏蔽环境差异,不用复杂配置,快速就能搭建起专属在线教育平台,依托MySQL数据库存储数据,技术成熟易维护。 二、核心功能与特色(免费解锁优质教育平台体验) 多端无缝适配:支持PC、H5、微信小程序、安卓和苹果端,学员可随时随地通过不同设备学习,打破时间和空间限制,提升学习便利性与灵活性,覆盖更多用户场景。 安全稳定高性能:依托Phalcon框架的C扩展优势,系统响应迅速,就算多用户同时在线学习、观看直播,也能保持流畅体验;具备完善的数据安全保护机制,保障教学数据和用户隐私安全。 全场景教学支持:教育机构可实现线上教学全流程管理,教师能上传教学资料、直播授课、布置作业与考试;企业可开展线上培训,跟踪员工学习进度并考核;个人可发布课程、提供在线辅导,实现知识变现。 低成本无套路:开源免费且支持商业使用,无需支付高额授权费,大幅降低搭建在线教育平台的成本;容器化部署简化操作,不用专业技术团队也能快速上线,省心省力。 三、资源适用场景(免费资源适配多需求) 这款免费分享的源码用途十分广泛: 教育机构:利用自身师资力量搭建专属网课平台,开展线上教学,实现教学全流程数字化管理,拓展教学边界。 企业单位:搭建内部培训平台,发布培训课程,跟踪员工学习进度并进行考核,结合线下培训形成多元化培训模式。 平台用户:针对积累的粉丝群体,搭建自主运营的知识付费平台,将粉丝转化为付费用户,实现商业转型。 个人用户:凭借专业知识或优质资源,搭建个人知识变现平台,通过发布课程、在线辅导等方式,将知识转化为收益。 资源下载 下载 下载地址:https://pan.quark.cn/s/d5f9dd35f8d3 提取码: 免费又实用,功能全面且部署便捷,不管是机构规模化运营,还是个人小范围分享,这款酷瓜云课堂PHP源码都能满足需求,强烈推荐有在线教育需求的用户获取使用! -
免费分享 PHP 码蚁成绩管理系统源码 - 教育机构学生成绩统计管理工具 PHP码蚁成绩管理系统源码:免费教育类开源资源分享 给大家免费分享一款专为教育机构打造的实用管理资源——PHP码蚁成绩管理系统源码!无需付费,学校、培训机构、老师都能免费获取,不管是优化成绩管理流程、减轻教务工作负担,还是规范学生成绩统计分析,都能轻松满足需求,妥妥的教育行业高效工具资源! mju0trbs.png图片 一、核心资源信息 核心定位(资源核心价值):聚焦教育机构的成绩管理需求,由一线小学教师结合实际工作场景开发,功能设计贴合教学日常——从学生信息维护、考试安排,到成绩录入、统计分析,再到权限管控,一站式解决成绩管理全流程问题,不用再依赖Excel手动统计,大幅提升工作效率。 技术适配(资源实用性):基于PHP开发,采用ThinkPHP框架,前端搭配X-adminV2.2界面,后端负责数据处理与逻辑运算,技术成熟稳定;依托MySQL数据库存储数据,支持常规服务器部署,安装配置流程简单,教育机构IT人员或有基础的老师都能操作。 二、核心功能资源(免费解锁全能管理体验) 完善的基础管理:支持学期、班级、班主任、学科管理,可维护学生、教师、管理员信息,还能设置单位信息、类别管理等系统基础配置,满足不同教育机构的组织架构需求。 灵活的考试与成绩管理:可自定义考试信息,设置各学科满分、优秀、良好、及格分数线及人数占比;能生成学生考试号、试卷标签和成绩采集表,方便考试组织;支持多种成绩录入方式——在线手动录入、表格批量录入、扫码枪快速录入,还能随时修改成绩,操作灵活。 全面的成绩统计分析:能查看成绩列表和多类型图表(柱形图、折线图、雷达图、箱体图等),直观呈现班级、年级成绩分布;可统计单个学生历次成绩,用表格+折线图展示成绩变化趋势;还能自定义统计项目,生成详细成绩报告,助力教学分析与决策。 精准的权限管控:支持教师、学生、管理员不同身份登录,按职务(教研组长、班主任、普通教师)分工分配数据权限,确保成绩数据安全,避免信息泄露;管理员可统一管理角色、权限,规范系统使用流程。 实用的数据保障功能:支持数据备份与恢复,防止意外丢失;可下载成绩列表、成绩条、班级/年级成绩统计表等,方便线下存档或分享;还能设置网页统计结果显示项目,按需展示关键数据。 三、资源特色(免费资源优势突出) 操作简便易上手:界面简洁明了,符合教育工作者使用习惯;优化后的操作流程,三步就能到达核心功能位置,不用复杂学习,老师快速就能熟练使用。 功能贴合教学实际:由一线教师开发,精准命中成绩管理痛点——比如扫码枪录入适配考试后快速登分场景,多图表统计满足教学分析需求,比通用管理系统更实用。 数据安全可靠:具备权限分级、数据加密等安全措施,同时支持数据备份恢复,保障成绩数据的完整性和保密性,教育机构可放心使用。 可扩展性强:基于成熟框架开发,代码结构清晰,教育机构可根据自身需求二次开发,比如添加特色统计项目、适配个性化教学管理流程。 四、资源适用场景(免费工具适配多需求) 这款免费分享的源码用途十分广泛: 中小学:用于班级、年级成绩统一管理,快速完成成绩录入、统计分析,生成成绩单和教学分析报告,减轻教务和老师工作量。 培训机构:针对各类考试(随堂测、阶段考、结业考)进行成绩管理,跟踪学员成绩变化,向家长反馈学习情况。 教研部门:汇总多所学校或多个班级成绩数据,进行跨班级、跨年级对比分析,为教学质量评估提供数据支持。 一线教师:个人管理所带班级成绩,快速统计平均分、优秀率、及格率,分析学生薄弱环节,精准调整教学策略。 资源下载 下载 下载地址:https://pan.quark.cn/s/e46b8a706785 提取码: 免费又实用,功能全面还贴合教育场景,不管是直接部署使用,还是二次开发适配个性化需求,这款PHP码蚁成绩管理系统源码都值得教育行业从业者获取! -
Python 微信自动回复工具 | 带 PyQt5 图形界面 支持 Excel 关键词配置 微信自动回复工具(带PyQt界面) 最近帮朋友处理微信客服消息,重复回复太费时间,干脆写了个带图形界面的自动回复工具。不用记命令,填个Excel路径点按钮就能跑,还能实时看日志,日常用着挺顺手。下面把完整代码和用法贴出来,有需要的可以直接拿去改。 mjr3m247.png图片 先说说要准备的东西 环境:Python 3.8+(版本太高可能和pywin32不兼容) 要装的库:直接复制下面的命令到cmd里跑 pip install pywin32 pandas pyqt5 openpyxlmjr3dd3v.png图片 Excel回复表:建个Excel文件,第一列叫“关键词”,第二列叫“回复内容”,比如这样: 关键词回复内容你好您好~有什么可以帮您?下班时间我们18点下班,急事可留言~价格具体报价请发需求给我哦~mjr3ggkk.png图片 没有的朋友们不要急,我提供了默认数据文件下载,方便测试 微信自动回复表 下载地址:https://pan.quark.cn/s/75a06eed928c 提取码: 完整代码 import sys import time import win32gui import win32api import win32con import pandas as pd from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QLabel, QLineEdit, QPushButton, QTextEdit, QVBoxLayout, QHBoxLayout, QFileDialog) from PyQt5.QtCore import QThread, pyqtSignal, Qt from PyQt5.QtGui import QFont, QPalette, QColor # 消息监听线程:单独开线程是为了不让界面卡住 class ReplyWorker(QThread): # 用来给界面发日志的信号 log_send = pyqtSignal(str) # 用来告诉界面线程是否正常启动 thread_status = pyqtSignal(bool) def __init__(self, excel_path): super().__init__() self.excel_path = excel_path self.reply_rules = {} # 存关键词和回复的对应关系 self.wechat_handle = 0 # 微信窗口的句柄 self.running = False # 控制线程运行的开关 def load_excel_rules(self): """加载Excel里的关键词和回复""" try: # 用openpyxl读xlsx格式,避免编码问题 df = pd.read_excel(self.excel_path, engine='openpyxl') # 转成字典,查起来快 self.reply_rules = dict(zip(df['关键词'], df['回复内容'])) self.log_send.emit(f"回复表加载成功!共{len(self.reply_rules)}条规则") return True except Exception as e: # 捕获各种错误:文件没找到、格式不对、列名错 err_msg = f"加载Excel失败:{str(e)}" self.log_send.emit(err_msg) return False def find_wechat(self): """找到微信窗口,返回是否找到""" # 微信PC端的窗口名一般是“微信”,类名留空不限制 self.wechat_handle = win32gui.FindWindow(None, "微信") if self.wechat_handle == 0: self.log_send.emit("没找到微信窗口!请先打开微信并登录") return False # 把微信窗口提到最前面 win32gui.SetForegroundWindow(self.wechat_handle) self.log_send.emit(f"找到微信啦!窗口句柄:{self.wechat_handle}") return True def find_child(self, parent_handle, class_name=None): """找窗口里的子控件(比如输入框、发送按钮)""" child_handles = [] # 递归遍历所有子控件 def _enum_child(hwnd, extra): if class_name is None or win32gui.GetClassName(hwnd) == class_name: extra.append(hwnd) return True win32gui.EnumChildWindows(parent_handle, _enum_child, child_handles) # 返回第一个找到的控件(一般够用) return child_handles[0] if child_handles else 0 def get_last_msg(self, chat_panel): """获取聊天面板里最后一条消息""" # 微信聊天面板的文本就是所有消息,按换行分割取最后一行 all_msg = win32gui.GetWindowText(chat_panel) if all_msg: return all_msg.split("\n")[-1].strip() return "" def send_reply(self, input_box, send_btn, reply_content): """模拟输入并发送回复""" # 先清空输入框:选中所有文本再删除 win32gui.SendMessage(input_box, win32con.EM_SETSEL, 0, -1) win32gui.SendMessage(input_box, win32con.WM_CLEAR, 0, 0) # 逐个字符输入(太快会乱码,加个小延迟) for char in reply_content: win32gui.SendMessage(input_box, win32con.WM_CHAR, ord(char), 0) time.sleep(0.02) # 点击发送按钮 win32gui.SendMessage(send_btn, win32con.BM_CLICK, 0, 0) def run(self): """线程主逻辑:启动后一直监听""" self.running = True # 先加载规则和找微信,有一个失败就退出 if not self.load_excel_rules() or not self.find_wechat(): self.thread_status.emit(False) self.running = False return self.thread_status.emit(True) # 定位微信的核心控件(不同版本可能要改class_name,用Spy++看) session_list = self.find_child(self.wechat_handle, "ContactPanel") # 会话列表 input_box = self.find_child(self.wechat_handle, "Edit") # 输入框 send_btn = self.find_child(self.wechat_handle, "Button") # 发送按钮 chat_panel = self.find_child(self.wechat_handle, "ChatPanel") # 聊天面板 # 检查控件是否都找到 if not all([session_list, input_box, send_btn, chat_panel]): self.log_send.emit("没找到微信的核心控件!可能版本不兼容") self.running = False return self.log_send.emit("所有控件已定位,开始监听消息...") # 循环监听未读消息 while self.running: # 遍历所有会话找带“未读”的 sessions = [] win32gui.EnumChildWindows(session_list, lambda hwnd, extra: extra.append(hwnd), sessions) for session in sessions: session_text = win32gui.GetWindowText(session) if "未读" in session_text: # 点击未读会话,切换到聊天界面 win32gui.SendMessage(session, win32con.BM_CLICK, 0, 0) time.sleep(0.5) # 等消息加载出来 # 提取联系人(去掉“未读”字样) contact = session_text.replace("未读", "").strip() # 提取最后一条消息 last_msg = self.get_last_msg(chat_panel) if not last_msg: continue self.log_send.emit(f"\n收到[{contact}]的消息:{last_msg}") # 匹配关键词找回复 reply = "抱歉呀,我暂时没理解你的意思~" for keyword, content in self.reply_rules.items(): if keyword in last_msg: reply = content break self.log_send.emit(f"准备回复:{reply}") # 发送回复 self.send_reply(input_box, send_btn, reply) self.log_send.emit("回复发送成功!") # 每2秒查一次,别占太多CPU time.sleep(2) def stop(self): """停止线程""" self.running = False self.log_send.emit("\n监听已停止") # 主界面窗口 class ReplyWindow(QMainWindow): def __init__(self): super().__init__() self.worker = None # 监听线程对象 self.init_ui() # 初始化界面 def init_ui(self): """画界面:布局、按钮、输入框这些""" # 窗口基本设置 self.setWindowTitle("微信自动回复工具 v1.0 - 作者:寒烟似雪 2025/12/29发布在字节曜www.ziyeyao.com博客") self.setFixedSize(1200, 1000) # 固定大小,不允许拉伸 self.setStyleSheet("background-color: #f5f5f5;") # 中心部件(主窗口必须有个中心部件才能放内容) central_widget = QWidget() self.setCentralWidget(central_widget) # 主布局(垂直排列:路径输入→按钮→日志) main_layout = QVBoxLayout(central_widget) main_layout.setSpacing(15) # 控件之间的间距 main_layout.setContentsMargins(25, 25, 25, 25) # 边距 # 1. Excel路径选择区域(水平排列:标签→输入框→选择按钮) path_layout = QHBoxLayout() # 路径标签 path_label = QLabel("回复表路径:") path_label.setFont(QFont("微软雅黑", 10)) # 路径输入框 self.path_edit = QLineEdit() self.path_edit.setFont(QFont("微软雅黑", 9)) self.path_edit.setPlaceholderText("点击右侧按钮选择Excel文件") self.path_edit.setStyleSheet(""" QLineEdit { padding: 6px; border: 1px solid #ddd; border-radius: 4px; background-color: white; } """) # 路径选择按钮 self.select_btn = QPushButton("选择文件") self.select_btn.setFont(QFont("微软雅黑", 9)) self.select_btn.setStyleSheet(""" QPushButton { padding: 6px 12px; border: none; border-radius: 4px; background-color: #4285f4; color: white; } QPushButton:hover { background-color: #3367d6; } """) self.select_btn.clicked.connect(self.select_excel) # 绑定选择文件事件 # 把三个控件加到水平布局里 path_layout.addWidget(path_label) path_layout.addWidget(self.path_edit, stretch=1) # 输入框占满剩余空间 path_layout.addWidget(self.select_btn, stretch=0) main_layout.addLayout(path_layout) # 2. 启动/停止按钮区域(水平排列) btn_layout = QHBoxLayout() # 启动按钮 self.start_btn = QPushButton("启动监听") self.start_btn.setFont(QFont("微软雅黑", 10)) self.start_btn.setStyleSheet(""" QPushButton { padding: 8px 0; border: none; border-radius: 4px; background-color: #34a853; color: white; } QPushButton:disabled { background-color: #a0d9a0; } QPushButton:hover:enabled { background-color: #2d8d46; } """) self.start_btn.clicked.connect(self.start_listen) # 绑定启动事件 # 停止按钮 self.stop_btn = QPushButton("停止监听") self.stop_btn.setFont(QFont("微软雅黑", 10)) self.stop_btn.setStyleSheet(""" QPushButton { padding: 8px 0; border: none; border-radius: 4px; background-color: #ea4335; color: white; } QPushButton:disabled { background-color: #e8a098; } QPushButton:hover:enabled { background-color: #d33526; } """) self.stop_btn.clicked.connect(self.stop_listen) # 绑定停止事件 self.stop_btn.setEnabled(False) # 初始状态:停止按钮禁用 # 两个按钮平分宽度 btn_layout.addWidget(self.start_btn, stretch=1) btn_layout.addSpacing(10) # 按钮之间的间距 btn_layout.addWidget(self.stop_btn, stretch=1) main_layout.addLayout(btn_layout) # 3. 日志显示区域 # 日志标签 log_label = QLabel("运行日志:") log_label.setFont(QFont("微软雅黑", 10)) main_layout.addWidget(log_label) # 日志文本框(只读) self.log_edit = QTextEdit() self.log_edit.setFont(QFont("Consolas", 9)) self.log_edit.setReadOnly(True) self.log_edit.setStyleSheet(""" QTextEdit { padding: 8px; border: 1px solid #ddd; border-radius: 4px; background-color: white; color: #333; } """) main_layout.addWidget(self.log_edit, stretch=1) # 日志框占满剩余空间 def select_excel(self): """选择Excel文件,把路径填到输入框""" # 打开文件选择对话框,只显示Excel文件 file_path, _ = QFileDialog.getOpenFileName( self, "选择回复表", "", "Excel Files (*.xlsx; *.xls)" ) if file_path: self.path_edit.setText(file_path) def start_listen(self): """启动监听线程""" # 先检查路径是否填了 excel_path = self.path_edit.text().strip() if not excel_path: self.add_log("请先选择Excel回复表!") return # 检查线程是否已经在跑了 if self.worker and self.worker.isRunning(): self.add_log(" 监听已经在运行啦,不用重复启动") return # 创建线程对象,绑定信号 self.worker = ReplyWorker(excel_path) self.worker.log_send.connect(self.add_log) # 接收日志信号 self.worker.thread_status.connect(self.set_btn_status) # 接收线程状态信号 self.worker.finished.connect(self.thread_finished) # 线程结束时的信号 # 启动线程 self.worker.start() # 暂时禁用启动按钮 self.start_btn.setEnabled(False) self.add_log("正在初始化监听...") def stop_listen(self): """停止监听线程""" if self.worker and self.worker.isRunning(): self.worker.stop() # 禁用停止按钮,启用启动按钮 self.stop_btn.setEnabled(False) self.start_btn.setEnabled(True) else: self.add_log(" 监听还没启动呢,不用停止") def add_log(self, msg): """往日志框里加内容,自动滚到最下面""" # 加个时间戳,方便看什么时候发生的 time_str = time.strftime("[%H:%M:%S]", time.localtime()) self.log_edit.append(f"{time_str} {msg}") # 自动滚动到最后一行 self.log_edit.moveCursor(self.log_edit.textCursor().End) def set_btn_status(self, is_running): """根据线程状态设置按钮是否可用""" self.start_btn.setEnabled(not is_running) self.stop_btn.setEnabled(is_running) def thread_finished(self): """线程结束时的处理""" self.set_btn_status(False) self.add_log("监听线程已结束") def closeEvent(self, event): """窗口关闭时,确保线程也停了""" if self.worker and self.worker.isRunning(): self.worker.stop() self.worker.wait() # 等线程彻底结束 event.accept() def add_log(self, msg): """往日志里加内容(单独写个方法,方便调用)""" time_str = time.strftime("[%H:%M:%S]", time.localtime()) self.log_edit.append(f"{time_str} {msg}") self.log_edit.ensureCursorVisible() # 自动滚屏 # 程序入口 if __name__ == "__main__": app = QApplication(sys.argv) window = ReplyWindow() window.show() sys.exit(app.exec_()) 怎么用? 先建好转发的Excel表(列名必须是“关键词”和“回复内容”) 运行代码,会弹出一个窗口 点击“选择文件”,找到你建的Excel表 点击“启动监听”,然后打开微信(必须是PC端,登录状态) 有人发消息含关键词,就会自动回复了,日志里能看到过程 不想用了就点“停止监听”,或者直接关窗口 mjr3et38.png图片 注意事项 微信版本兼容问题 这个工具是靠pywin32识别微信窗口控件来实现的,不同版本的微信,控件的类名(比如ContactPanel、ChatPanel)可能不一样。如果运行时提示“没找到核心控件”,可以用Spy++(VS自带工具)查看你电脑上微信的控件类名,然后修改代码里find_child方法传入的class_name参数。 必须打开微信PC端 工具没法模拟微信登录,运行前一定要手动打开微信PC端并登录账号,而且最好不要最小化微信窗口,否则可能识别不到控件。 Excel格式要求 Excel文件里必须有两列,列名严格对应“关键词”和“回复内容”,建议保存为.xlsx格式,避免编码问题。如果提示“加载Excel失败”,检查一下文件路径有没有中文或特殊字符,或者是不是被其他软件占用了。 避免重复回复 工具默认每2秒扫描一次未读消息,如果你担心同一条消息被重复回复,可以在代码里加一个“已处理消息列表”,把已经回复过的消息内容存进去,下次扫描时先判断是否在列表里。 权限问题 运行程序时,如果遇到“权限不足”的提示,右键点击Python.exe,选择“以管理员身份运行”,或者给当前用户授予窗口控制的权限。 常见问题解决 问题1:启动后提示“没找到微信窗口” 解决:确认微信PC端已经打开,并且窗口标题是“微信”(不是其他自定义标题);如果微信在任务栏隐藏,先点击显示出来。 问题2:能找到微信,但提示“没找到核心控件” 解决:用Spy++查看微信的会话列表、输入框、发送按钮的类名,替换代码里对应的class_name;比如有些版本的微信输入框类名是RichEdit20W。 问题3:回复内容发送乱码 解决:在send_reply方法里,延长字符输入的延迟时间,把time.sleep(0.02)改成time.sleep(0.05);同时确保Excel文件的编码是UTF-8。 问题4:线程启动后,界面卡死 解决:检查是不是把监听逻辑写在了主线程里——这个工具的监听代码在ReplyWorker线程里,和界面线程分离,不会卡界面;如果还是卡,大概率是控件识别耗时太长,可以减少扫描频率,把time.sleep(2)改成time.sleep(5)。 结语 这便是我制作的微信自动回复工具啦,有bug可以在评论区留言。有动手能力的朋友们可以尝试添加以下功能: 添加黑白名单:可以在Excel里加一列“是否启用”,或者单独建一个黑白名单文件,指定哪些联系人需要自动回复,哪些不需要。 支持多关键词匹配:现在是匹配到第一个关键词就回复,可以改成支持多个关键词同时匹配,比如“价格”和“优惠”同时出现时,回复特定内容。 定时启停:添加一个时间选择控件,设置每天的监听时间段,比如只在9:00-18:00运行,其他时间自动停止。 回复记录导出:把收到的消息和发送的回复记录到本地文件(比如CSV),方便后续查看和统计。 -
免费分享HTML在线扫雷游戏网页源码 - 经典益智Web游戏开发素材 HTML在线扫雷游戏网页源码:免费开源资源分享 给大家免费分享一款经典又耐玩的Web游戏资源——HTML在线扫雷游戏网页源码!无需付费,玩家、开发者都能免费获取,不用复杂安装,打开浏览器就能直接玩,不管是日常休闲打发时间,还是学习Web开发技术,都是性价比超高的优质资源! mjr1mfvo.png图片 一、核心资源信息 技术架构(资源核心配置):基于HTML+CSS+JavaScript开发,是单页小游戏源码,包含完整的游戏逻辑,代码结构清晰,拿来就能直接部署使用,也方便后续按需修改。 部署使用便捷性(资源优势):无需安装任何软件,不用配置复杂环境,直接在浏览器中打开就能玩;不管是PC、平板还是手机浏览器,都能顺畅运行,跨平台体验无压力。 二、核心功能资源(免费解锁经典扫雷体验) 多难度自由选择:内置初级、中级、高级三种预设难度,满足不同水平玩家需求——新手可以从初级上手,熟悉规则;老玩家能挑战高级难度,享受推理乐趣;还支持自定义雷区尺寸和地雷数量,想玩多大规模、多少地雷都能自己设置,玩法更灵活。 友好界面设计:界面简洁明了,色彩搭配和谐不刺眼,游戏区域和控制按钮一目了然,就算是第一次玩扫雷的用户,也能快速找到操作入口,上手无难度。 流畅稳定体验:源码经过精心优化,资源占用少、加载速度快,游戏过程中不会出现卡顿、延迟的情况,点击排查、标记地雷等操作响应迅速,保障沉浸式游戏体验。 三、资源特色(免费资源优势突出) 经典玩法复刻:完美还原传统扫雷的核心逻辑,通过点击排查方块、标记地雷,锻炼推理能力和反应速度,勾起童年回忆,休闲解压超合适。 可定制性强:支持自定义难度参数,开发者还能基于源码修改界面风格、添加特效或拓展新功能,满足个性化需求。 轻量化无负担:单页源码设计,加载快、不占设备内存,打开浏览器就能启动游戏,碎片时间随时能玩。 学习价值高:代码逻辑清晰,涵盖Web开发基础技能(如事件处理、界面交互、逻辑判断等),适合Web开发初学者作为学习案例,也能给有经验的开发者提供项目参考灵感。 四、资源适用场景(免费资源适配多需求) 这款免费分享的扫雷游戏源码,用途十分广泛: 普通玩家:日常休闲解压、打发碎片时间,不管是通勤路上、午休间隙,打开浏览器就能玩一局,轻松放松。 Web开发初学者:学习HTML、CSS、JavaScript的实际应用,通过分析源码理解游戏逻辑搭建、界面交互实现等基础技能,提升编程实践能力。 开发者/团队:作为项目参考素材,借鉴代码优化、轻量化设计的思路,或嵌入自己的网站、小程序中,丰富平台娱乐功能。 教学场景:作为编程教学案例,帮助学员直观理解前端开发的核心逻辑和操作流程,提升学习兴趣。 获取资源 H5扫雷源码 下载地址:https://pan.quark.cn/s/3839123b35bd 提取码: 免费无套路,经典又实用,不管是直接玩还是用来学习开发,这款HTML在线扫雷游戏网页源码都值得入手! -
免费分享变声器大师APP - 安卓聊天游戏短视频变声工具(萝莉御姐音) 变声器大师APP:安卓端免费变声工具,聊天游戏短视频都能用 给大家免费分享一款超有意思的手机变声工具——变声器大师APP!它是专为安卓用户设计的手机变声软件,不管是和好友微信QQ聊天整蛊、游戏开黑互动,还是在快手抖音做短视频配音,都能轻松切换声线,让声音玩出花样,妥妥的趣味工具资源! mjr1giec.png图片 一、核心资源信息 核心定位(资源核心价值):专注手机端实时变声与语音处理,支持微信、QQ、快手、抖音等主流社交/娱乐平台,不用切换APP,开悬浮窗就能随时变声;内置超多声线和语音包,从少女、御姐、萝莉、正太,到大叔、搞怪音效(比如海绵宝宝、机器人),甚至还有四川话、东北话、粤语等方言声线,满足不同场景的趣味需求。 使用门槛(资源便捷性):界面简洁直观,没有复杂操作步骤——不管是新手还是长辈,打开APP就能找到变声功能;不用注册登录,保护隐私的同时,省去繁琐流程,直接上手就能玩。 二、核心功能资源(免费解锁趣味变声体验) 丰富变声效果:采用全新变声算法,效果自然不生硬,预设了小男孩、小女孩、男青年、女青年等基础声线,还有萝莉、御姐、正太、大叔等热门类型,支持自定义调节变声参数(比如音调、语速),DIY专属个性声音;还自带火爆的海量语音包,适合LOL、吃鸡、王者荣耀等热门游戏,开黑时发一句“有人吗”“你在干嘛鸭”,瞬间活跃氛围。 实时变声互动:支持悬浮窗模式,开启后不用退出聊天或游戏APP——按住悬浮窗“按住说话”录完音,就能直接切换变声类型,点击播放试听效果,再同步到微信QQ发语音,全程不用来回切换,实时变声超方便;快手录短视频时也能这么操作,计时结束直接对接录音功能,配音变声一步到位。 清晰录音与管理:录音音质清晰,能完整保留声音细节,变声后也不模糊;还有完善的本地录音文件管理功能,录好的变声音频能分类保存,想找的时候一目了然,不怕丢失。 便捷分享传播:处理好的变声语音或录音,能直接分享到微信、QQ、微博、抖音等平台,不用额外保存再上传;不管是给好友发“土味情话”,还是分享游戏变声片段,都能快速完成,互动更有乐趣。 三、资源特色(免费工具优势突出) 效果自然不生硬:新变声算法比传统工具更细腻,不会有“机械感”,比如萝莉音软萌不刺耳,御姐音沉稳有质感,日常聊天或配音都不违和。 多场景无缝适配:不管是微信QQ实时聊天、游戏开黑语音,还是短视频录制配音,悬浮窗功能都能让变声“不打断操作”,不用频繁切APP,体验流畅。 免费无套路:核心变声功能完全免费,没有隐藏收费,也不用强制看广告才能用;录音和分享功能也不限制,普通用户日常使用完全够。 兼顾实用与趣味:除了变声,还能当清晰录音机用,课堂、会议记笔记也合适;语音包覆盖游戏、聊天、整蛊等场景,既好玩又实用。 四、资源适用场景(免费工具适配多需求) 这款免费的变声器大师APP,用途特别广: 游戏玩家:吃鸡、王者荣耀开黑时,用萝莉或御姐音和队友互动,让开黑更有氛围; 日常聊天:微信QQ和好友开玩笑,切换搞怪声线发语音,比如用海绵宝宝声说“你是不是不想理我呀”,增添互动趣味; 短视频创作者:抖音、快手做搞笑视频或配音时,用不同声线演绎角色,让作品更有特色; 普通用户:给家人发语音时换可爱声线,或者录“土味情话”分享,让日常沟通更有意思。 APP下载 变声器下载 下载地址:https://www.123865.com/s/WVrQvd-uHB6H?pwd=cytK# 提取码:cytK 免费又好玩,操作简单还不用费流量,不管是临时整蛊还是长期用,这款变声器大师APP都值得试试! -
免费分享水印抹布APP - 安卓视频图片去水印工具(多平台解析) 水印抹布APP:免费视频图片去水印工具,安卓端实用资源分享 给大家免费分享一款超实用的多媒体处理工具——水印抹布APP!它是专为去除视频和图片水印设计的手机应用,安卓用户可直接获取使用,不管是日常想保存无水印素材,还是自媒体创作者处理素材、普通用户编辑照片视频,都能轻松满足需求,妥妥的高效工具资源! mjr1bdpv.png图片 一、核心资源信息 核心定位(资源核心价值):专注解决视频、图片水印问题,能快速识别并去除各类水印——不管是社交媒体平台(如抖音、快手、小红书等)的平台水印,还是相机拍摄自带的水印,甚至支持YouTube、Instagram等国外主流平台素材的去水印与下载,输入素材链接就能自动处理,让素材恢复纯净质感。 使用门槛(资源便捷性):界面简洁直观,操作没有复杂步骤,就算是第一次用去水印工具的新手,也能快速上手;不用登录账号,保护隐私的同时,减少操作流程,打开APP就能直接处理素材。 二、核心功能资源(免费解锁全能处理体验) 高效去水印能力:采用先进的图像处理算法,几秒钟就能识别并抹除水印,还能精准定位复杂水印;支持“快速去除”“精细去除”“局部去除”等多种模式,按需选择更贴合需求;去除水印后还能保持视频图片的高清质量,不损失细节,画面依旧清晰。 批量与多平台支持:可一次性选择多个视频或图片批量处理,不用逐个操作,节省大量时间;不仅能处理本地素材,还支持解析抖音、快手、小红书、B站,以及YouTube、Instagram等国内外热门平台的素材链接,一键下载无水印版本,还能保存视频封面、字幕信息。 丰富编辑工具:除了去水印,还自带超多实用编辑功能——视频方面支持裁剪(自由比例/固定比例)、裁剪时长(剪片头片尾)、拼接多个片段、转GIF动图、变速;图片方面可裁剪尺寸、旋转角度、调整亮度对比度;还提供多种滤镜效果,能给素材加创意滤镜,打造个性化视觉风格。 安全与便捷辅助:处理过程会自动备份,防止意外丢失数据;采用数据加密技术,保护个人信息和素材安全,所有处理基本在本地执行,不泄露隐私;处理完成后能直接分享到社交平台,不用额外保存再上传,一步到位。 三、资源特色(免费工具优势突出) 功能全面无短板:不只是单纯去水印,还整合了下载、编辑、分享功能,一站式解决素材处理需求,不用再装多个工具。 操作简单易上手:界面模块化布局,功能按钮清晰,从解析素材、去水印到编辑保存,几步就能完成,新手也能轻松驾驭。 多场景适配:不管是自媒体创作者收集素材、处理作品,还是普通用户保存喜欢的视频图片、编辑生活记录,甚至是团队处理设计素材,都能满足。 免费友好:无订阅陷阱,不会自动扣费,低频用户还能通过观看广告、签到获取免费处理次数,不用花钱也能正常使用核心功能。 四、资源适用场景(免费工具适配多需求) 这款免费的水印抹布APP,用途特别广: 自媒体/内容创作者:快速收集各平台无水印素材,编辑后用于短视频、Vlog创作,提升内容质量。 日常用户:保存社交媒体上喜欢的视频图片(如教程、美景、生活片段),去除水印后收藏或分享给亲友。 设计/项目团队:批量处理设计素材中的水印,调整尺寸、拼接片段,高效完成设计方案或作品集。 海外内容爱好者:下载YouTube、Instagram等平台的优质内容,无水印保存,方便离线观看或二次创作(需注意版权)。 APP下载 水印抹布_1.0.3.zip 下载地址:https://pan.quark.cn/s/433c1619f03d 提取码:Advu 免费又好用,功能全还安全,不管是临时处理素材,还是长期使用,这款水印抹布APP都值得试试! -
免费分享多功能实用工具箱微信小程序源码 - 可变现工具类小程序资源 多功能实用工具箱微信小程序源码:免费开源资源分享 给大家免费分享一款超实用的微信小程序资源——多功能实用工具箱大全微信小程序源码!无需付费,个人开发者、小型团队都能免费获取,不管是学习小程序开发、快速搭建工具类产品,还是做创业项目孵化、个人副业变现,都是性价比超高的优质资源! mjr16vnj.png图片 一、核心资源信息 技术架构(资源核心配置):基于微信小程序原生开发,是综合性工具集合类项目,源码结构清晰、模块化设计合理,维护和二次开发都很方便,拿来就能按需调整功能。 部署便捷性(资源使用优势):不用配置服务器,也不用购买域名,直接在微信开发者工具中导入就能运行;数据可存在本地缓存,也能通过小程序云开发实现轻量级后端,零成本就能上线,技术门槛极低。 二、核心功能资源(免费解锁全能工具体验) 丰富工具集合:内置超多日常生活常用工具,比如单位换算、天气查询、快递查询、二维码生成器、日历提醒,还有手机清灰、震动手机、闪光灯、水平尺、各种计算器(房贷、工资、血型、亲戚关系等)、垃圾分类查询、网络测速等实用功能;还支持自定义添加新工具模块,后续想扩展功能也很灵活。 变现与推广功能:支持接入微信小程序官方流量主广告(包括Banner广告、激励视频广告等),能通过广告变现赚收益,特别适合个人副业或商业项目;首页可自定义轮播图,能用来做宣传推广、活动引导,轮播图还能配置跳转链接(内部页面或第三方小程序),支持跨平台导流,方便搭建小程序矩阵。 灵活扩展特性:所有功能模块都是独立封装的,提供详细注释和文档说明,就算是新手也能轻松上手二次开发;UI界面也是模块化设计,能根据需求重新设计主题风格,满足个性化需求。 三、资源特色(免费资源优势拉满) 免费可商用:源码完全开源,没有加密、没有使用限制,开发者能自由使用、修改和发布,不管是学习、教学演示,还是创业项目都能用。 低门槛零成本:不依赖服务器和数据库,省去运营成本;支持微信云开发,进一步简化后端逻辑,新手也能快速上线。 变现能力突出:快速接入流量主广告,轻松实现商业变现,是个人副业赚钱、小型团队创业的好选择。 高度可定制:功能模块能按需增删改查,界面风格可自由调整,灵活适配不同使用场景和需求。 体验友好:界面简洁直观,操作流程符合微信小程序用户使用习惯,工具分类清晰、搜索便捷,能提升用户留存率。 四、资源适用场景(免费资源适配多需求) 这款免费分享的源码用途特别广: 新手开发者:用来学习微信小程序开发技巧,熟悉模块化设计和功能封装; 个人用户:搭建专属工具类小程序,自用或分享给好友,提升生活效率; 创业者/小型团队:快速孵化工具类创业项目,借助广告变现和导流功能实现盈利; 教学场景:作为教学演示案例,帮助学员理解小程序开发逻辑和变现模式; 副业刚需:打造能赚钱的工具类小程序,利用流量主广告实现被动收入。 获取源码 微信实用工具箱集...程序源码.zip 下载地址:https://pan.quark.cn/s/045b6d30fcd8 提取码:1hb5 免费无套路,功能丰富又好部署,不管是直接使用还是二次开发,都能满足各类需求,强烈推荐大家获取体验! -
免费分享PHP仿微信即时聊天系统源码 - 支持音视频的多端通讯资源 PHP仿微信即时聊天系统源码:免费开源资源分享 给大家免费分享一款功能超全面的即时通讯资源——PHP仿微信即时聊天系统源码!无需付费,企业、开发者或有社交/沟通需求的用户都能免费获取,高度还原微信核心交互体验,不管是搭建内部沟通平台、社交社区,还是做在线客服、教育医疗行业的即时通讯解决方案,都是性价比拉满的优质资源! mjr13q1b.png图片 一、核心资源信息 技术架构(资源核心配置):基于PHP技术栈构建,采用前后端分离架构,后端通过PHP + MySQL + Redis + Workerman组合实现消息服务与业务逻辑,技术成熟稳定,拿来就能按需部署或二次开发。 服务器环境要求(资源部署适配):需搭配Linux OS(推荐CentOS 7.9)、Nginx(推荐最新稳定版)、PHP 7.3(兼容7.1及以上,不支持7.4+)、MySQL 5.7+、Redis 5.0+(推荐7.0)、Workerman 4.0+、Node.js 14.0+(推荐16.x)及npm 7.0+,满足配置即可稳定运行。 二、核心功能资源(免费解锁全能通讯体验) 全能聊天功能:单聊支持发送表情、图片、语音、视频、文件等多媒体消息,显示消息已读/未读状态和用户在线状态;群聊可创建/解散群组、管理成员(添加/移除)、设置群公告与禁言,管理员能撤回成员消息,还能限制群成员互加好友,保护隐私。 音视频通话:支持一对一音视频通话,已打通Web端与移动端,实现跨平台互通(小程序暂不支持该功能),满足实时沟通需求。 灵活消息设置:支持联系人置顶、消息免打扰、新消息声音提醒和浏览器通知推送,还能自定义消息接收方式,适配不同使用场景。 媒体与文件预览:支持文件、图片及大部分媒体格式在线预览,不用下载就能查看,大幅提升使用体验。 多端适配支持:兼容Web端、H5页面、原生APP安装使用,也支持小程序访问(部分功能受限),随时随地都能使用。 双模式自由切换:企业模式强调权限管理和信息保密,适合公司或组织内部使用;社区模式支持开放注册、用户自主加好友,适合搭建社交类平台。 消息推送与后台管理:APP支持单聊消息在线/离线推送(需自行配置Unipush服务);自带简易实用的后台管理界面,可实现用户管理、群组管理、系统设置、权限控制等功能。 三、资源特色(免费资源优势突出) 多端兼容性强:覆盖Web、H5、APP、小程序(部分功能),满足多样化部署需求,不管是电脑还是手机,都能顺畅使用。 微信风格UI设计:界面简洁直观,操作逻辑和微信高度契合,用户不用额外学习就能上手,降低使用门槛。 即时通信性能优异:基于Workerman构建实时消息服务,响应迅速且稳定,不会出现消息延迟、卡顿等问题。 数据安全有保障:支持群成员互加限制、消息撤回、权限分级等安全管理措施,兼顾隐私保护与信息管控。 易于二次开发:代码结构清晰,文档完整,不用复杂改动就能定制功能或扩展业务场景,适配不同需求。 四、资源适用场景(免费资源适配多需求) 这款免费分享的源码用途十分广泛: 企业/组织:搭建内部沟通平台,强调权限管理和信息保密,提升协作效率; 创业者/开发者:打造社交社区平台,支持用户注册、加好友、群聊等功能,快速落地社交项目; 行业解决方案:用于在线客服、教育辅导、医疗咨询等场景,实现实时沟通互动; 个性化需求:基于源码二次开发,定制专属即时通讯功能,适配更多细分场景。 源码获取 PHP仿微信聊天源码 下载地址:https://pan.quark.cn/s/77907e4d3481 提取码:V38p 免费无套路,功能全面且易部署,不管是直接使用还是二次开发,都能满足各类即时通讯需求,强烈推荐大家获取体验! -
免费分享HTML白色大气SEO优化公司网站源码 - 响应式企业建站模板 HTML白色大气SEO优化公司网站源码:免费开源资源分享 给大家免费分享一款超适合SEO相关企业的网站源码——HTML白色大气专业SEO排名优化公司网站模板!无需付费,SEO优化服务公司、网络营销机构、数字广告公司等企业,或是开发者、设计师,都能免费获取使用,不管是搭建企业官网、展示服务案例,还是对外宣传推广,都是实用性拉满的优质资源! mjr0xyjo.png图片 一、核心资源信息 技术架构(资源核心配置):基于HTML5 + CSS3 + JavaScript原生技术构建,不依赖复杂框架,上手门槛低;支持灵活扩展jQuery或Bootstrap插件,还能模块化开发,后续二次开发和维护都很方便,拿来就能按需调整。 适配与兼容(资源使用便捷性):采用响应式布局,能完美适配PC、平板、手机等多终端设备,满足移动端流量需求;同时兼容Chrome、Firefox、Safari、Edge等主流浏览器,确保不同用户访问体验一致,无需担心兼容性问题。 二、核心资源特色(免费解锁优质体验) 视觉风格专业大气:以纯白色为主色调,搭配深紫等色系,整体设计简洁利落,既显科技感又能传递信任感;动画过渡自然流畅,视觉吸引力强,配色方案统一,契合企业品牌调性,用作对外展示门面超合适。 SEO优化友好:页面结构采用语义化设计,利于搜索引擎收录;页面标题、关键词、描述标签可自定义设置,方便针对性优化;还做了静态资源优化(比如压缩CSS、JS、图片懒加载等),进一步提升SEO效果。 技术简洁高效:原生技术栈不冗余,开发和部署都很便捷;支持模块化扩展,想要添加更多交互功能也能轻松实现,不用额外投入过多技术成本。 mjr0wy4o.png图片 三、资源适用场景(免费资源适配多需求) 这款免费分享的网站源码,适用场景十分广泛: SEO优化服务公司搭建官方网站,展示企业形象和服务; 数字营销机构、网络推广公司制作展示站点,呈现业务范围和案例; 内容营销团队打造作品集,对外展示成果; 各类需要宣传数字营销、Web设计开发等业务的企业,用作宣传站点。 获取源码 HTML 白色大气 SEO 优化公司网站源码 下载地址:https://pan.quark.cn/s/1fe495a2d51a 提取码:67CQ 结语 不管是直接部署使用,还是基于源码二次开发定制专属功能,都能满足需求,免费无套路,是企业建站的高性价比选择! -
NetworkPanel开源资源免费分享 - Vue3网速测速+IP查询Docker部署工具 NetworkPanel开源资源免费分享:Vue3网速测速+IP查询实用工具 给大家免费分享一款超实用的开源网络工具资源——NetworkPanel!它是基于Vue3技术栈开发的网速测速与IP地址查询工具,无需付费,个人、企业或开发者都能免费获取使用,不管是日常测网速、查IP,还是搭建专属网络工具平台,都是性价比超高的优质资源! mjr0paze.png图片 一、核心资源信息 技术架构(资源核心配置):前端采用Vue3 + TypeScript组合,搭配Vite + pnpm构建工具,不仅代码结构清晰、类型安全,开发和构建效率也大幅提升;还支持腾讯EdgeOne CDN优化加载速度,自带PWA离线访问能力,就算没网络也能应急使用,技术配置拉满且拿来即用。 部署支持(资源使用便捷性):提供多种零门槛部署方案,新手也能轻松上手——静态部署解压就能直接上线;Docker部署只需执行简单命令docker run -d --rm -p 8080:80 netart/network-panel:latest,一键就能启动;还支持腾讯云等云平台一键部署,不用复杂配置,快速就能用起来。 项目结构(资源二次开发友好):采用模块化设计,核心目录划分清晰,包含核心源码、静态资源、CI/CD配置、Docker构建配置等,还附带详细的说明文档,免费分享的源码支持自由二次开发和功能扩展,轻松满足个性化需求。 二、核心功能资源(免费解锁实用工具) 网速测速功能:支持设定测速数据量完成定量测试,多线程并发测速让测试效率更高,还能兼容iOS后台运行,移动端使用也顺畅不中断,免费获取就能拥有专业级测速体验。 IP地址查询功能:可查询多出口IP信息,适配多运营商网络环境,能清晰显示IP对应的地理位置、ISP、经纬度等详细内容,不管是排查网络问题还是了解IP归属,都特别实用。 自定义节点管理:支持添加自定义测速节点,还能动态切换和管理节点,灵活扩展测速网络覆盖范围,适配不同地区、不同网络场景的使用需求。 灵活配置功能:运行过程中能随时调整线程数量,不用重启就能生效;后台运行开关状态会自动保存,下次使用无需重新设置,使用体验更便捷。 三、资源特色(免费资源优势突出) 技术栈优质:基于Vue3 + TypeScript开发,代码质量有保障,后续维护和扩展也方便,免费资源也能拥有高品质体验; 可定制性强:支持自定义测速节点、灵活配置线程数和后台运行状态,不管是个人简单使用,还是企业定制化部署,都能满足; 部署零门槛:多种部署方式任选,无需复杂技术知识,静态部署、Docker部署或云平台部署都能快速完成,上手无压力; 体验出色:界面设计简洁直观,操作逻辑清晰,还删除了冗余统计脚本,加载速度更快;PWA特性让移动端访问更流畅,不管是电脑还是手机用都舒服。 源码下载 点击打开演示站 下载 下载地址:https://pan.quark.cn/s/ced31eb95857 提取码:kgHx 四、资源适用场景(免费资源适配多需求) 这款免费分享的NetworkPanel开源资源,用途特别广:个人用户可用来测试网络速度、查询IP详细信息,解决日常网络使用疑问;企业可借助它搭建多出口网络监控平台,实时掌握网络状态;开发者可基于源码二次开发,扩展更多个性化功能。无套路免费获取,实用性拉满,强烈推荐大家试试! -
阶段一实战项目:仿照记事本开发简易文本编辑器(PyQt5完整代码) 阶段一实战项目:仿照记事本界面开发简易文本编辑器 哈喽~ 欢迎来到PyQt5系列的第5篇——阶段一实战项目!经过前4篇的学习,我们已经掌握了QWidget基础窗口、线性布局(QVBoxLayout/QHBoxLayout)、核心基础控件(标签、按钮、输入框、复选框等)以及信号与槽的基础用法。今天我们将把这些知识点整合起来,仿照Windows记事本的核心界面与基础功能,开发一个简易文本编辑器,实现“新建、打开、保存文本”“文本编辑”“字体加粗”等核心功能,让你快速掌握知识点的综合应用! mjr0cjri.png图片 一、项目需求分析:仿照记事本核心功能 我们聚焦Windows记事本的核心功能,本次项目实现以下需求: 界面需求:仿照记事本布局,包含“功能按钮区”(新建、打开、保存、字体加粗)和“文本编辑区”(多行文本输入/显示); 核心功能:新建空白文本、打开本地文本文件、保存文本到本地、文本加粗编辑; 交互需求:按钮点击反馈、打开/保存文件弹窗提示、文本编辑实时响应; 适配需求:窗口缩放时,文本编辑区自适应调整大小。 【界面参考】Windows记事本核心布局:顶部功能按钮区 + 中间大面积文本编辑区,我们简化实现核心按钮,保证界面简洁且功能完整。 mjr06wos.png图片 二、技术选型:贴合阶段一知识点 本次项目严格基于阶段一所学知识点,不引入新的复杂组件,技术栈如下: 窗口组件:QWidget(主窗口); 布局管理器:QVBoxLayout(垂直布局,管理按钮区和编辑区)、QHBoxLayout(水平布局,排列功能按钮); 核心控件:QPushButton(功能按钮)、QTextEdit(多行文本编辑区)、QCheckBox(字体加粗选择框); 交互核心:信号与槽(按钮点击、复选框状态变化绑定对应功能); 文件操作:基础文件读写(结合Python内置open函数)。 三、界面设计与实现步骤 我们采用“先搭框架,再填功能”的思路,分3步实现: 搭建主窗口与布局(垂直布局+水平布局组合); 添加控件(功能按钮、复选框、文本编辑区)并绑定布局; 实现控件信号与槽绑定,编写功能逻辑。 四、完整代码实现(可直接运行) mjr0a9z8.png图片 import sys import os from PyQt5.QtWidgets import ( QApplication, QWidget, QPushButton, QTextEdit, QCheckBox, QVBoxLayout, QHBoxLayout, QFileDialog ) from PyQt5.QtGui import QFont from PyQt5.QtCore import Qt class SimpleNotepad(QWidget): def __init__(self): super().__init__() # 初始化窗口基础属性 self.init_window() # 初始化控件与布局结构 self.init_widgets_layout() # 绑定信号与槽函数 self.init_signals_slots() # 记录当前打开的文件路径,初始为None表示新文件 self.current_file_path = None def init_window(self): """初始化窗口的标题、大小和位置""" self.setWindowTitle("简易文本编辑器(仿照记事本)") # 设置窗口初始尺寸 self.resize(800, 600) # 计算并设置窗口居中显示 screen_geometry = QApplication.desktop().availableGeometry() x = (screen_geometry.width() - self.width()) // 2 y = (screen_geometry.height() - self.height()) // 2 self.move(x, y) def init_widgets_layout(self): """创建所有界面控件并设置布局""" # 创建主垂直布局,设置控件间距和窗口内边距 self.main_layout = QVBoxLayout() self.main_layout.setSpacing(10) self.main_layout.setContentsMargins(15, 15, 15, 15) # 创建按钮区水平布局 self.button_layout = QHBoxLayout() self.button_layout.setSpacing(10) # 创建功能按钮并设置固定尺寸 self.new_btn = QPushButton("新建") self.open_btn = QPushButton("打开") self.save_btn = QPushButton("保存") btn_size = (80, 30) self.new_btn.setFixedSize(*btn_size) self.open_btn.setFixedSize(*btn_size) self.save_btn.setFixedSize(*btn_size) # 创建字体加粗复选框,设置文本居中显示 self.bold_check = QCheckBox("字体加粗") self.bold_check.setStyleSheet("text-align: center;") # 将按钮添加到水平布局 self.button_layout.addWidget(self.new_btn) self.button_layout.addWidget(self.open_btn) self.button_layout.addWidget(self.save_btn) # 添加伸缩项,将复选框推至布局右侧 self.button_layout.addStretch() self.button_layout.addWidget(self.bold_check) # 创建文本编辑区域,设置默认字体和占位提示文本 self.text_edit = QTextEdit() self.text_edit.setFont(QFont("微软雅黑", 12)) self.text_edit.setPlaceholderText("请输入文本内容...(支持新建、打开、保存文件)") # 将按钮布局和文本编辑区添加到主布局 self.main_layout.addLayout(self.button_layout) self.main_layout.addWidget(self.text_edit) # 设置窗口的主布局 self.setLayout(self.main_layout) def init_signals_slots(self): """绑定控件的信号与对应的槽函数""" self.new_btn.clicked.connect(self.on_new_click) self.open_btn.clicked.connect(self.on_open_click) self.save_btn.clicked.connect(self.on_save_click) self.bold_check.stateChanged.connect(self.on_bold_check_change) def on_new_click(self): """新建文件:清空编辑区,重置文件路径""" # 若有未保存内容,先提示保存 if self.text_edit.toPlainText() and not self.current_file_path: reply = QFileDialog.getSaveFileName(self, "保存当前内容", "", "Text Files (*.txt)") if reply[0]: self.save_text_to_file(reply[0]) # 清空编辑区内容 self.text_edit.clear() # 重置当前文件路径 self.current_file_path = None # 更新窗口标题 self.setWindowTitle("简易文本编辑器(仿照记事本)- 未保存文件") def on_open_click(self): """打开文件:选择txt文件并读取内容到编辑区""" # 弹出文件选择对话框,筛选文本文件 file_path, _ = QFileDialog.getOpenFileName( self, "打开文本文件", "", "Text Files (*.txt);;All Files (*.*)" ) # 验证文件路径有效性并读取内容 if file_path and os.path.exists(file_path): with open(file_path, "r", encoding="utf-8") as f: content = f.read() self.text_edit.setText(content) self.current_file_path = file_path # 更新窗口标题显示当前文件名 self.setWindowTitle(f"简易文本编辑器(仿照记事本)- {os.path.basename(file_path)}") def on_save_click(self): """保存文件:已有路径则直接保存,无路径则弹出保存对话框""" if self.current_file_path: # 直接保存到当前路径 self.save_text_to_file(self.current_file_path) else: # 弹出保存对话框选择路径 file_path, _ = QFileDialog.getSaveFileName( self, "保存文本文件", "", "Text Files (*.txt)" ) if file_path: # 自动补充txt后缀 if not file_path.endswith(".txt"): file_path += ".txt" self.save_text_to_file(file_path) self.current_file_path = file_path self.setWindowTitle(f"简易文本编辑器(仿照记事本)- {os.path.basename(file_path)}") def save_text_to_file(self, file_path): """将编辑区内容写入指定路径的文件""" content = self.text_edit.toPlainText() with open(file_path, "w", encoding="utf-8") as f: f.write(content) def on_bold_check_change(self, state): """根据复选框状态切换编辑区文本的加粗样式""" current_font = self.text_edit.font() # Qt.Checked对应值为2,Qt.Unchecked对应值为0 current_font.setBold(state == Qt.Checked) self.text_edit.setFont(current_font) if __name__ == "__main__": # 创建应用程序实例 app = QApplication(sys.argv) # 创建记事本窗口实例 notepad = SimpleNotepad() # 显示窗口 notepad.show() # 启动应用程序主循环 sys.exit(app.exec_())五、代码逐行解析(核心部分) 1. 类结构与初始化流程 我们将所有功能封装到SimpleNotepad类(继承QWidget),初始化流程分3步: init_window():设置窗口标题、大小、居中显示,提升用户体验; init_widgets_layout():核心布局搭建,用“垂直布局+水平布局”组合实现记事本风格,按钮区在上、编辑区在下,保证窗口缩放时编辑区自适应; init_signals_slots():绑定所有控件的信号与槽,实现“点击按钮触发功能”“复选框变化触发字体调整”。 2. 布局核心逻辑 采用“嵌套布局”思路,解决控件排列问题: 主布局(QVBoxLayout):垂直方向排列“按钮布局”和“文本编辑区”,addStretch()未使用,让编辑区占满剩余空间; 按钮布局(QHBoxLayout):水平方向排列3个功能按钮,添加addStretch()伸缩空间将“字体加粗”复选框推到右侧,让布局更美观。 3. 核心功能实现 (1)新建文件(on_new_click) 逻辑:先判断当前是否有未保存的内容,如果有则弹出保存对话框;清空编辑区,重置current_file_path(标记为新文件),更新窗口标题。 (2)打开文件(on_open_click) 逻辑:用QFileDialog.getOpenFileName()弹出文件选择框,筛选txt文件;读取选中文件的内容并显示到QTextEdit,更新current_file_path和窗口标题(显示文件名)。 (3)保存文件(on_save_click) 逻辑:如果已打开文件(current_file_path不为None),直接保存;否则弹出保存对话框,让用户选择路径,补充.txt后缀,保存内容后更新路径和标题。 (4)字体加粗(on_bold_check_change) 逻辑:监听复选框状态变化,用QFont.setBold()切换字体加粗状态,直接作用于QTextEdit的当前字体。 六、运行效果与测试步骤 1. 运行方式 将代码保存为simple_notepad.py,确保已安装PyQt5,终端运行命令: python simple_notepad.py # Windows python3 simple_notepad.py # macOS/Linux2. 测试步骤 测试新建:点击“新建”,编辑区清空,标题显示“未保存文件”; 测试打开:点击“打开”,选择本地txt文件,内容正常显示,标题显示文件名; 测试保存:编辑内容后点击“保存”,如果是新文件则弹出保存对话框,保存后可在对应路径找到txt文件; 测试字体加粗:勾选“字体加粗”,编辑区文本变为加粗;取消勾选则恢复正常。 七、常见问题排查 问题1:打开文件后中文乱码 → 解决:读取文件时指定encoding="utf-8",保存时也用utf-8编码; 问题2:窗口缩放时编辑区不自适应 → 解决:确保主布局是QVBoxLayout,且QTextEdit直接添加到主布局(未设置固定大小); 问题3:保存文件后没有.txt后缀 → 解决:代码中已添加判断,自动补充.txt后缀,无需手动输入; 问题4:按钮点击无反应 → 解决:检查信号与槽绑定是否正确(如self.new_btn.clicked.connect(self.on_new_click)是否写错函数名)。 八、功能拓展思路(阶段一知识点范围内) 如果想进一步练习,可以基于当前代码拓展以下功能: 添加“撤销/重做”按钮:利用QTextEdit.undo()和QTextEdit.redo()实现; 添加“清空”按钮:绑定self.text_edit.clear(); 添加“字体大小调整”:用QComboBox下拉选择字体大小,绑定信号修改QFont的setPointSize(); 添加“换行/不换行”复选框:用QTextEdit.setLineWrapMode()控制换行模式。 总结 本次项目完美整合了阶段一的核心知识点:窗口设置、线性布局、基础控件使用、信号与槽绑定。通过仿照记事本界面开发,你应该能深刻理解“布局管理器解决控件排列”“信号与槽实现交互”的核心逻辑。 下一篇我们将进入阶段二,学习网格布局、表单布局等进阶布局管理器,为更复杂的界面开发打基础。如果在项目实操中遇到问题,或者有拓展功能的想法,欢迎在评论区留言讨论~ -
PyQt5常用控件(二):复选框单选框下拉框 PyQt5常用基础控件(二):复选框、单选框与下拉框 哈喽~ 欢迎来到PyQt5从入门到精通的第四篇!上一篇我们掌握了标签、按钮、输入框这三个核心基础控件,这一篇聚焦进阶基础控件——QCheckBox复选框、QRadioButton单选框、QComboBox下拉框,这三类控件是“选择类交互”的核心(比如选择性别、爱好、职业),全程代码完整可直接运行,还会做一个“个人信息选择”综合案例,新手也能轻松掌握! mjqzsti2.png图片 一、核心控件详解:每个控件的用法+完整代码 这三类控件的核心作用是让用户做选择,但适用场景不同:单选框(二选一/多选一)、复选框(多选多)、下拉框(大量选项的精简选择),我们逐个拆解。 1. QCheckBox:复选框(多选多) QCheckBox用于允许多选的场景(比如选择爱好:读书、运动、听歌),支持“选中/未选中”状态,还能监听状态变化。 完整代码:QCheckBox常用用法 mjqzttv2.png图片 import sys from PyQt5.QtWidgets import ( QApplication, QWidget, QCheckBox, QVBoxLayout, QLabel, QPushButton ) from PyQt5.QtCore import Qt class CheckBoxDemo(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setWindowTitle("QCheckBox复选框演示") self.resize(350, 250) layout = QVBoxLayout() layout.setSpacing(15) layout.setContentsMargins(50, 40, 50, 40) # 提示标签 self.tip_label = QLabel("请选择你的爱好(可多选):") layout.addWidget(self.tip_label) # 1. 创建复选框 self.check1 = QCheckBox("读书") self.check2 = QCheckBox("运动") self.check3 = QCheckBox("听歌") self.check4 = QCheckBox("编程") # 可选:设置默认选中状态 self.check4.setChecked(True) # 绑定状态变化信号(选中/取消选中时触发) self.check1.stateChanged.connect(self.on_check_change) self.check2.stateChanged.connect(self.on_check_change) self.check3.stateChanged.connect(self.on_check_change) self.check4.stateChanged.connect(self.on_check_change) # 添加到布局 layout.addWidget(self.check1) layout.addWidget(self.check2) layout.addWidget(self.check3) layout.addWidget(self.check4) # 按钮:获取选中的爱好 get_btn = QPushButton("获取选中的爱好") get_btn.clicked.connect(self.get_checked_hobbies) layout.addWidget(get_btn) # 结果显示标签 self.result_label = QLabel("已选中:编程") layout.addWidget(self.result_label) self.setLayout(layout) # 复选框状态变化槽函数 def on_check_change(self, state): # state:2=选中,0=未选中 sender = self.sender() # 获取触发信号的复选框 if state == Qt.Checked: print(f"选中了:{sender.text()}") else: print(f"取消选中:{sender.text()}") # 获取所有选中的爱好 def get_checked_hobbies(self): hobbies = [] if self.check1.isChecked(): hobbies.append(self.check1.text()) if self.check2.isChecked(): hobbies.append(self.check2.text()) if self.check3.isChecked(): hobbies.append(self.check3.text()) if self.check4.isChecked(): hobbies.append(self.check4.text()) if hobbies: self.result_label.setText(f"已选中:{', '.join(hobbies)}") else: self.result_label.setText("未选中任何爱好") if __name__ == "__main__": app = QApplication(sys.argv) window = CheckBoxDemo() window.show() sys.exit(app.exec_())QCheckBox关键方法解析 方法作用setChecked(True)设置默认选中状态(False为未选中)isChecked()判断是否选中(返回True/False)stateChanged.connect(槽函数)监听状态变化(选中/取消选中)text()获取复选框的文本内容sender()在槽函数中获取触发信号的控件(区分多个复选框)2. QRadioButton:单选框(多选一) QRadioButton用于只能选一个的场景(比如性别:男/女),核心是必须分组(QButtonGroup),否则多个单选框不会互斥(能同时选中)。 完整代码:QRadioButton常用用法 mjqzusvk.png图片 import sys from PyQt5.QtWidgets import ( QApplication, QWidget, QRadioButton, QVBoxLayout, QLabel, QPushButton, QButtonGroup ) class RadioButtonDemo(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setWindowTitle("QRadioButton单选框演示") self.resize(350, 200) layout = QVBoxLayout() layout.setSpacing(15) layout.setContentsMargins(50, 40, 50, 40) # 提示标签 self.tip_label = QLabel("请选择你的性别(只能选一个):") layout.addWidget(self.tip_label) # 1. 创建单选框分组(核心!否则单选框不互斥) self.radio_group = QButtonGroup(self) # 2. 创建单选框 self.radio1 = QRadioButton("男") self.radio2 = QRadioButton("女") self.radio3 = QRadioButton("保密") # 3. 将单选框加入分组 self.radio_group.addButton(self.radio1, 1) # 第二个参数是自定义ID,可选 self.radio_group.addButton(self.radio2, 2) self.radio_group.addButton(self.radio3, 3) # 可选:设置默认选中 self.radio3.setChecked(True) # 绑定选中变化信号 self.radio_group.buttonClicked.connect(self.on_radio_click) # 添加到布局 layout.addWidget(self.radio1) layout.addWidget(self.radio2) layout.addWidget(self.radio3) # 按钮:获取选中的性别 get_btn = QPushButton("获取选中的性别") get_btn.clicked.connect(self.get_checked_gender) layout.addWidget(get_btn) # 结果显示标签 self.result_label = QLabel("已选中:保密") layout.addWidget(self.result_label) self.setLayout(layout) # 单选框点击槽函数 def on_radio_click(self, radio_btn): # radio_btn是被点击的单选框对象 print(f"选中了性别:{radio_btn.text()}") # 获取选中的性别 def get_checked_gender(self): # 方式1:通过分组获取选中的按钮 checked_btn = self.radio_group.checkedButton() if checked_btn: self.result_label.setText(f"已选中:{checked_btn.text()}") else: self.result_label.setText("未选中任何性别") # 方式2:逐个判断(不推荐,分组更高效) # if self.radio1.isChecked(): # self.result_label.setText("已选中:男") # elif self.radio2.isChecked(): # self.result_label.setText("已选中:女") # elif self.radio3.isChecked(): # self.result_label.setText("已选中:保密") if __name__ == "__main__": app = QApplication(sys.argv) window = RadioButtonDemo() window.show() sys.exit(app.exec_())QRadioButton关键要点 必须分组:用QButtonGroup管理单选框,否则多个单选框可同时选中; 核心方法: 方法作用QButtonGroup.addButton(单选框, ID)将单选框加入分组radio_group.checkedButton()获取分组中选中的单选框setChecked(True)设置默认选中isChecked()判断是否选中 3. QComboBox:下拉选择框(精简多选一) QComboBox用于选项较多、需要精简界面的场景(比如选择职业、城市),支持下拉展开选择,也能设置可编辑(允许用户输入)。 完整代码:QComboBox常用用法 mjqzvsjb.png图片 import sys from PyQt5.QtWidgets import ( QApplication, QWidget, QComboBox, QVBoxLayout, QLabel, QPushButton ) class ComboBoxDemo(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setWindowTitle("QComboBox下拉框演示") self.resize(350, 200) layout = QVBoxLayout() layout.setSpacing(15) layout.setContentsMargins(50, 40, 50, 40) # 提示标签 self.tip_label = QLabel("请选择你的职业:") layout.addWidget(self.tip_label) # 1. 创建下拉框 self.combo = QComboBox() # 2. 添加选项(三种方式) # 方式1:逐个添加 self.combo.addItem("学生") self.combo.addItem("程序员") self.combo.addItem("教师") # 方式2:批量添加 self.combo.addItems(["设计师", "医生", "自由职业者"]) # 方式3:添加带自定义数据的选项(文本+值) self.combo.addItem("其他", "other") # 可选设置 self.combo.setCurrentIndex(1) # 设置默认选中第2个选项(索引从0开始) # self.combo.setEditable(True) # 允许用户输入自定义内容 # 绑定选中变化信号 self.combo.currentIndexChanged.connect(self.on_combo_change) # 索引变化 # self.combo.currentTextChanged.connect(self.on_text_change) # 文本变化 layout.addWidget(self.combo) # 按钮:获取选中的职业 get_btn = QPushButton("获取选中的职业") get_btn.clicked.connect(self.get_checked_job) layout.addWidget(get_btn) # 结果显示标签 self.result_label = QLabel("已选中:程序员") layout.addWidget(self.result_label) self.setLayout(layout) # 下拉框索引变化槽函数 def on_combo_change(self, index): # index是选中项的索引 text = self.combo.itemText(index) # 通过索引获取文本 data = self.combo.itemData(index) # 获取自定义数据(没有则返回None) print(f"选中索引:{index},职业:{text},自定义数据:{data}") # # 文本变化槽函数(当setEditable=True时常用) # def on_text_change(self, text): # print(f"选中/输入的职业:{text}") # 获取选中的职业 def get_checked_job(self): # 方式1:获取选中的文本 text = self.combo.currentText() # 方式2:获取选中的索引 index = self.combo.currentIndex() # 方式3:获取自定义数据 data = self.combo.currentData() self.result_label.setText(f"职业:{text}(索引:{index},自定义数据:{data})") if __name__ == "__main__": app = QApplication(sys.argv) window = ComboBoxDemo() window.show() sys.exit(app.exec_())QComboBox关键方法 方法作用addItem("文本", 自定义数据)添加单个选项addItems(["选项1", "选项2"])批量添加选项setCurrentIndex(索引)设置默认选中项(索引从0开始)currentText()获取选中的文本currentIndex()获取选中的索引setEditable(True)允许用户输入自定义内容二、综合案例:个人信息选择窗口(完整代码) 结合复选框、单选框、下拉框,做一个实用的“个人信息填写窗口”——包含性别单选、爱好复选、职业下拉,点击“提交”按钮后显示所有选中的信息,界面美化且逻辑完整。 mjqzxjc5.png图片 import sys from PyQt5.QtWidgets import ( QApplication, QWidget, QLabel, QRadioButton, QCheckBox, QComboBox, QPushButton, QVBoxLayout, QHBoxLayout, QGroupBox, QButtonGroup ) from PyQt5.QtGui import QFont from PyQt5.QtCore import Qt class InfoWindow(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): # 窗口基础设置 self.setWindowTitle("个人信息选择窗口") self.resize(450, 400) self.setStyleSheet(""" QWidget { font-size: 14px; color: #2c3e50; } QGroupBox { font-weight: bold; border: 1px solid #bdc3c7; border-radius: 6px; margin-top: 10px; padding-top: 10px; } QPushButton { background-color: #27ae60; color: white; padding: 8px 16px; border: none; border-radius: 4px; } QPushButton:hover { background-color: #219653; } """) # 主布局(垂直) main_layout = QVBoxLayout() main_layout.setSpacing(20) main_layout.setContentsMargins(40, 30, 40, 30) # 1. 性别分组(QGroupBox美化分组) gender_group = QGroupBox("性别") gender_layout = QHBoxLayout() # 单选框分组 self.gender_btn_group = QButtonGroup() self.radio_male = QRadioButton("男") self.radio_female = QRadioButton("女") self.radio_secret = QRadioButton("保密") self.gender_btn_group.addButton(self.radio_male) self.gender_btn_group.addButton(self.radio_female) self.gender_btn_group.addButton(self.radio_secret) # 默认选中保密 self.radio_secret.setChecked(True) # 添加到性别布局 gender_layout.addWidget(self.radio_male) gender_layout.addWidget(self.radio_female) gender_layout.addWidget(self.radio_secret) gender_group.setLayout(gender_layout) main_layout.addWidget(gender_group) # 2. 爱好分组 hobby_group = QGroupBox("爱好(可多选)") hobby_layout = QHBoxLayout() # 复选框 self.check_read = QCheckBox("读书") self.check_sport = QCheckBox("运动") self.check_music = QCheckBox("听歌") self.check_code = QCheckBox("编程") # 添加到爱好布局 hobby_layout.addWidget(self.check_read) hobby_layout.addWidget(self.check_sport) hobby_layout.addWidget(self.check_music) hobby_layout.addWidget(self.check_code) hobby_group.setLayout(hobby_layout) main_layout.addWidget(hobby_group) # 3. 职业分组 job_group = QGroupBox("职业") job_layout = QHBoxLayout() # 下拉框 self.combo_job = QComboBox() self.combo_job.addItems(["学生", "程序员", "教师", "设计师", "医生", "其他"]) job_layout.addWidget(QLabel("选择:")) job_layout.addWidget(self.combo_job) job_group.setLayout(job_layout) main_layout.addWidget(job_group) # 4. 提交按钮 submit_btn = QPushButton("提交信息") submit_btn.clicked.connect(self.submit_info) main_layout.addWidget(submit_btn, alignment=Qt.AlignCenter) # 5. 结果显示标签 self.result_label = QLabel("") self.result_label.setStyleSheet("color: #e67e22; margin-top: 10px;") self.result_label.setAlignment(Qt.AlignCenter) main_layout.addWidget(self.result_label) # 绑定主布局 self.setLayout(main_layout) # 提交信息槽函数 def submit_info(self): # 1. 获取性别 gender = self.gender_btn_group.checkedButton().text() # 2. 获取爱好 hobbies = [] if self.check_read.isChecked(): hobbies.append(self.check_read.text()) if self.check_sport.isChecked(): hobbies.append(self.check_sport.text()) if self.check_music.isChecked(): hobbies.append(self.check_music.text()) if self.check_code.isChecked(): hobbies.append(self.check_code.text()) hobby_text = ", ".join(hobbies) if hobbies else "无" # 3. 获取职业 job = self.combo_job.currentText() # 4. 显示结果 result = f""" 提交的信息: 性别:{gender} 爱好:{hobby_text} 职业:{job} """ self.result_label.setText(result) if __name__ == "__main__": app = QApplication(sys.argv) window = InfoWindow() window.show() sys.exit(app.exec_())综合案例亮点 用QGroupBox对控件分组,界面更规整、易读; 结合了三类选择控件,覆盖“单选、多选、下拉选”所有常用选择场景; 加入样式美化(按钮悬停、分组边框、字体颜色); 逻辑完整:提交后整合所有选中信息并显示,新手可直接复用。 三、常见问题排查 单选框不互斥: 未使用QButtonGroup分组,只需将所有单选框加入同一个分组即可; 分组时误将单选框加入不同分组(比如创建了多个QButtonGroup)。 复选框无法获取选中状态: 槽函数中未正确调用isChecked(),或控件实例名写错(比如check1写成check_1); 复选框被禁用(setDisabled(True)),导致无法选中。 下拉框选项不显示: 忘记调用addItem()/addItems()添加选项; 下拉框尺寸太小(可通过setMinimumWidth(100)设置最小宽度)。 提交后结果不显示: 槽函数未绑定到按钮的clicked信号; 结果标签被布局遮挡(可调整setContentsMargins或spacing)。 总结 三类选择控件的核心场景:QRadioButton(单选)、QCheckBox(多选)、QComboBox(精简单选); 单选框必须用QButtonGroup分组,否则无法实现互斥; 复选框通过isChecked()判断状态,下拉框通过currentText()获取选中内容; 实际开发中用QGroupBox分组控件,可提升界面可读性; 下一篇我们会讲解阶段一实战项目:仿照记事本界面开发简易文本编辑器,记得关注字节曜博客哦~ 如果在实操中遇到问题,欢迎在评论区留言讨论!