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 AbstractFactory

class 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 data


    def 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 = SchoolId
                info.SchoolName = SchoolName
                info.SchoolTelNo = SchoolTelNo
                schools.append(info)
        return schools

    def 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 = SchoolId
                info.SchoolName = SchoolName
                info.SchoolTelNo = SchoolTelNo
                schools.append(info)
        return schools

    def selectSqlCount(cls) -> int:
        """
        查询数据 总数
        :return:
        """
        #print(cls.dal().selectSqlCount()[0][0])
        total = cls.dal().selectSqlCount()[0][0]
        return total

    def Count(self) -> int:
        """
        查询数据 总数
        :return:
        """
        total = self.dal().selectSqlCount()[0][0]
        return total


    def 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 data


    def 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 = SchoolId
                info.SchoolName = SchoolName
                info.SchoolTelNo = SchoolTelNo
                schools.append(info)
        return schools


    def 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 = SchoolId
                info.SchoolName = SchoolName
                info.SchoolTelNo = SchoolTelNo
                schools.append(info)
        return schools


    def 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 = SchoolId
                info.SchoolName = SchoolName
                info.SchoolTelNo = SchoolTelNo
                schools.append(info)
        return schools

    def 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 SchoolInfo

class SchoolView(tk.Frame):
    """
    View 类:负责创建和管理用户界面
    """
    def __init__(self, master=None):
        """

        :param master:
        """
        super().__init__(master)

        self.master = master
        self.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 Frame
        self.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 Frame
        self.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 = controller
        self.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_id
        info.SchoolName = school_name
        info.SchoolTelNo = school_tel

        if 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 = controller
        self.school_id = school_id
        self.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_id
            info.SchoolName=school_name
            info.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 EditSchoolWindow


class SchoolController(object):
    """
    Controller 类:负责处理用户输入和更新模型和视图
    """
    def __init__(self, model, view):
        """

        :param model:
        :param view:
        """
        self.model = SchoolInfo()
        self.view = view
        self.current_page = 1
        self.limit = 10
        self.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 = 1
        self.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.limit
            contacts = 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=id
        self.model.SchoolName=name
        self.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 = id
            self.model.SchoolName = name
            self.model.SchoolTelNo = phone
            if 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 = 1
        self.showschools()
    def prev_page(self):
        """

        :return:
        """
        if self.current_page > 1:
            self.current_page -= 1
            self.showschools()
    def next_page(self):
        """

        :return:
        """
        total_count = self.bll.getcount(self.search_query)[0][0]
        total_pages = (total_count + self.limit - 1) // self.limit
        if self.current_page < total_pages:
            self.current_page += 1
            self.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.limit
            contacts = 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 SchoolController


if __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()

输出:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Xcode证书密钥导入

证书干嘛用 渠道定期会给xcode证书&#xff0c;用来给ios打包用&#xff0c;证书里面有记录哪些设备可以打包进去。 怎么换证书 先更新密钥 在钥匙串访问中&#xff0c;选择系统。(选登录也行&#xff0c;反正两个都要导入就是了)。 mac中双击所有 .p12 后缀的密钥&#xff…

【学习笔记】计算机网络(三)

第3章 数据链路层 文章目录 第3章 数据链路层3.1数据链路层的几个共同问题3.1.1 数据链路和帧3.1.2 三个基本功能3.1.3 其他功能 - 滑动窗口机制 3.2 点对点协议PPP(Point-to-Point Protocol)3.2.1 PPP 协议的特点3.2.2 PPP协议的帧格式3.2.3 PPP 协议的工作状态 3.3 使用广播信…

最新版Edge浏览器集成ActiveX控件之金山WpsDocFrame控件

背景 WpsDocFrame控件‌是由金山公司开发的ActiveX控件&#xff0c;主要用于OA系统中&#xff0c;支持在浏览器中嵌入WPS文档的查看和编辑功能。 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有…

计算机网络结课设计:通过思科Cisco进行中小型校园网搭建

上学期计算机网络课程的结课设计是使用思科模拟器搭建一个中小型校园网&#xff0c;当时花了几天时间查阅相关博客总算是做出来了&#xff0c;在验收后一直没管&#xff0c;在寒假想起来了简单分享一下&#xff0c;希望可以给有需求的小伙伴一些帮助 目录 一、设计要求 二、…

mars3d接入到uniapp的时候ios上所有地图的瓦片都无法加载解决方案

用的是【Mars3d】官网的uniapp的仓库&#xff0c;安卓没有问题&#xff0c;但是ios的不行 相关链接 mars3d-uni-app: uni-app技术栈下的Mars3D项目模板 解决方案&#xff1a;感觉所有图片请求全被拦截了 uniapp的ios内核不允许跨域&#xff0c;需要先把瓦片下载后转base64&…

springboot019高校心理教育辅导

版权声明 所有作品均为本人原创&#xff0c;提供参考学习使用&#xff0c;如需要源码数据库配套文档请移步 www.taobysj.com 搜索获取 技术实现 开发语言&#xff1a;Javavue。 框架&#xff1a;后端spingboot前端vue。 模式&#xff1a;B/S。 数据库&#xff1a;mysql。 开…

