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>…...
UniApp二维码生成避坑指南:解决常见Canvas渲染问题
UniApp二维码生成避坑指南:解决常见Canvas渲染问题 在移动应用开发中,二维码功能已成为用户交互的标配。UniApp作为跨平台开发框架,其Canvas组件在实现二维码生成时却存在诸多"暗礁"。本文将深入剖析五个典型场景下的Canvas渲染陷阱…...
3个革命性步骤:分布式推理让普通设备实现本地化AI部署
3个革命性步骤:分布式推理让普通设备实现本地化AI部署 【免费下载链接】LocalAI mudler/LocalAI: LocalAI 是一个开源项目,旨在本地运行机器学习模型,减少对云服务的依赖,提高隐私保护。 项目地址: https://gitcode.com/GitHub_…...
Unity Input System手势识别避坑指南:为什么你的双指缩放总是不跟手?
Unity Input System手势识别避坑指南:为什么你的双指缩放总是不跟手? 当你在Unity中实现双指缩放功能时,是否遇到过这样的问题:用户手指明明在屏幕上流畅滑动,但画面却像卡顿了一样,或者缩放比例突然跳变&a…...
Modbus转EtherCAT网关开发秘笈:用AX58100实现120个命令自动映射(Web配置全图解)
Modbus转EtherCAT网关开发实战:AX58100零代码配置与工业部署全指南 工业自动化领域正经历着从传统串行通信向实时以太网协议的转型浪潮。作为这场变革的核心枢纽,协议转换网关的性能直接决定了整个系统的响应速度和稳定性。本文将深入探讨如何利用AX5810…...
开箱即用:ANIMATEDIFF PRO预置镜像部署,快速开启AI视频创作
开箱即用:ANIMATEDIFF PRO预置镜像部署,快速开启AI视频创作 1. 为什么选择ANIMATEDIFF PRO镜像 如果你正在寻找一个能快速生成电影级AI视频的解决方案,ANIMATEDIFF PRO预置镜像可能是目前最省心的选择。这个基于AnimateDiff架构和Realistic…...
5个步骤让你的魔兽争霸3在现代电脑上完美运行:WarcraftHelper终极优化指南
5个步骤让你的魔兽争霸3在现代电脑上完美运行:WarcraftHelper终极优化指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还在为魔…...
Swin Transformer部署避坑指南:从环境搭建到性能翻倍的实战手册
Swin Transformer部署避坑指南:从环境搭建到性能翻倍的实战手册 【免费下载链接】Swin-Transformer This is an official implementation for "Swin Transformer: Hierarchical Vision Transformer using Shifted Windows". 项目地址: https://gitcode.…...
# 时序数据库新玩法:用Go语言打造高性能监控系统(附完整代码)在
时序数据库新玩法:用Go语言打造高性能监控系统(附完整代码) 在现代微服务架构中,指标采集与实时分析已成为运维和开发团队的核心能力。传统关系型数据库难以胜任高吞吐、低延迟的时序数据写入场景,而 InfluxDB、Promet…...
Go Context 取消信号机制剖析
Go Context 取消信号机制剖析 在Go语言中,Context是控制并发任务生命周期的重要工具,其取消信号机制尤其关键。通过Context,开发者可以优雅地终止协程、释放资源,避免资源泄漏和无效计算。本文将深入剖析Go Context的取消信号机制…...
PCB文件查看工具探索:OpenBoardView如何突破电路分析效率瓶颈
PCB文件查看工具探索:OpenBoardView如何突破电路分析效率瓶颈 【免费下载链接】OpenBoardView View .brd files 项目地址: https://gitcode.com/gh_mirrors/op/OpenBoardView 电子工程师们常面临这样的困境:面对复杂的.brd格式文件,要…...
