亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python+Tkinter實現(xiàn)Windows?Hosts文件編輯管理工具

 更新時間:2025年05月08日 09:56:42   作者:創(chuàng)客白澤  
在日常開發(fā)和網(wǎng)絡(luò)調(diào)試或科學(xué)上網(wǎng)場景中,Hosts文件修改是每個開發(fā)者都繞不開的"必修課",本文將完整解析一個基于Python?Tkinter開發(fā)的Windows?Hosts管理工具,希望對大家有一定的幫助

一、前言:為什么我們需要專業(yè)的Hosts管理工具

在日常開發(fā)、網(wǎng)絡(luò)調(diào)試或科學(xué)上網(wǎng)場景中,Hosts文件修改是每個開發(fā)者都繞不開的"必修課"。傳統(tǒng)的手動修改方式存在三大痛點:

  • 操作風(fēng)險高:直接修改系統(tǒng)文件可能導(dǎo)致語法錯誤
  • 效率低下:每次修改需要定位到系統(tǒng)目錄
  • 缺乏管理:版本回溯困難,多人協(xié)作不便

本文將完整解析一個基于Python Tkinter開發(fā)的Windows Hosts管理工具(附完整源碼),它具備:

  • 可視化編輯
  • 一鍵備份/恢復(fù)
  • GitHub加速預(yù)設(shè)
  • DNS緩存刷新
  • 網(wǎng)絡(luò)配置快速入口

二、工具核心功能全景圖

2.1 基礎(chǔ)功能模塊

功能模塊技術(shù)實現(xiàn)使用場景
可視化編輯Tkinter Text組件安全修改Hosts內(nèi)容
版本管理shutil文件操作配置回滾/多環(huán)境切換
語法校驗正則表達(dá)式防止配置錯誤

2.2 進(jìn)階網(wǎng)絡(luò)工具

class NetworkToolsManager:
    @staticmethod
    def flush_dns():
        subprocess.run(["ipconfig", "/flushdns"], shell=True)

三、關(guān)鍵技術(shù)實現(xiàn)深度解析

3.1 安全文件操作機(jī)制

def save_hosts(self):
    try:
        with open(HOSTS_PATH, "w", encoding="utf-8") as f:
            f.write(content)
        logging.info(f"成功保存hosts文件")
    except PermissionError:
        messagebox.showerror("錯誤", "請以管理員權(quán)限運行程序")

關(guān)鍵點分析:

  • 強(qiáng)制UTF-8編碼避免亂碼
  • try-catch捕獲權(quán)限異常
  • 操作日志全程記錄

3.2 智能備份系統(tǒng)設(shè)計

備份策略采用"時間戳+增量"模式:

backups/
   ├── hosts_20240507_143000.bak
   ├── hosts_20240507_143500.bak
   └── hosts_20240507_144000.bak

核心代碼邏輯:

backup_name = f"hosts_{datetime.now().strftime('%Y%m%d_%H%M%S')}.bak"
shutil.copy(HOSTS_PATH, os.path.join(BACKUP_DIR, backup_name))

3.3 界面交互優(yōu)化技巧

現(xiàn)代化UI實現(xiàn)方案:

卡片式布局(CSS風(fēng)格陰影效果)

self.main_frame = tk.Frame(highlightbackground="#dcdcdc", highlightthickness=1)

按鈕懸停特效

btn.bind("<Enter>", lambda e: btn.config(bg=hover_color))
btn.bind("<Leave>", lambda e: btn.config(bg=normal_color))

狀態(tài)欄實時反饋

self.status_bar = tk.Label(text="就緒", anchor=tk.W)

四、實戰(zhàn)演示:從安裝到高階使用

4.1 環(huán)境搭建步驟

安裝Python 3.8+

安裝依賴庫:

pip install tkinter shutil logging datetime

下載源碼(文末提供)

4.2 典型使用場景演示

場景一:快速切換開發(fā)環(huán)境

  • 點擊"加載hosts"讀取當(dāng)前配置
  • 修改測試環(huán)境域名指向
  • 保存后自動備份

場景二:GitHub加速

