MVC(Model-View-Controller)framework using Python ,Tkinter and SQLite
1.项目结构
sql:
CREATE TABLE IF NOT EXISTS School (SchoolId TEXT not null, SchoolName TEXT NOT NULL,SchoolTelNo TEXT NOT NULL)
整体思路
- Model:负责与 SQLite 数据库进行交互,包括创建表、插入、删除、更新和查询数据等操作。
- View:使用 Tkinter 和
ttk.Treeview
创建用户界面,包含输入框、按钮和分页控件,用于显示数据并处理用户的交互。 - Controller:处理用户界面的事件,调用 Model 中的方法进行数据操作,并更新 View 中的显示。
代码实现:
Model 部分
# encoding: utf-8
# 版权所有 2024 ©涂聚文有限公司
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author : geovindu,Geovin Du 涂聚文.
# IDE : PyCharm 2023.1 python 3.11
# OS : windows 10
# database : mysql 9.0 sql server 2019, poostgreSQL 17.0 oracle 11g sqlite
# Datetime : 2024-11-20 22:35:21
# database :sql server 2019
# User : geovindu
# Product : PyCharm
# Project : pySQLiteMvcDemo
# File : bll/School.py
# explain : 学习
from __future__ import annotations
from abc import ABC, abstractmethod
import os
import sys
from Model.school import SchoolInfo
from Factory.AbstractFactory import AbstractFactoryclass SchoolBll(object):"""学校表 """ dal = AbstractFactory.createSchool"""类属性 接口DAL"""def __init__(self):""""""self.__name = "SchoolBll"self.createtable() # 如果不存在,初始化表def __del__(self):""":return:"""print(f"{self.__name} ERASE MEMORY")def Close(cls):"""关闭:return:"""cls.dal().Close()def createtable(self):"""建表"""self.dal().createtable()def selectData(self) -> list:""":return:"""data = self.dal().selectSql()return datadef select(self) -> list[SchoolInfo]:""":return:"""schools = []data = self.dal().selectSql()if len(data) > 0:for SchoolId,SchoolName,SchoolTelNo in data[0]:info = SchoolInfo()info.SchoolId = SchoolIdinfo.SchoolName = SchoolNameinfo.SchoolTelNo = SchoolTelNoschools.append(info)return schoolsdef selectSql(cls) -> list[SchoolInfo]:"""元组数据:return: list 列表"""schools = []data = cls.dal().selectSql()if len(data) > 0:for SchoolId,SchoolName,SchoolTelNo in data[0]:info=SchoolInfo()info.SchoolId = SchoolIdinfo.SchoolName = SchoolNameinfo.SchoolTelNo = SchoolTelNoschools.append(info)return schoolsdef selectSqlCount(cls) -> int:"""查询数据 总数:return:"""#print(cls.dal().selectSqlCount()[0][0])total = cls.dal().selectSqlCount()[0][0]return totaldef Count(self) -> int:"""查询数据 总数:return:"""total = self.dal().selectSqlCount()[0][0]return totaldef getcount(cls, search_query=""):"""计算:param search_query::return:"""return cls.dal().getcount(search_query)def getschools(cls, page, limit, search_query=""):"""查询:param page::param limit::param search_query::return:"""data=cls.dal().getschools(page, limit, search_query)print("data:",data)return datadef selectSqlOrder(cls, order: str) -> list[SchoolInfo]:"""元组数据:param order: SchoolName desc/asc:return:"""schools = []data = cls.dal().selectSqlOrder(order)if len(data) > 0:for SchoolId,SchoolName,SchoolTelNo in data[0]:info=SchoolInfo()info.SchoolId = SchoolIdinfo.SchoolName = SchoolNameinfo.SchoolTelNo = SchoolTelNoschools.append(info)return schoolsdef selectSort(cls,field:str,isOrder:bool)->list[SchoolInfo]:""":param field SchoolId:param order: desc/asc:return:"""schools = []data = cls.dal().selectSort(field,isOrder)if len(data) > 0:for SchoolId,SchoolName,SchoolTelNo in data[0]:info = SchoolInfo()info.SchoolId = SchoolIdinfo.SchoolName = SchoolNameinfo.SchoolTelNo = SchoolTelNoschools.append(info)return schoolsdef selectIdSql(cls,SchoolId:str) -> list[SchoolInfo]:""":param SchoolId:ID:return:"""schools = []data = cls.dal().selectIdSql(SchoolId)#print(data)if len(data)>0:for SchoolId,SchoolName,SchoolTelNo in data[0]:info = SchoolInfo()info.SchoolId = SchoolIdinfo.SchoolName = SchoolNameinfo.SchoolTelNo = SchoolTelNoschools.append(info)return schoolsdef addSql(cls,info:SchoolInfo) -> int:""":param info:实体类:return:"""return cls.dal().addSql(info)def add(self,info:SchoolInfo) -> int:""":param info:实体类:return:"""return self.dal().addSql(info)def editSql(cls,info:SchoolInfo) -> int:""":param info:实体类:return:"""#print(info)return cls.dal().editSql(info)def edit(self,info:SchoolInfo) -> int:""":param info:实体类:return:"""#print(info)return self.dal().editSql(info)def delSql(cls, SchoolId: str) -> int:""":param SchoolId::return:"""return cls.dal().delSql(SchoolId)def delinfo(self, SchoolId: str) -> int:""":param SchoolId::return:"""return self.dal().delSql(SchoolId)
View 部分
# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author : geovindu,Geovin Du 涂聚文.
# IDE : PyCharm 2023.1 python 3.11
# OS : windows 10
# database : mysql 9.0 sql server 2019, poostgreSQL 17.0 oracle 21c Neo4j sqlite
# Datetime : 2025/2/11 20:37
# User : geovindu
# Product : PyCharm
# Project : pySQLiteMvcDemo
# File : ViewUI/SchoolView.py
# explain : 学习import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
from Model.school import SchoolInfoclass SchoolView(tk.Frame):"""View 类:负责创建和管理用户界面"""def __init__(self, master=None):""":param master:"""super().__init__(master)self.master = masterself.pack()self.create_widgets()def create_widgets(self):""":return:"""self.search_frame = tk.Frame(self)self.search_frame.pack(pady=10)# 搜索输入框self.search_label = tk.Label(self.search_frame, text="搜索:")#self.search_label.pack()self.search_label.grid(row=0, column=0)self.search_entry = tk.Entry(self.search_frame)#self.search_entry.pack()self.search_entry.grid(row=0, column=1)# 搜索按钮self.search_button = tk.Button(self.search_frame, text="搜索")#self.search_button.pack()self.search_button.grid(row=0, column=2)self.tree_frame = tk.Frame(self)self.tree_frame.pack(pady=10)# Treeview 控件self.tree = ttk.Treeview(self.tree_frame, columns=('ID', '校名', '电话'), show='headings')self.tree.heading('ID', text='ID')self.tree.heading('校名', text='校名')self.tree.heading('电话', text='电话')self.tree.pack()# Pagination Frameself.pagination_frame = tk.Frame(self)self.pagination_frame.pack(pady=10)# 分页控件self.prev_button = tk.Button(self.pagination_frame, text="上一页")self.prev_button.pack(side=tk.LEFT)self.page_label = tk.Label(self.pagination_frame, text="第 1 页")self.page_label.pack(side=tk.LEFT)self.pagetotal_label = tk.Label(self.pagination_frame, text="/共 1 条")self.pagetotal_label.pack(side=tk.LEFT)self.next_button = tk.Button(self.pagination_frame, text="下一页")self.next_button.pack(side=tk.LEFT)# Add/Update/Delete Frameself.action_frame = tk.Frame(self)self.action_frame.pack(pady=10)self.id_label = tk.Label(self.action_frame, text="編號:")#self.id_label.pack()self.id_label.grid(row=0, column=0)self.id_entry = tk.Entry(self.action_frame)self.id_entry.grid(row=0, column=1)# 校名输入框self.name_label = tk.Label(self.action_frame, text="校名:")self.name_label.grid(row=1, column=0)self.name_entry = tk.Entry(self.action_frame)self.name_entry.grid(row=1, column=1)# 电话输入框self.phone_label = tk.Label(self.action_frame, text="电话:")self.phone_label.grid(row=2, column=0)self.phone_entry = tk.Entry(self.action_frame)self.phone_entry.grid(row=2, column=1)# 添加按钮self.add_button = tk.Button(self.action_frame, text="添加")self.add_button.grid(row=3, column=0)# 修改按钮self.update_button = tk.Button(self.action_frame, text="修改")self.update_button.grid(row=3, column=1)# 删除按钮self.delete_button = tk.Button(self.action_frame, text="删除")self.delete_button.grid(row=3, column=2)def clear_entries(self):""":return:"""self.id_entry.delete(0, tk.END)self.name_entry.delete(0, tk.END)self.phone_entry.delete(0, tk.END)self.search_entry.delete(0, tk.END)def populate_treeview(self, contacts):""":param contacts::return:"""for i in self.tree.get_children():self.tree.delete(i)for contact in contacts:self.tree.insert('', 'end', values=contact)def update_page_label(self, page, total_pages):""":param page::param total_pages::return:"""self.page_label.config(text=f"第 {page} 页/共 {total_pages} 页")def update_page_total(self,tatal):""":param tatal::return:"""self.pagetotal_label.config(text=f"共{tatal} 条")class AddSchoolWindow(tk.Toplevel):"""弹出窗口 - 添加学校"""def __init__(self, master, controller):""":param master::param controller:"""super().__init__(master)self.controller = controllerself.title("添加学校")self.create_widgets()def create_widgets(self):""":return:"""self.action_frame = tk.Frame(self)self.action_frame.pack(pady=10)# 学校 ID 输入框self.id_label = tk.Label(self.action_frame, text="学校 ID:")self.id_label.grid(row=0, column=0)self.id_entry = tk.Entry(self.action_frame)self.id_entry.grid(row=0, column=1)# 学校名称输入框self.name_label = tk.Label(self.action_frame, text="学校名称:")self.name_label.grid(row=1, column=0)self.name_entry = tk.Entry(self.action_frame)self.name_entry.grid(row=1, column=1)# 学校电话输入框self.tel_label = tk.Label(self.action_frame, text="学校电话:")self.tel_label.grid(row=2, column=0)self.tel_entry = tk.Entry(self.action_frame)self.tel_entry.grid(row=2, column=1)# 保存按钮self.save_button = tk.Button(self.action_frame, text="保存", command=self.save_school)self.save_button.grid(row=3, column=0)def save_school(self):""":return:"""school_id = self.id_entry.get()school_name = self.name_entry.get()school_tel = self.tel_entry.get()info = SchoolInfo()info.SchoolId = school_idinfo.SchoolName = school_nameinfo.SchoolTelNo = school_telif school_id and school_name and school_tel:self.controller.add_school(info)self.destroy()else:messagebox.showerror("错误", "所有字段均为必填项")class EditSchoolWindow(tk.Toplevel):"""弹出窗口 - 修改学校"""def __init__(self, master, controller, school_id, school_name, school_tel):""":param master::param controller::param school_id::param school_name::param school_tel:"""super().__init__(master)self.controller = controllerself.school_id = school_idself.title("修改学校")self.create_widgets(school_name, school_tel)def create_widgets(self, school_name, school_tel):""":param school_name::param school_tel::return:"""self.action_frame = tk.Frame(self)self.action_frame.pack(pady=10)# 学校 ID 标签(不可编辑)self.id_label = tk.Label(self.action_frame, text="学校 ID:")self.id_label.grid(row=0, column=0)self.id_entry = tk.Entry(self.action_frame)self.id_entry.insert(0, self.school_id)self.id_entry.config(state='readonly')self.id_entry.grid(row=0, column=1)# 学校名称输入框self.name_label = tk.Label(self.action_frame, text="学校名称:")self.name_label.grid(row=1, column=0)self.name_entry = tk.Entry(self.action_frame)self.name_entry.insert(0, school_name)self.name_entry.grid(row=1, column=1)# 学校电话输入框self.tel_label = tk.Label(self.action_frame, text="学校电话:")self.tel_label.grid(row=2, column=0)self.tel_entry = tk.Entry(self.action_frame)self.tel_entry.insert(0, school_tel)self.tel_entry.grid(row=2, column=1)# 保存按钮self.save_button = tk.Button(self.action_frame, text="保存", command=self.save_school)self.save_button.grid(row=3, column=0)def save_school(self):""":return:"""school_name = self.name_entry.get()school_tel = self.tel_entry.get()if school_name and school_tel:print("edit",self.school_id)info=SchoolInfo()info.SchoolId=self.school_idinfo.SchoolName=school_nameinfo.SchoolTelNo=school_tel#self.controller.update_school(self.school_id, school_name, school_tel)self.controller.update_school(info)self.destroy()else:messagebox.showerror("错误", "所有字段均为必填项")
Controller 部分
# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author : geovindu,Geovin Du 涂聚文.
# IDE : PyCharm 2023.1 python 3.11
# OS : windows 10
# database : mysql 9.0 sql server 2019, poostgreSQL 17.0 oracle 21c Neo4j sqlite
# Datetime : 2025/2/11 20:36
# User : geovindu
# Product : PyCharm
# Project : Controller/pySQLiteMvcDemo
# File : SchoolController.py
# explain : 学习
import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
from Model.school import SchoolInfo
from BLLModel.school import SchoolBll
from ViewUI.SchoolView import AddSchoolWindow
from ViewUI.SchoolView import EditSchoolWindowclass SchoolController(object):"""Controller 类:负责处理用户输入和更新模型和视图"""def __init__(self, model, view):""":param model::param view:"""self.model = SchoolInfo()self.view = viewself.current_page = 1self.limit = 10self.search_query = ""# 绑定按钮点击事件到相应的处理方法self.view.add_button.config(command=self.addschools)#self.view.add_button.config(command=self.open_add_window)self.view.update_button.config(command=self.updateschools)self.view.delete_button.config(command=self.deleteschools)self.view.search_button.config(command=self.searchschools)self.view.prev_button.config(command=self.prev_page)self.view.next_button.config(command=self.next_page)self.view.tree.bind("<Double-1>", self.open_edit_window)self.showschools()self.bll = SchoolBll()def open_add_window(self):""":return:"""AddSchoolWindow(self.view.master, self)def open_edit_window(self, event):""":param event::return:"""selected_item = self.view.tree.selection()if selected_item:values = self.view.tree.item(selected_item)['values']school_id = values[0]school_name = values[1]school_tel = values[2]EditSchoolWindow(self.view.master, self, school_id, school_name, school_tel)def add_school(self, info:SchoolInfo):""":param info::return:"""self.bll.addSql(info)self.show_schools()def delete_school(self):""":return:"""selected_item = self.view.tree.selection()if selected_item:school_id = self.view.tree.item(selected_item)['values'][0]self.bll.delSql(school_id)self.show_schools()else:messagebox.showerror("错误", "请选择要删除的学校")def update_school(self, info):""":param info::return:"""self.bll.editSql(info)self.show_schools()def search_schools(self):""":return:"""self.search_query = self.view.search_entry.get()self.current_page = 1self.show_schools()def show_schools(self):""":return:"""total_count = self.bll.getcount(self.search_query)[0][0]print(total_count)if total_count >= 1:total_pages = (total_count + self.limit - 1) // self.limitcontacts = self.bll.getschools(self.current_page, self.limit, self.search_query)self.view.populate_treeview(contacts)self.view.update_page_label(self.current_page, total_pages)self.view.update_page_total(total_count)def addschools(self):""":return:"""id = self.view.id_entry.get()name = self.view.name_entry.get()phone = self.view.phone_entry.get()self.model.SchoolId=idself.model.SchoolName=nameself.model.SchoolTelNo=phone;if name and phone:self.bll.add(self.model)self.view.clear_entries()self.showschools()else:messagebox.showerror("错误", "校名和电话不能为空")def deleteschools(self):""":return:"""selected_item = self.view.tree.selection()if selected_item:id = str(self.view.tree.item(selected_item)['values'][0])print("id",id)self.bll.delSql(id)self.showschools()else:messagebox.showerror("错误", "请选择要删除的学校")def updateschools(self, event):""":return:"""selected_item = self.view.tree.selection()if selected_item:id = str(self.view.tree.item(selected_item)['values'][0])#values = self.view.tree.item(selected_item)['values']name = self.view.name_entry.get()phone = self.view.phone_entry.get()self.model.SchoolId = idself.model.SchoolName = nameself.model.SchoolTelNo = phoneif name and phone:self.bll.editSql(self.model)self.view.clear_entries()self.showschools()else:messagebox.showerror("错误", "校名和电话不能为空")else:messagebox.showerror("错误", "请选择要修改的学校")def searchschools(self):""":return:"""self.search_query = self.view.search_entry.get()self.current_page = 1self.showschools()def prev_page(self):""":return:"""if self.current_page > 1:self.current_page -= 1self.showschools()def next_page(self):""":return:"""total_count = self.bll.getcount(self.search_query)[0][0]total_pages = (total_count + self.limit - 1) // self.limitif self.current_page < total_pages:self.current_page += 1self.showschools()def showschools(self):""":return:"""bll=SchoolBll()total_count = bll.getcount(self.search_query)[0][0]print(total_count)if total_count >= 1:total_pages = (total_count + self.limit - 1) // self.limitcontacts = bll.getschools(self.current_page, self.limit, self.search_query)self.view.populate_treeview(contacts)self.view.update_page_label(self.current_page, total_pages)self.view.update_page_total(total_count)
调用:
# encoding: utf-8
# 版权所有 2025 ©涂聚文有限公司
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author : geovindu,Geovin Du 涂聚文.塗聚文
# IDE : PyCharm Community Edition 2024.3 python 3.11
# OS : windows 10
# database : mysql 9.0 sql server 2019, postgreSQL 17.0 oracle 11g oracle 20c Neo4j sqlite
# Datetime : 2025/2/11 20:11
# User : geovindu
# Product : PyCharm
# Project : pySQLiteMVCDemo
# File : main.py
# explain : 学习import tkinter as tk
from tkinter import ttk, messagebox
from BLLModel.school import SchoolBll
from ViewUI.SchoolView import SchoolView
from Controller.SchoolController import SchoolControllerif __name__ == '__main__':""""""root = tk.Tk()bllmodel = SchoolBll()view = SchoolView(master=root)controller = SchoolController(bllmodel, view)root.title("School Management")root.iconbitmap('favicon.ico')root.mainloop()
输出:
相关文章:

