最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python打造高顏值軟件卸載工具

 更新時間:2025年05月08日 09:45:59   作者:創(chuàng)客白澤  
在Windows系統(tǒng)中,自帶的"添加/刪除程序"功能一直飽受詬病,加載慢,功能弱,殘留多,所以我們來使用Python打造一個高顏值軟件的卸載工具吧

前言:為什么需要自制卸載工具

在Windows系統(tǒng)中,自帶的"添加/刪除程序"功能一直飽受詬?。杭虞d慢、功能弱、殘留多。第三方卸載工具如GeekUninstaller雖然好用,但畢竟是閉源商業(yè)軟件。今天我們將用Python+tkinter打造一款顏值與實力并存的卸載工具,具備以下殺手級特性:

  • 現(xiàn)代化UI界面(暗黑主題+高亮配色)
  • 精準程序掃描(三路注冊表探測)
  • 強力卸載模式(支持MSI靜默卸載)
  • 智能殘留清理(全盤掃描關(guān)聯(lián)文件)
  • 原生圖標提?。‥XE文件圖標解析)

一、核心功能架構(gòu)設(shè)計

1.1 技術(shù)棧選型

技術(shù)組件作用說明替代方案
tkinterGUI界面開發(fā)PyQt/PySide
winregWindows注冊表訪問_winreg
Pillow圖標圖像處理OpenCV
pywin32Windows API調(diào)用ctypes
shutil文件系統(tǒng)操作os模塊

1.2 程序流程圖

二、關(guān)鍵技術(shù)實現(xiàn)詳解

2.1 多源注冊表掃描(核心代碼解析)