def accelerate_github(self):
    github_hosts = """
    140.82.112.3 github.com
    140.82.112.4 gist.github.com
    ..."""

點擊網(wǎng)絡(luò)工具→加速GitHub一鍵注入最優(yōu)IP

五、性能優(yōu)化與異常處理

5.1 大文件處理優(yōu)化

# 分塊讀取大文件
with open(HOSTS_PATH, "r") as f:
    while chunk := f.read(4096):
        self.text.insert(tk.END, chunk)

5.2 全面的錯誤處理機(jī)制

錯誤類型處理方案用戶提示
文件不存在自動創(chuàng)建備份目錄“正在初始化備份目錄…”
權(quán)限不足捕獲PermissionError“請以管理員身份運行”
編碼錯誤強(qiáng)制UTF-8編碼“文件編碼異常,已自動轉(zhuǎn)換”

六、工具擴(kuò)展方向

6.1 企業(yè)級功能增強(qiáng)

增加多環(huán)境Profile管理

開發(fā)團(tuán)隊協(xié)作版本控制

添加配置差異對比功能

6.2 跨平臺適配方案

# 自適應(yīng)系統(tǒng)路徑
if sys.platform == "win32":
    HOSTS_PATH = r"C:\Windows\System32\drivers\etc\hosts"
elif sys.platform == "linux":
    HOSTS_PATH = "/etc/hosts"

七、結(jié)語與資源下載

通過本工具的開發(fā)實踐,我們不僅解決了Hosts管理的痛點,更展示了Python GUI開發(fā)的強(qiáng)大靈活性。工具已開源,歡迎Star和貢獻(xiàn)代碼!

完整源碼下載

import tkinter as tk
from tkinter import messagebox, filedialog
import os
import shutil
import logging
import datetime

# 日志配置
LOG_DIR = os.path.join(os.path.dirname(__file__), "logs")
if not os.path.exists(LOG_DIR):
    os.makedirs(LOG_DIR)

log_filename = os.path.join(LOG_DIR, f"hostsmanager_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.log")
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler(log_filename, encoding='utf-8'),
        logging.StreamHandler() # 同時輸出到控制臺,方便調(diào)試
    ]
)

HOSTS_PATH = r"C:\Windows\System32\drivers\etc\hosts"
BACKUP_DIR = os.path.join(os.path.dirname(__file__), "backups")


class NetworkToolsManager:
    @staticmethod
    def flush_dns():
        import subprocess
        subprocess.run(["ipconfig", "/flushdns"], shell=True)

class HostsManagerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Windows Hosts編輯器")
        self.root.geometry("800x600") # 增大窗口尺寸
        self.root.resizable(True, True) # 允許調(diào)整大小
        self.root.configure(bg="#f0f0f0") # 使用更柔和的背景色

        # 卡片式布局,增加圓角和更細(xì)微的陰影
        self.main_frame = tk.Frame(root, bg="#ffffff", bd=0, relief="solid", borderwidth=1, highlightbackground="#dcdcdc", highlightthickness=1)
        self.main_frame.place(relx=0.02, rely=0.02, relwidth=0.96, relheight=0.96) # 調(diào)整布局,減少頂部空白,增加高度

        # Hosts內(nèi)容文本框和滾動條
        self.text_frame = tk.Frame(self.main_frame, bg="#ffffff") # 文本框容器
        self.text_frame.place(relx=0.03, rely=0.10, relwidth=0.94, relheight=0.68) # 調(diào)整文本框位置和高度

        self.scrollbar = tk.Scrollbar(self.text_frame, orient="vertical")
        self.scrollbar.pack(side="right", fill="y")
        
        self.text = tk.Text(
            self.text_frame,
            font=("Segoe UI", 11), # 調(diào)整字體大小
            wrap="none",
            bg="#ffffff",
            relief="flat",
            bd=0,
            highlightthickness=1,
            highlightbackground="#e0e0e0",
            highlightcolor="#64b5f6", # 調(diào)整高亮顏色
            yscrollcommand=self.scrollbar.set,
            padx=10, # 增加內(nèi)邊距
            pady=10
        )
        self.text.pack(side="left", fill="both", expand=True)
        
        self.scrollbar.config(command=self.text.yview)

        # 按鈕區(qū) - 使用更現(xiàn)代的樣式和布局
        button_frame = tk.Frame(self.main_frame, bg="#ffffff")
        button_frame.place(relx=0.03, rely=0.02, relwidth=0.94, height=45) # 增加按鈕區(qū)域高度

        btn_style = {
            "font": ("Segoe UI", 10, "bold"), # 調(diào)整字體
            "fg": "white",
            "bd": 0,
            "relief": "flat",
            "cursor": "hand2",
            "height": 1,
            "padx": 10,
            "pady": 5
        }

        # 按鈕顏色和懸停效果
        colors = {
            "load": ("#4CAF50", "#66bb6a"),
            "save": ("#2196F3", "#64b5f6"),
            "backup": ("#FF9800", "#ffb74d"),
            "restore": ("#9C27B0", "#ba68c8"),
            "switch": ("#78909C", "#90a4ae"),
            "network": ("#009688", "#4db6ac")
        }

        def create_button(parent, text, command, color_key, width):
            btn = tk.Button(
                parent,
                text=text,
                command=command,
                bg=colors[color_key][0],
                activebackground=colors[color_key][1],
                activeforeground="white",
                **btn_style
            )
            btn.bind("<Enter>", lambda e, b=btn, c=colors[color_key][1]: b.config(bg=c))
            btn.bind("<Leave>", lambda e, b=btn, c=colors[color_key][0]: b.config(bg=c))
            return btn

        self.load_btn = create_button(button_frame, "加載hosts", self.load_hosts, "load", 100)
        self.load_btn.pack(side="left", padx=5)

        self.save_btn = create_button(button_frame, "保存hosts", self.save_hosts, "save", 100)
        self.save_btn.pack(side="left", padx=5)

        self.backup_btn = create_button(button_frame, "備份當(dāng)前hosts", self.backup_hosts, "backup", 120)
        self.backup_btn.pack(side="left", padx=5)

        self.restore_btn = create_button(button_frame, "管理備份", self.open_backup_window, "restore", 100)
        self.restore_btn.pack(side="left", padx=5)

        self.switch_btn = create_button(button_frame, "切換hosts配置", self.switch_hosts, "switch", 130)
        self.switch_btn.pack(side="left", padx=5)

        # 網(wǎng)絡(luò)工具菜單按鈕
        self.network_menu_btn = tk.Menubutton(
            self.main_frame,
            text="網(wǎng)絡(luò)工具",
            bg=colors["network"][0],
            activebackground=colors["network"][1],
            activeforeground="white",
            **btn_style
        )
        self.network_menu_btn.place(relx=0.03, rely=0.80, width=100, height=32)
        
        self.network_menu = tk.Menu(self.network_menu_btn, tearoff=0, bg="#ffffff", fg="#333333", font=("Segoe UI", 10))
        self.network_menu.add_command(label="加速GitHub", command=self.accelerate_github)
        self.network_menu.add_command(label="網(wǎng)絡(luò)配置", command=self.open_network_settings)
        self.network_menu.add_command(label="刷新DNS緩存", command=NetworkToolsManager.flush_dns)
        self.network_menu.add_command(label="打開hosts文件", command=self.open_hosts_file)
        
        self.network_menu_btn.config(menu=self.network_menu)
        self.network_menu_btn.bind(
            "<Enter>", lambda e: self.network_menu_btn.config(bg=colors["network"][1])
        )
        self.network_menu_btn.bind(
            "<Leave>", lambda e: self.network_menu_btn.config(bg=colors["network"][0])
        )

        # 狀態(tài)欄
        self.status_bar = tk.Label(self.main_frame, text="就緒", bd=1, relief=tk.SUNKEN, 
                                anchor=tk.W, bg="#e3f2fd", fg="#37474f")
        self.status_bar.place(relx=0.03, rely=0.92, relwidth=0.94, height=24)

        self.load_hosts()
        logging.info("應(yīng)用程序啟動")

    def open_hosts_file(self):
        import subprocess
        try:
            subprocess.Popen(["notepad.exe", HOSTS_PATH])
            logging.info(f"已用系統(tǒng)默認(rèn)編輯器打開 hosts 文件: {HOSTS_PATH}")
        except Exception as e:
            logging.exception(f"打開 hosts 文件失敗: {HOSTS_PATH}")
            messagebox.showerror("錯誤", f"打開hosts文件失敗: {e}")

    def load_hosts(self):
        try:
            with open(HOSTS_PATH, "r", encoding="utf-8") as f:
                content = f.read()
            self.text.delete(1.0, tk.END)
            self.text.insert(tk.END, content)
            logging.info(f"成功加載 hosts 文件: {HOSTS_PATH}")
        except Exception as e:
            logging.exception(f"加載 hosts 文件失敗: {HOSTS_PATH}")
            messagebox.showerror("錯誤", f"加載hosts失敗: {e}")

    def save_hosts(self):
        content = self.text.get(1.0, tk.END)
        try:
            with open(HOSTS_PATH, "w", encoding="utf-8") as f:
                f.write(content)
            logging.info(f"成功保存 hosts 文件: {HOSTS_PATH}")
            messagebox.showinfo("成功", "hosts文件已保存!")
        except Exception as e:
            logging.exception(f"保存 hosts 文件失敗: {HOSTS_PATH}")
            messagebox.showerror("錯誤", f"保存hosts失敗: {e}")

    def backup_hosts(self):
        if not os.path.exists(BACKUP_DIR):
            try:
                os.makedirs(BACKUP_DIR)
                logging.info(f"創(chuàng)建備份目錄: {BACKUP_DIR}")
            except Exception as e:
                logging.exception(f"創(chuàng)建備份目錄失敗: {BACKUP_DIR}")
                messagebox.showerror("錯誤", f"創(chuàng)建備份目錄失敗: {e}")
                return

        backup_name = f"hosts_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.bak"
        backup_path = os.path.join(BACKUP_DIR, backup_name)
        try:
            shutil.copy(HOSTS_PATH, backup_path)
            logging.info(f"成功備份 hosts 文件到: {backup_path}")
            messagebox.showinfo("成功", f"備份成功: {backup_name}")
        except Exception as e:
            logging.exception(f"備份 hosts 文件失敗: {HOSTS_PATH} -> {backup_path}")
            messagebox.showerror("錯誤", f"備份失敗: {e}")

    def open_backup_window(self):
        backup_window = tk.Toplevel(self.root)
        backup_window.title("備份管理")
        backup_window.geometry("400x350")
        backup_window.resizable(True, True)
        backup_window.configure(bg="#f0f0f0")
        backup_window.transient(self.root)
        backup_window.grab_set()

        # 備份列表區(qū)域
        backup_frame = tk.Frame(backup_window, bg="#ffffff", bd=1, relief="solid", highlightbackground="#dcdcdc", highlightthickness=1)
        backup_frame.pack(padx=10, pady=10, fill="both", expand=True)

        label_backup = tk.Label(
            backup_frame,
            text="備份列表:",
            font=("Segoe UI", 10, "bold"),
            bg="#ffffff",
            fg="#555555",
            anchor="w"
        )
        label_backup.pack(side="top", fill="x", padx=5, pady=(5, 2))

        listbox_frame = tk.Frame(backup_frame, bg="#ffffff")
        listbox_frame.pack(fill="both", expand=True, padx=5, pady=(0, 5))

        backup_scrollbar = tk.Scrollbar(listbox_frame, orient="vertical")
        backup_scrollbar.pack(side="right", fill="y")
        
        backup_listbox = tk.Listbox(
            listbox_frame,
            font=("Segoe UI", 10),
            bd=0,
            highlightthickness=1,
            highlightbackground="#e0e0e0",
            relief="flat",
            bg="#f9f9f9",
            yscrollcommand=backup_scrollbar.set,
            selectbackground="#64b5f6",
            selectforeground="white"
        )
        backup_listbox.pack(side="left", fill="both", expand=True)
        backup_scrollbar.config(command=backup_listbox.yview)

        def refresh_list():
            backup_listbox.delete(0, tk.END)
            if not os.path.exists(BACKUP_DIR):
                logging.warning(f"備份目錄不存在: {BACKUP_DIR}")
                return
            try:
                files = sorted(os.listdir(BACKUP_DIR), reverse=True)
                for fname in files:
                    if fname.endswith(".bak"):
                        backup_listbox.insert(tk.END, fname)
                logging.info(f"成功加載備份列表從: {BACKUP_DIR}")
            except Exception as e:
                logging.exception(f"加載備份列表失敗: {BACKUP_DIR}")
                messagebox.showerror("錯誤", f"加載備份列表失敗: {e}", parent=backup_window)

        def restore_selected_backup():
            sel = backup_listbox.curselection()
            if not sel:
                messagebox.showwarning("提示", "請先選擇一個備份文件!", parent=backup_window)
                return
            backup_file = backup_listbox.get(sel[0])
            backup_path = os.path.join(BACKUP_DIR, backup_file)
            try:
                shutil.copy(backup_path, HOSTS_PATH)
                self.load_hosts()
                logging.info(f"成功從備份還原 hosts 文件: {backup_path} -> {HOSTS_PATH}")
                messagebox.showinfo("成功", "還原成功!", parent=backup_window)
                backup_window.destroy()
            except Exception as e:
                logging.exception(f"從備份還原 hosts 文件失敗: {backup_path} -> {HOSTS_PATH}")
                messagebox.showerror("錯誤", f"還原失敗: {e}", parent=backup_window)

        def delete_selected_backup():
            sel = backup_listbox.curselection()
            if not sel:
                messagebox.showwarning("提示", "請先選擇一個備份文件!", parent=backup_window)
                return
            backup_file = backup_listbox.get(sel[0])
            backup_path = os.path.join(BACKUP_DIR, backup_file)
            if messagebox.askyesno("確認(rèn)", f"確定要刪除備份文件 '{backup_file}' 嗎?", parent=backup_window):
                try:
                    os.remove(backup_path)
                    logging.info(f"成功刪除備份文件: {backup_path}")
                    messagebox.showinfo("成功", "備份文件已刪除!", parent=backup_window)
                    refresh_list()
                except Exception as e:
                    logging.exception(f"刪除備份文件失敗: {backup_path}")
                    messagebox.showerror("錯誤", f"刪除失敗: {e}", parent=backup_window)

        # 按鈕區(qū)域
        button_frame_backup = tk.Frame(backup_window, bg="#f0f0f0")
        button_frame_backup.pack(pady=(0, 10), fill="x", padx=10)

        restore_button = tk.Button(button_frame_backup, text="還原選中備份", command=restore_selected_backup, bg="#4CAF50", fg="white", relief="flat", font=("Segoe UI", 10, "bold"))
        restore_button.pack(side="left", padx=5)

        delete_button = tk.Button(button_frame_backup, text="刪除選中備份", command=delete_selected_backup, bg="#f44336", fg="white", relief="flat", font=("Segoe UI", 10, "bold"))
        delete_button.pack(side="left", padx=5)

        refresh_button = tk.Button(button_frame_backup, text="刷新列表", command=refresh_list, bg="#2196F3", fg="white", relief="flat", font=("Segoe UI", 10, "bold"))
        refresh_button.pack(side="right", padx=5)

        refresh_list()
        backup_window.mainloop()

    def switch_hosts(self):
        file_path = filedialog.askopenfilename(
            title="選擇hosts配置",
            filetypes=[("hosts文件", "*.bak;*.txt;*.hosts;*.*")],
            initialdir=BACKUP_DIR,
        )
        if file_path:
            try:
                shutil.copy(file_path, HOSTS_PATH)
                self.load_hosts()
                logging.info(f"成功切換 hosts 文件: {file_path} -> {HOSTS_PATH}")
                messagebox.showinfo("成功", "切換成功!")
            except Exception as e:
                logging.exception(f"切換 hosts 文件失敗: {file_path} -> {HOSTS_PATH}")
                messagebox.showerror("錯誤", f"切換失敗: {e}")
        else:
            logging.info("取消切換 hosts 文件")

    def set_dns(self):
        import subprocess
        from tkinter import simpledialog

        dns = simpledialog.askstring(
            "DNS設(shè)置", "請輸入新的DNS服務(wù)器地址(如8.8.8.8):", parent=self.root
        )
        if dns:
            try:
                result = subprocess.check_output(
                    "wmic nic where (NetEnabled=true) get NetConnectionID",
                    shell=True,
                    encoding="gbk",
                    stderr=subprocess.STDOUT
                )
                adapters = [
                    line.strip()
                    for line in result.splitlines()
                    if line.strip() and "NetConnectionID" not in line
                ]
                if not adapters:
                    logging.error("未檢測到可用的網(wǎng)絡(luò)適配器")
                    messagebox.showerror("錯誤", "未檢測到可用的網(wǎng)絡(luò)適配器!")
                    return
                adapter = adapters[0]
                cmd = f'netsh interface ip set dns name="{adapter}" static {dns}'
                logging.info(f"嘗試設(shè)置 DNS: {cmd}")
                subprocess.check_call(cmd, shell=True)
                logging.info(f"成功設(shè)置 DNS 為 {dns} (適配器: {adapter})")
                messagebox.showinfo("成功", f"DNS已設(shè)置為: {dns}\n(適配器: {adapter})")
            except subprocess.CalledProcessError as e:
                logging.exception(f"設(shè)置 DNS 命令執(zhí)行失敗: {cmd}\n輸出: {e.output}")
                messagebox.showerror("錯誤", f"設(shè)置DNS失敗: {e}\n請檢查是否以管理員權(quán)限運行")
            except Exception as e:
                logging.exception(f"設(shè)置 DNS 失敗")
                messagebox.showerror("錯誤", f"設(shè)置DNS失敗: {e}")
        else:
            logging.info("取消設(shè)置 DNS")

    def open_network_settings(self):
        import subprocess
        try:
            logging.info("嘗試打開網(wǎng)絡(luò)連接設(shè)置")
            subprocess.Popen("control.exe ncpa.cpl", shell=True)
        except Exception as e:
            logging.exception("打開網(wǎng)絡(luò)連接設(shè)置失敗")
            messagebox.showerror("錯誤", f"無法打開網(wǎng)絡(luò)配置頁面: {e}")
            
    def accelerate_github(self):
        """一鍵加速GitHub訪問"""
        github_hosts = """
# GitHub Start
140.82.112.3 github.com
140.82.112.4 gist.github.com
140.82.113.4 api.github.com
140.82.114.4 assets-cdn.github.com
140.82.112.5 raw.githubusercontent.com
140.82.113.5 user-images.githubusercontent.com
140.82.114.5 favicons.githubusercontent.com
140.82.112.6 avatars.githubusercontent.com
140.82.113.6 avatars0.githubusercontent.com
140.82.114.6 avatars1.githubusercontent.com
140.82.112.7 avatars2.githubusercontent.com
140.82.113.7 avatars3.githubusercontent.com
140.82.114.7 avatars4.githubusercontent.com
140.82.112.8 avatars5.githubusercontent.com
# GitHub End
"""
        try:
            with open(HOSTS_PATH, "r", encoding="utf-8") as f:
                current_content = f.read()
            if "# GitHub Start" in current_content:
                logging.warning("GitHub hosts 已存在,跳過添加")
                messagebox.showwarning("提示", "GitHub加速配置似乎已存在,無需重復(fù)添加。")
                return

            with open(HOSTS_PATH, "a", encoding="utf-8") as f:
                f.write("\n" + github_hosts)
            self.load_hosts()
            logging.info("成功應(yīng)用 GitHub 加速 hosts")
            messagebox.showinfo("成功", "GitHub加速已應(yīng)用!")
        except Exception as e:
            logging.exception("應(yīng)用 GitHub 加速 hosts 失敗")
            messagebox.showerror("錯誤", f"加速GitHub失敗: {e}")
            
    def validate_hosts(self, content):
        import re
        pattern = r"^(\s*$|#.*|# ---.*|(\d{1,3}\.){3}\d{1,3}\s+\S+)?$"
        return all(re.match(pattern, line.strip()) for line in content.split("\n") if line.strip())