MVC(Model-View-Controller)framework using Python ,Tkinter and SQLite
1.项目结构 sql: CREATE TABLE IF NOT EXISTS School (SchoolId TEXT not null, SchoolName TEXT NOT NULL,SchoolTelNo TEXT NOT NULL) 整体思路 Model:负责与 SQLite 数据库进行交互,包括创建表、插入、删除、更新和查询数据等操作。View࿱…...

WPF 设置宽度为 父容器 宽度的一半
方法1:使用 绑定和转换器 实现 创建类文件 HalfWidthConverter public class HalfWidthConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is double width){return width / 4…...

java项目之在线心理评测与咨询管理系统(源码+文档)
项目简介 在线心理评测与咨询管理系统实现了以下功能: 在线心理评测与咨询管理系统的主要使用者分为: (1)在个人中心,管理员可以修改自己的用户名和登录密码。 (2)在系统前台可以查看首页&…...

【STM32系列】利用MATLAB配合ARM-DSP库设计FIR数字滤波器(保姆级教程)
ps.源码放在最后面 设计IIR数字滤波器可以看这里:利用MATLAB配合ARM-DSP库设计IIR数字滤波器(保姆级教程) 前言 本篇文章将介绍如何利用MATLAB与STM32的ARM-DSP库相结合,简明易懂地实现FIR低通滤波器的设计与应用。文章重点不在…...

Springboot框架扩展功能的使用
Spring Boot 提供了许多扩展点,允许开发者在应用程序的生命周期中插入自定义逻辑。这些扩展点可以帮助你更好地控制应用程序的行为,例如在启动时初始化数据、在关闭时释放资源、或者自定义配置加载逻辑。以下是 Spring Boot 中常见的扩展点: …...

yum报错 Could not resolve host: mirrorlist.centos.org
检查dns 使用ping www.baidu.com ,如果ping不通,检查/etc/resolv.conf文件中是否有: nameserver 8.8.8.8 nameserver 8.8.4.4 替换yum源 1.备份原始的 YUM 源配置文件: sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.r…...

docker使用dockerfile打包镜像(docker如何打包)
文章目录 1. 编写 Dockerfile2. 构建 Docker 镜像3. 运行 Docker 容器4. 导出与导入镜像(可选) 1. 编写 Dockerfile Dockerfile 是一个文本文件,其中包含了一系列指令,这些指令定义了如何构建你的 Docker 镜像。下面以一个简单的…...

去中心化AGI网络架构:下一代人工智能的范式革命
文章目录 引言:当AGI遇到去中心化一、中心化AI架构的四大困境1.1 算力垄断与资源错配1.2 数据孤岛与隐私悖论1.3 模型暴政与单点故障1.4 创新抑制与价值捕获二、去中心化AGI网络的架构设计2.1 分层架构总览2.2 网络层:混合拓扑结构2.3 计算层:动态算力编排2.4 数据层:零知识…...

gitlab无法登录问题
在我第一次安装gitlab的时候发现登录页面是 正常的页面应该是 这种情况的主要原因是不是第一次登录,所以我们要找到原先的密码 解决方式: [rootgitlab ~]# vim /etc/gitlab/initial_root_password# WARNING: This value is valid only in the followin…...

单向链表在实际项目中的应用
前言 在实际项目中,单向链表经常被用来解决排队问题,因为链表允许动态地添加和移除元素,非常适合模拟队列(FIFO,先进先出)的行为。 这里的链表包含头节点,头结点的数据用来记录链表长度&#x…...

【系统架构设计师】操作系统 ③ ( 存储管理 | 页式存储弊端 - 段式存储引入 | 段式存储 | 段表 | 段表结构 | 逻辑地址 的 合法段地址判断 )
文章目录 一、页式存储弊端 - 段式存储引入1、页式存储弊端 - 内存碎片2、页式存储弊端 - 逻辑结构不匹配3、段式存储引入 二、段式存储 简介1、段式存储2、段表3、段表 结构4、段内地址 / 段内偏移5、段式存储 优缺点6、段式存储 与 页式存储 对比 三、逻辑地址 的 合法段地址…...

PDF另存为图片的一个方法
说明 有时需要把PDF的每一页另存为图片。用Devexpress可以很方便的完成这个功能。 窗体上放置一个PdfViewer。 然后循环每一页 for (int i 1; i < pdfViewer1.PageCount; i) 调用 chg_pdf_to_bmp函数获得图片并保存 chg_pdf_to_bmp中调用了PdfViewer的CreateBitmap函数…...

HTML之JavaScript运算符
HTML之JavaScript运算符 1.算术运算符 - * / %除以0,结果为Infinity取余数,如果除数为0,结果为NaN NAN:Not A Number2.复合赋值运算符 - * / %/ 除以0,结果为Infinity% 如果除数为0,结果为NaN NaN:No…...

借助 ListWise 提升推荐系统精排效能:技术、案例与优化策略
目录 一、引言二、ListWise 方法概述三、ListWise 用于精排的优势四、ListWise 样本具体的构建过程4.1 确定样本的上下文4.2 收集候选物品及相关特征4.3 确定物品的真实排序标签4.4 构建样本列表4.5 划分训练集、验证集和测试集 五、ListWise 方法案例分析六、ListWise 方法在精…...

C++中什么时候用. 什么时候用->
学了一年C今天出了一个大岔子,因为太久没有做链表类型题目了,并且STL用惯了今天遇到一题,写的时候发现完全不对劲,搞慌了,首先我们看题目 2. 两数相加 再看我第一次的解答,先不论结果对不对 错的行为有很多…...

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势
作者:谢吉宝(唐三) 编者按: 云原生 API 网关系列教程即将推出,欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三) 在云栖大会的精…...