基于java手机销售网站设计和实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

基于 GEE 计算研究区年均地表温度数据

目录 1 代码解析 2 完整代码 3 运行结果 1 代码解析 &#xff08;1&#xff09;定义研究区&#xff1a; // 研究区的范围需要自己提前上传 var dataset table;// 将研究区显示在中心&#xff0c;后面的数字为缩放等级&#xff0c;范围从1 - 24 Map.centerObject(dataset,…

VMware Windows_10_x64 安装 VM Tools 后无法将本机文件复制到虚拟机

有一种情况&#xff0c;安装VM Tools死活安装不上去。这时不要急不要慌&#xff0c;重启本机就好了&#xff08;本人情况就是如此&#xff09;。 windows键 R 输入 service.msc 打开服务管理器 找到Virtual Disk服务&#xff0c;选择属性设置为自动&#xff0c;应用后启用服…

python知识和项目经验

一些功能的实现 从.py文件中获取函数对象和参数 的字典 在给定的Python脚本中&#xff0c;通过模块导入和反射机制&#xff0c;如何动态获取包含模型函数的模块中的函数及其默认参数&#xff0c;并构建一个字典以便后续使用&#xff1f; 解决方案 test.py # test.py impor…

Unity下ML-Agents第一个示例

本文写于2025年2月12日&#xff0c;需要提前安装好Anaconda。按文中步骤测试了两次都可正常运行。 一、准备Python端 1.下载并解压 ML-Agents Release 22&#xff08;使用git clone大概率会失败&#xff09; 解压路径为 C:\Users\Administrator&#xff08;Administrator为电…

FastExcel + Java:打造高效灵活的Excel数据导入导出解决方案

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 基于AOP的数据字典实现…

解决IDEA中gitlab登录只有token选项,没有账号密码选项

如图&#xff0c;当点击gitlab账户登录的时候&#xff0c;只显示server和token&#xff0c;而没有账号选项。期望通过账号密码登录。 解决方式&#xff1a; 插件 - GitLab - 禁用即可。

AI语言模型的技术之争:DeepSeek与ChatGPT的架构与训练揭秘

云边有个稻草人-CSDN博客 目录 第一章&#xff1a;DeepSeek与ChatGPT的基础概述 1.1 DeepSeek简介 1.2 ChatGPT简介 第二章&#xff1a;模型架构对比 2.1 Transformer架构&#xff1a;核心相似性 2.2 模型规模与参数 第三章&#xff1a;训练方法与技术 3.1 预训练与微调…

PHP 中的除以零错误

除以零错误&#xff08;Division by zero&#xff09;是指数字除以零的情况&#xff0c; 这在数学上是未定义的。在 PHP 中&#xff0c;处理这种错误的方式取决于 PHP 版本&#xff1a; PHP 7&#xff1a; 使用 / 运算符会产生一个警告 (E_WARNING) 并返回 false。 使用 intd…

【设计模式】01- 一文理解常用设计模式-“创建型模式”篇

一、前言 最近在复习设计模式&#xff0c;撰写、整理了内容和代码片段&#xff0c;和大家一起交流学习。 设计模式是软件设计中常见问题的典型解决方案。 二、模式分类 模式可以根据其意图或目的来分类。常见的设计模式包括&#xff1a; 创建型模式提供创建对象的机制&#x…

数据结构-链式二叉树

文章目录 一、链式二叉树1.1 链式二叉树的创建1.2 根、左子树、右子树1.3 二叉树的前中后序遍历1.3.1前(先)序遍历1.3.2中序遍历1.3.3后序遍历 1.4 二叉树的节点个数1.5 二叉树的叶子结点个数1.6 第K层节点个数1.7 二叉树的高度1.8 查找指定的值(val)1.9 二叉树的销毁 二、层序…

游戏引擎学习第99天

仓库:https://gitee.com/mrxiao_com/2d_game_2 黑板&#xff1a;制作一些光场(Light Field) 当前的目标是为游戏添加光照系统&#xff0c;并已完成了法线映射&#xff08;normal maps&#xff09;的管道&#xff0c;但还没有创建可以供这些正常映射采样的光场。为了继续推进&…

LSTM变种模型

GRU GRU简介 门控循环神经网络 (Gated Recurrent Neural Network&#xff0c;GRNN) 的提出&#xff0c;旨在更好地捕捉时间序列中时间步距离较大的依赖关系。它通过可学习的门来控制信息的流动。其中&#xff0c;门控循环单元 (Gated Recurrent Unit &#xff0c; GRU) 是…

业务开发 | 基础知识 | Maven 快速入门

Maven 快速入门 1.Maven 全面概述 Apache Maven 是一种软件项目管理和理解工具。基于项目对象模型的概念&#xff08;POM&#xff09;&#xff0c;Maven 可以从中央信息中管理项目的构建&#xff0c;报告和文档。 2.Maven 基本功能 因此实际上 Maven 的基本功能就是作为 Ja…