def main():
    root = tk.Tk()
    root.protocol('WM_DELETE_WINDOW', root.destroy)
    app = HostsManagerApp(root)
    root.mainloop()


if __name__ == "__main__":
    try:
        main()
    except Exception as e:
        logging.critical("應(yīng)用程序發(fā)生未捕獲的嚴(yán)重錯誤", exc_info=True)
        messagebox.showerror("嚴(yán)重錯誤", f"應(yīng)用程序遇到嚴(yán)重問題,請查看日志文件獲取詳細(xì)信息:\n{log_filename}\n\n錯誤: {e}")

互動提問

  • 你在Hosts管理中還遇到哪些痛點?
  • 希望增加哪些新功能?
  • 對UI設(shè)計有何改進(jìn)建議?

到此這篇關(guān)于Python+Tkinter實現(xiàn)Windows Hosts文件編輯管理工具的文章就介紹到這了,更多相關(guān)Python Windows Hosts文件管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文教你用Python中progress庫實現(xiàn)進(jìn)度條

    一文教你用Python中progress庫實現(xiàn)進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了如何通過Python中的progress庫實現(xiàn)進(jìn)度條的繪制,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • Python隨機(jī)采樣及概率分布(二)

    Python隨機(jī)采樣及概率分布(二)

    之前的《Python中的隨機(jī)采樣和概率分布我們介紹了Python中最簡單的隨機(jī)采樣函數(shù)。接下來我們更進(jìn)一步,來看看如何從一個概率分布中采樣,我們以幾個機(jī)器學(xué)習(xí)中最常用的概率分布為例。
    2022-01-01
  • python語言中pandas字符串分割str.split()函數(shù)

    python語言中pandas字符串分割str.split()函數(shù)

    分列在我們?nèi)粘9ぷ髦薪?jīng)常用到,從各種系統(tǒng)中導(dǎo)出的什么訂單號、名稱、日期很多都是復(fù)合組成的,這些列在匹配、合并時沒有辦法使用,我們經(jīng)常需要將她們分開,下面這篇文章主要給大家介紹了關(guān)于python語言中pandas字符串分割str.split()函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 從運行效率與開發(fā)效率比較Python和C++

    從運行效率與開發(fā)效率比較Python和C++

    今天小編就為大家分享一篇關(guān)于從運行效率與開發(fā)效率比較Python和C++,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Python操作RabbitMQ服務(wù)器實現(xiàn)消息隊列的路由功能

    Python操作RabbitMQ服務(wù)器實現(xiàn)消息隊列的路由功能

    RabbitMQ是一個消息隊列服務(wù)器,這里我們針對Python+Pika+RabbitMQ的服務(wù)器端環(huán)境,來看一下如何使用Python操作RabbitMQ服務(wù)器實現(xiàn)消息隊列的路由功能
    2016-06-06
  • python列表生成式與列表生成器的使用

    python列表生成式與列表生成器的使用

    本篇文章主要介紹了python列表生成式與列表生成器的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Python 私有屬性和私有方法應(yīng)用場景分析

    Python 私有屬性和私有方法應(yīng)用場景分析

    這篇文章主要介紹了Python 私有屬性和私有方法應(yīng)用場景分析,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • python使用pandas按照行數(shù)分割表格

    python使用pandas按照行數(shù)分割表格

    本文主要介紹了python使用pandas按照行數(shù)分割表格,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Python 正則表達(dá)式(轉(zhuǎn)義問題)

    Python 正則表達(dá)式(轉(zhuǎn)義問題)

    這篇文章主要介紹了Python 正則表達(dá)式(轉(zhuǎn)義問題),需要的朋友可以參考下
    2014-12-12
  • Pycharm下載pyinstaller報錯:You?should?consider?upgrading?via?the?'python?-m?pip?install?--upgrade?pip'?command的解決方法

    Pycharm下載pyinstaller報錯:You?should?consider?upgrading?via

    這篇文章主要給大家介紹了關(guān)于Pycharm下載pyinstaller報錯:You?should?consider?upgrading?via?the?'python?-m?pip?install?--upgrade?pip'?command的解決方法,需要的朋友可以參考下
    2022-02-02

最新評論