【Python深入浅出】Python3正则表达式:开启高效字符串处理大门
目录 一、正则表达式基础入门1.1 什么是正则表达式1.2 正则表达式的语法规则1.3 特殊字符与转义 二、Python 中的 re 模块2.1 re 模块概述2.2 常用函数与方法2.2.1 re.match()2.2.2 re.search()2.2.3 re.findall()2.2.4 re.sub() 2.3 修饰符(Flags)的使用…...

Vue.js Vue CLI 安装与使用
Vue.js Vue CLI 安装与使用 今天我们来聊聊 Vue CLI 的安装与使用。对于开发 Vue 应用来说,Vue CLI 是一个非常强大的工具,它能帮助你快速创建项目脚手架、配置开发环境、自动化构建流程,从而大大提高开发效率。下面我就和大家一步一步地讲解…...

科技的尽头:在有限与永恒的夹缝中寻找文明的真谛
当人类用燧石点燃第一簇文明之火时,科技发展的齿轮便已开始转动。这个从原始工具到量子计算机的进化历程,既是人类突破生物局限的史诗,也是文明不断自我解构与重构的哲学叙事。站在人工智能与基因编辑并行的时代节点,"科技尽…...

【牛客】动态规划专题一:斐波那契数列
文章目录 DP1 斐波那契数列法1:递归法2:动态规划法3:优化空间复杂度 2.分割连接字符串3. 给定一个字符串s和一组单词dict,在s中添加空格将s变成一个句子 DP1 斐波那契数列 法1:递归 // 递归 #include <iostream>…...