def load_installed_programs(self):
    reg_paths = [
        (winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"),
        # 64位系統(tǒng)兼容路徑
        (winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\WOW6432Node\..."), 
        # 當前用戶安裝路徑
        (winreg.HKEY_CURRENT_USER, r"SOFTWARE\Microsoft\...")
    ]
    
    for hive, path in reg_paths:
        try:
            with winreg.OpenKey(hive, path) as key:
                for i in range(winreg.QueryInfoKey(key)[0]):
                    # 提取程序信息...
                    program = {
                        "name": name,
                        "version": version,
                        "install_location": install_path,
                        "uninstall_string": uninstall_cmd
                    }

技術(shù)要點:

  • 同時掃描HKLM和HKCU兩大主鍵
  • 處理64位系統(tǒng)的WOW6432Node兼容路徑
  • 異常處理確保掃描過程不中斷

2.2 動態(tài)圖標提取技術(shù)

def get_icon_from_exe(self, exe_path):
    # 使用Win32 API提取圖標
    large, small = win32gui.ExtractIconEx(exe_path, 0)
    hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
    
    # 創(chuàng)建兼容位圖
    hbmp = win32ui.CreateBitmap()
    hbmp.CreateCompatibleBitmap(hdc, 16, 16)
    
    # 轉(zhuǎn)換為PIL圖像
    bmpstr = hbmp.GetBitmapBits(True)
    icon = Image.frombuffer('RGB', (16,16), bmpstr, 'raw', 'BGRX', 0, 1)
    return ImageTk.PhotoImage(icon)

創(chuàng)新點:

  • 直接從EXE/DLL提取原始圖標
  • 自動降采樣到16x16尺寸
  • 異常時回退到默認圖標

三、高級功能實現(xiàn)

3.1 智能文件大小計算

def get_program_size(self, path):
    total = 0
    for root, dirs, files in os.walk(path):
        for f in files:
            try:
                total += os.path.getsize(os.path.join(root, f))
            except:
                continue
    return total

???????def format_size(self, size):
    # 智能轉(zhuǎn)換單位
    units = ['B', 'KB', 'MB', 'GB']
    for unit in units:
        if size < 1024.0:
            return f"{size:.1f} {unit}"
        size /= 1024.0
    return f"{size:.1f} TB"

3.2 強力卸載模式

卸載類型處理方式示例命令
標準卸載程序直接執(zhí)行UninstallStringC:\Program Files\...
MSI安裝包調(diào)用msiexec靜默卸載msiexec /x {GUID}
無卸載程序提示手動刪除-

四、UI美化實戰(zhàn)技巧

4.1 現(xiàn)代化暗黑主題

self.bg_color = "#2d2d2d"  # 背景色
self.fg_color = "#ffffff"   # 前景色
self.accent_color = "#4CAF50" # 強調(diào)色

style = ttk.Style()
style.theme_use("clam")
style.configure("Treeview", 
    background="#3d3d3d",
    foreground=self.fg_color,
    fieldbackground="#3d3d3d"
)

4.2 響應(yīng)式布局設(shè)計

# 主界面采用Pack布局
main_frame.pack(fill=tk.BOTH, expand=True)

# 左側(cè)列表區(qū)域
list_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

# 右側(cè)按鈕區(qū)域
button_frame.pack(side=tk.RIGHT, fill=tk.Y)

五、性能優(yōu)化方案

5.1 圖標緩存機制

self.icon_cache = {}  # 緩存字典

def get_program_icon(self, program):
    if program['name'] in self.icon_cache:
        return self.icon_cache[program['name']]
    
    icon = self._extract_icon(program)
    self.icon_cache[program['name']] = icon
    return icon

5.2 多線程加載

from threading import Thread

def load_data_async(self):
    Thread(target=self.load_installed_programs, daemon=True).start()

項目總結(jié)與展望

通過本項目,我們實現(xiàn)了:

  • 完整的程序卸載管理功能
  • 媲美商業(yè)軟件的UI體驗
  • 高效的注冊表掃描機制
  • 智能化的殘留檢測

未來優(yōu)化方向:

  • 增加云端垃圾文件特征庫
  • 實現(xiàn)卸載歷史記錄功能
  • 添加軟件更新檢測模塊

完整項目源碼

import os
import winreg
import subprocess
import shutil
import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
from PIL import Image, ImageTk
import ctypes

class GeekUninstallerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("PyGeek Uninstaller")
        self.root.geometry("900x600")
        self.root.minsize(800, 500)
        
        # 設(shè)置主題顏色
        self.bg_color = "#2d2d2d"
        self.fg_color = "#ffffff"
        self.accent_color = "#4CAF50"
        self.secondary_color = "#2196F3"
        self.warning_color = "#FF5722"
        self.highlight_color = "#FFC107"
        
        # 初始化樣式
        self.setup_styles()
        
        # 創(chuàng)建UI
        self.create_widgets()
        
        # 加載已安裝程序
        self.load_installed_programs()
    
    def setup_styles(self):
        style = ttk.Style()
        style.theme_use("clam")
        
        # 樹狀視圖樣式
        style.configure("Treeview", 
            background="#3d3d3d", 
            foreground=self.fg_color, 
            fieldbackground="#3d3d3d", 
            borderwidth=0
        )
        style.configure("Treeview.Heading", 
            background="#4d4d4d", 
            foreground=self.fg_color, 
            relief=tk.FLAT
        )
        style.map("Treeview", background=[("selected", self.secondary_color)])
        
        # 配置主窗口背景
        self.root.configure(bg=self.bg_color)
    
    def create_widgets(self):
        # 頂部標題欄
        header_frame = tk.Frame(self.root, bg=self.bg_color)
        header_frame.pack(fill=tk.X, padx=10, pady=10)
        
        # 標題
        title_label = tk.Label(
            header_frame, 
            text="PyGeek Uninstaller", 
            font=("Segoe UI", 18, "bold"), 
            fg=self.highlight_color, 
            bg=self.bg_color
        )
        title_label.pack(side=tk.LEFT)
        
        # 搜索框
        search_frame = tk.Frame(header_frame, bg=self.bg_color)
        search_frame.pack(side=tk.RIGHT, fill=tk.X, expand=True)
        
        search_label = tk.Label(
            search_frame, 
            text="Search:", 
            font=("Segoe UI", 10), 
            fg=self.fg_color, 
            bg=self.bg_color
        )
        search_label.pack(side=tk.LEFT, padx=(20, 5))
        
        self.search_var = tk.StringVar()
        self.search_var.trace("w", self.filter_programs)
        search_entry = tk.Entry(
            search_frame, 
            textvariable=self.search_var, 
            font=("Segoe UI", 10), 
            bg="#3d3d3d", 
            fg=self.fg_color, 
            insertbackground=self.fg_color, 
            relief=tk.FLAT
        )
        search_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, ipady=2)
        
        # 主內(nèi)容區(qū)域
        main_frame = tk.Frame(self.root, bg=self.bg_color)
        main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=(0, 10))
        
        # 程序列表
        list_frame = tk.Frame(main_frame, bg=self.bg_color)
        list_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        
        # 樹狀視圖
        self.tree = ttk.Treeview(
            list_frame, 
            columns=("name", "publisher", "version", "size"), 
            selectmode="extended"
        )
        
        # 配置列
        self.tree.heading("#0", text="Icon", anchor=tk.W)
        self.tree.heading("name", text="Name", anchor=tk.W, command=lambda: self.treeview_sort_column(self.tree, "name", False))
        self.tree.heading("publisher", text="Publisher", anchor=tk.W, command=lambda: self.treeview_sort_column(self.tree, "publisher", False))
        self.tree.heading("version", text="Version", anchor=tk.W, command=lambda: self.treeview_sort_column(self.tree, "version", False))
        self.tree.heading("size", text="Size", anchor=tk.W, command=lambda: self.treeview_sort_column(self.tree, "size", False))
        
        self.tree.column("#0", width=30, minwidth=30, stretch=tk.NO)
        self.tree.column("name", width=250, minwidth=150, stretch=tk.YES)
        self.tree.column("publisher", width=200, minwidth=100, stretch=tk.YES)
        self.tree.column("version", width=100, minwidth=70, stretch=tk.NO)
        self.tree.column("size", width=100, minwidth=70, stretch=tk.NO)
        
        # 滾動條
        scrollbar = ttk.Scrollbar(list_frame, orient="vertical", command=self.tree.yview)
        self.tree.configure(yscrollcommand=scrollbar.set)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.tree.pack(fill=tk.BOTH, expand=True)
        
        # 綁定雙擊事件
        self.tree.bind("<Double-1>", self.show_program_details)
        
        # 操作按鈕區(qū)域
        button_frame = tk.Frame(main_frame, bg=self.bg_color)
        button_frame.pack(side=tk.RIGHT, fill=tk.Y, padx=(0, 10))
        
        # 按鈕樣式
        button_style = {
            "font": ("Segoe UI", 10), 
            "bg": "#4d4d4d", 
            "fg": self.fg_color, 
            "activebackground": self.secondary_color, 
            "activeforeground": self.fg_color, 
            "relief": tk.FLAT, 
            "bd": 0, 
            "padx": 15, 
            "pady": 8
        }
        
        # 操作按鈕
        self.uninstall_btn = tk.Button(
            button_frame, 
            text="Uninstall", 
            command=self.uninstall_selected, 
            **button_style
        )
        self.uninstall_btn.pack(fill=tk.X, pady=(0, 5))
        
        self.force_btn = tk.Button(
            button_frame, 
            text="Force Remove", 
            command=self.force_remove, 
            **button_style
        )
        self.force_btn.pack(fill=tk.X, pady=(0, 5))
        
        self.details_btn = tk.Button(
            button_frame, 
            text="Details", 
            command=self.show_program_details, 
            **button_style
        )
        self.details_btn.pack(fill=tk.X, pady=(0, 5))
        
        self.clean_btn = tk.Button(
            button_frame, 
            text="Clean Residues", 
            command=self.clean_residues, 
            **button_style
        )
        self.clean_btn.pack(fill=tk.X, pady=(0, 5))
        
        self.refresh_btn = tk.Button(
            button_frame, 
            text="Refresh", 
            command=self.refresh_list, 
            **button_style
        )
        self.refresh_btn.pack(fill=tk.X, pady=(0, 5))
        
        # 狀態(tài)欄
        self.status_var = tk.StringVar()
        self.status_var.set("Ready")
        status_bar = tk.Label(
            self.root, 
            textvariable=self.status_var, 
            font=("Segoe UI", 9), 
            fg=self.fg_color, 
            bg="#3d3d3d", 
            anchor=tk.W, 
            relief=tk.SUNKEN
        )
        status_bar.pack(fill=tk.X, side=tk.BOTTOM, ipady=5)
    
    def treeview_sort_column(self, tv, col, reverse):
        l = [(tv.set(k, col), k) for k in tv.get_children('')]
        
        # 嘗試轉(zhuǎn)換為數(shù)字進行排序
        try:
            l.sort(key=lambda t: float(t[0]) if t[0].replace('.', '').isdigit() else t[0], reverse=reverse)
        except:
            l.sort(reverse=reverse)
        
        # 重新排列項目
        for index, (val, k) in enumerate(l):
            tv.move(k, '', index)
        
        # 下次反向排序
        tv.heading(col, command=lambda: self.treeview_sort_column(tv, col, not reverse))
    
    def load_installed_programs(self):
        self.tree.delete(*self.tree.get_children())
        self.programs = []
        
        # 從注冊表獲取已安裝程序
        reg_paths = [
            (winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"),
            (winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"),
            (winreg.HKEY_CURRENT_USER, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")
        ]
        
        for hive, path in reg_paths:
            try:
                with winreg.OpenKey(hive, path) as key:
                    for i in range(0, winreg.QueryInfoKey(key)[0]):
                        try:
                            subkey_name = winreg.EnumKey(key, i)
                            with winreg.OpenKey(key, subkey_name) as subkey:
                                try:
                                    name = winreg.QueryValueEx(subkey, "DisplayName")[0]
                                    if not name:
                                        continue
                                    
                                    publisher = winreg.QueryValueEx(subkey, "Publisher")[0] if winreg.QueryValueEx(subkey, "Publisher") else ""
                                    version = winreg.QueryValueEx(subkey, "DisplayVersion")[0] if winreg.QueryValueEx(subkey, "DisplayVersion") else ""
                                    install_location = winreg.QueryValueEx(subkey, "InstallLocation")[0] if winreg.QueryValueEx(subkey, "InstallLocation") else ""
                                    uninstall_string = winreg.QueryValueEx(subkey, "UninstallString")[0] if winreg.QueryValueEx(subkey, "UninstallString") else ""
                                    size = self.get_program_size(install_location)
                                    
                                    program = {
                                        "name": name,
                                        "publisher": publisher,
                                        "version": version,
                                        "size": size,
                                        "install_location": install_location,
                                        "uninstall_string": uninstall_string,
                                        "reg_key": f"{path}\\{subkey_name}",
                                        "hive": hive
                                    }
                                    
                                    self.programs.append(program)
                                    
                                    # 插入到樹狀視圖
                                    self.tree.insert("", "end", values=(
                                        name, 
                                        publisher, 
                                        version, 
                                        self.format_size(size)
                                    ))
                                except (WindowsError, ValueError):
                                    continue
                        except (WindowsError, ValueError):
                            continue
            except WindowsError:
                continue
        
        # 按名稱排序
        self.programs.sort(key=lambda x: x["name"].lower())
        self.treeview_sort_column(self.tree, "name", False)
        
        self.status_var.set(f"Loaded {len(self.programs)} programs")
    
    def get_program_size(self, install_location):
        if not install_location or not os.path.isdir(install_location):
            return 0
        
        total_size = 0
        for dirpath, dirnames, filenames in os.walk(install_location):
            for f in filenames:
                fp = os.path.join(dirpath, f)
                try:
                    total_size += os.path.getsize(fp)
                except:
                    continue
        return total_size
    
    def format_size(self, size):
        if size == 0:
            return "N/A"
        for unit in ['B', 'KB', 'MB', 'GB']:
            if size < 1024.0:
                return f"{size:.1f} {unit}"
            size /= 1024.0
        return f"{size:.1f} TB"
    
    def filter_programs(self, *args):
        query = self.search_var.get().lower()
        for item in self.tree.get_children():
            values = self.tree.item(item)["values"]
            if query in values[0].lower() or query in values[1].lower():
                self.tree.selection_set(item)
                self.tree.see(item)
            else:
                self.tree.selection_remove(item)
    
    def get_selected_program(self):
        selected_items = self.tree.selection()
        if not selected_items:
            messagebox.showwarning("Warning", "Please select a program first!")
            return None
        
        item = selected_items[0]
        values = self.tree.item(item)["values"]
        
        for program in self.programs:
            if program["name"] == values[0] and program["publisher"] == values[1]:
                return program
        
        return None
    
    def show_program_details(self, event=None):
        program = self.get_selected_program()
        if not program:
            return
        
        details_window = tk.Toplevel(self.root)
        details_window.title(f"Details - {program['name']}")
        details_window.geometry("600x400")
        details_window.configure(bg=self.bg_color)
        
        # 詳細信息文本
        details_text = scrolledtext.ScrolledText(
            details_window, 
            wrap=tk.WORD, 
            font=("Consolas", 10), 
            bg="#3d3d3d", 
            fg=self.fg_color, 
            insertbackground=self.fg_color
        )
        details_text.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
        
        # 添加信息
        details = f"""Program Name: {program['name']}
Publisher: {program['publisher']}
Version: {program['version']}
Size: {self.format_size(program['size'])}
Install Location: {program['install_location']}
Uninstall Command: {program['uninstall_string']}
Registry Key: {program['reg_key']}
"""
        details_text.insert(tk.END, details)
        details_text.configure(state="disabled")
        
        # 關(guān)閉按鈕
        close_btn = tk.Button(
            details_window, 
            text="Close", 
            command=details_window.destroy, 
            font=("Segoe UI", 10), 
            bg="#4d4d4d", 
            fg=self.fg_color, 
            activebackground=self.secondary_color, 
            activeforeground=self.fg_color, 
            relief=tk.FLAT
        )
        close_btn.pack(pady=(0, 10))
    
    def uninstall_selected(self):
        program = self.get_selected_program()
        if not program:
            return
        
        if not program["uninstall_string"]:
            messagebox.showerror("Error", "No uninstall command found for this program!")
            return
        
        try:
            # 運行卸載命令
            if program["uninstall_string"].lower().endswith(".msi"):
                # MSI 包
                cmd = f'msiexec /x "{program["uninstall_string"]}" /quiet'
            else:
                # 普通卸載程序
                cmd = program["uninstall_string"]
            
            subprocess.Popen(cmd, shell=True)
            self.status_var.set(f"Uninstalling {program['name']}...")
        except Exception as e:
            messagebox.showerror("Error", f"Failed to start uninstaller: {str(e)}")
    
    def force_remove(self):
        program = self.get_selected_program()
        if not program:
            return
        
        if not messagebox.askyesno("Warning", 
                f"Force removal will delete all files and registry entries for {program['name']}.\n"
                "This action cannot be undone. Continue?"):
            return
        
        # 刪除安裝目錄
        if program["install_location"] and os.path.isdir(program["install_location"]):
            try:
                shutil.rmtree(program["install_location"])
                self.status_var.set(f"Deleted installation folder: {program['install_location']}")
            except Exception as e:
                messagebox.showerror("Error", f"Failed to delete installation folder: {str(e)}")
        
        # 刪除注冊表項
        try:
            hive, path = program["hive"], program["reg_key"]
            with winreg.OpenKey(hive, path.replace("\\", "/"), 0, winreg.KEY_ALL_ACCESS) as key:
                winreg.DeleteKey(hive, path)
            self.status_var.set(f"Deleted registry key: {path}")
        except Exception as e:
            messagebox.showerror("Error", f"Failed to delete registry key: {str(e)}")
        
        # 刷新列表
        self.refresh_list()
        messagebox.showinfo("Success", f"{program['name']} has been force removed!")
    
    def clean_residues(self):
        program = self.get_selected_program()
        if not program:
            return
        
        # 查找殘留文件
        residues = []
        if program["install_location"] and os.path.isdir(program["install_location"]):
            residues.append(program["install_location"])
        
        # 檢查常見殘留位置
        common_locations = [
            os.path.join(os.environ["APPDATA"], program["name"]),
            os.path.join(os.environ["LOCALAPPDATA"], program["name"]),
            os.path.join(os.environ["PROGRAMDATA"], program["name"]),
            os.path.join(os.environ["USERPROFILE"], "AppData", "Local", program["name"]),
            os.path.join(os.environ["USERPROFILE"], "AppData", "Roaming", program["name"])
        ]
        
        for loc in common_locations:
            if os.path.exists(loc):
                residues.append(loc)
        
        if not residues:
            messagebox.showinfo("Info", "No residual files found for this program.")
            return
        
        # 顯示確認對話框
        residue_text = "\n".join(residues)
        if not messagebox.askyesno("Confirm", 
                f"The following residual files/folders will be deleted:\n\n{residue_text}\n\nContinue?"):
            return
        
        # 刪除殘留文件
        success = True
        for residue in residues:
            try:
                if os.path.isdir(residue):
                    shutil.rmtree(residue)
                else:
                    os.remove(residue)
                self.status_var.set(f"Deleted residue: {residue}")
            except Exception as e:
                messagebox.showerror("Error", f"Failed to delete {residue}: {str(e)}")
                success = False
        
        if success:
            messagebox.showinfo("Success", "Residual files have been cleaned successfully!")
    
    def refresh_list(self):
        self.status_var.set("Refreshing program list...")
        self.root.update()
        self.load_installed_programs()
        self.status_var.set("Program list refreshed")

def main():
    # 啟用DPI感知
    try:
        ctypes.windll.shcore.SetProcessDpiAwareness(1)
    except:
        pass
    
    root = tk.Tk()
    app = GeekUninstallerApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()

互動討論

Q:為什么選擇tkinter而不是PyQt?

A:tkinter作為Python標準庫,具有更好的兼容性和更小的體積,適合分發(fā)小型工具。

Q:如何增強卸載能力?

???????A:可以集成PowerShell的Remove-MSIXPackage等現(xiàn)代卸載方案。

以上就是基于Python打造高顏值軟件卸載工具的詳細內(nèi)容,更多關(guān)于Python軟件卸載的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Pygame游戲開發(fā)之太空射擊實戰(zhàn)子彈與碰撞處理篇

    Pygame游戲開發(fā)之太空射擊實戰(zhàn)子彈與碰撞處理篇

    相信大多數(shù)8090后都玩過太空射擊游戲,在過去游戲不多的年代太空射擊自然屬于經(jīng)典好玩的一款了,今天我們來自己動手實現(xiàn)它,在編寫學(xué)習(xí)中回顧過往展望未來,下面開始講解子彈與碰撞處理,在本課中,我們將添加玩家與敵人之間的碰撞,以及添加供玩家射擊的子彈
    2022-08-08
  • Python無頭爬蟲下載文件的實現(xiàn)

    Python無頭爬蟲下載文件的實現(xiàn)

    這篇文章主要介紹了Python無頭爬蟲下載文件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 詳解python os.path.exists判斷文件或文件夾是否存在

    詳解python os.path.exists判斷文件或文件夾是否存在

    這篇文章主要介紹了詳解python os.path.exists判斷文件或文件夾是否存在,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • python 使用csv模塊讀寫csv格式文件的示例

    python 使用csv模塊讀寫csv格式文件的示例

    這篇文章主要介紹了python 使用csv模塊讀寫csv格式文件的示例,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-12-12
  • 利用python生成照片墻的示例代碼

    利用python生成照片墻的示例代碼

    這篇文章主要介紹了利用python生成照片墻的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • python實現(xiàn)可視化動態(tài)CPU性能監(jiān)控

    python實現(xiàn)可視化動態(tài)CPU性能監(jiān)控

    這篇文章主要為大家詳細介紹了python可視化動態(tài)CPU性能監(jiān)控,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Django使用原生SQL查詢數(shù)據(jù)庫詳解

    Django使用原生SQL查詢數(shù)據(jù)庫詳解

    本文介紹了Django ORM的優(yōu)缺點,然后介紹了使用原生SQL進行查詢的優(yōu)點,包括更靈活、更高效等。接著介紹了如何在Django中使用原生SQL進行查詢,包括利用Django的connection對象進行查詢以及使用Django的CursorWrapper類進行封裝。最后提醒了使用原生SQL查詢的注意事項。
    2023-04-04
  • python scipy求解非線性方程的方法(fsolve/root)

    python scipy求解非線性方程的方法(fsolve/root)

    今天小編就為大家分享一篇python scipy求解非線性方程的方法(fsolve/root),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • 詳解python中return和print的區(qū)別和用途

    詳解python中return和print的區(qū)別和用途

    在 Python 中,return 和 print 是兩種常見的語句,用于在函數(shù)中輸出信息或返回值,盡管它們看起來相似,但它們有不同的作用和用法,本文將詳細介紹 return 和 print 在函數(shù)中的區(qū)別,并提供豐富的示例代碼,以幫助你更好地理解它們的用途
    2023-11-11
  • 詳解Python中的GIL(全局解釋器鎖)詳解及解決GIL的幾種方案

    詳解Python中的GIL(全局解釋器鎖)詳解及解決GIL的幾種方案

    這篇文章主要介紹了詳解Python中的GIL(全局解釋器鎖)詳解及解決GIL的幾種方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評論

太谷县| 江北区| 石渠县| 万载县| 涿鹿县| 柏乡县| 焉耆| 开平市| 云龙县| 长岛县| 内黄县| 上思县| 清徐县| 彰化县| 两当县| 泰来县| 文山县| 突泉县| 沂源县| 潞西市| 泉州市| 商水县| 墨玉县| 滁州市| 汤阴县| 汽车| 绩溪县| 新和县| 玉溪市| 永寿县| 定兴县| 盱眙县| 清徐县| 韶关市| 孙吴县| 来安县| 咸阳市| 吴堡县| 洪江市| 光泽县| 屏边|