java8、9新特性
JAVA8 Lambda 表达式 (parameters) -> expression 或 (parameters) ->{ statements; } 提供了一种更为简洁的语法,尤其适用于函数式接口。相比于传统的匿名内部类,Lambda 表达式使得代码更为紧凑,减少了样板代码的编写。 它允许将函…...

作业:zuoye
1.闹钟(错的) #include "widget.h" #include "ui_widget.h" #include <QMessageBox>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 初始化定时器objTimer new QTimer(th…...

redis底层数据结构——链表
文章目录 定义内部实现总结 定义 链表提供了高效的节点重排能力,以及顺序性的节点访间方式,并且可以通过增删节点来灵活地调整链表的长度。 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用的C语言并没有…...

问题解决 4S 法
在深入研读《像高手一样解决问题》的第二章后,犹如打开了一扇通往高效问题解决领域的新大门,其中所阐述的问题解决 4S 法,更是给人以拨云见日之感。 一、陈述(State):明确问题本质 这是问题解决的起始点&…...

SQL-leetcode—1407. 排名靠前的旅行者
1407. 排名靠前的旅行者 表:Users ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | ---------------------- id 是该表中具有唯一值的列。 name 是用户名字。 表:Rides -------------------…...

机器学习(李宏毅)——Transformer
一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 读这篇文章必须先了解self-attention,可参阅我上一篇。 二、大纲 Transformer问世原理剖析模型训…...

React进阶之React状态管理CRA
React状态管理&CRA 状态管理理论讲解案例 context 上下文结合状态来维护todoListindex.jsApp.jsTaskList.jsTasksContext.jsAddTask.js Escape 脱围机制refforwardRef(不建议使用) CRA 状态管理 理论讲解 如何针对 effect -> 对action的触发 -&…...

攻克AWS认证机器学习工程师(AWS Certified Machine Learning Engineer) - 助理级别认证:我的成功路线图
引言 当我决定考取AWS认证机器学习工程师 - 助理(AWS Certified Machine Learning Engineer — Associate)级别证书时,我就预料到这将是一段充满挑战但回报颇丰的旅程。跟你说吧,它在这两方面都没让我失望。这项考试面向的是不仅理解机器学习原理,还对AWS生态系统有扎实基…...

前端开发环境
vscde nrm 切换源管理 nvm 切换node版本工具 nodemon node运行js文件热更新 pxcook 易用的自动标注工具, 生成前端代码, 设计研发协作利器,比PS轻量 TypeScript 安装tsc 它的作用就是将ts文件编译为js文件 npm i typescript -g 输入tsc -v能够看到东西,就说明好了 …...

Web自动化测试—测试用例流程设计
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1.3、自动化测试…...