import tkinter as tk
from tkinter import filedialog
import sys
import threading
import random
class StdoutRedirector:
def __init__(self, textbox):
self.textbox = textbox
def write(self, message):
self.textbox.insert("end", message)
def flush(self):
pass
class DirectorySelectionApp:
def __init__(self, master):
self.master = master
master.title("upgrade")
# 创建一个Frame用于包裹所有组件
self.frame = tk.Frame(master)
self.frame.pack(padx=10, pady=5, fill="both", expand=True)
# 创建左边的LabelFrame"设备信息"
self.labelframe1 = tk.LabelFrame(self.frame, text="设备信息")
self.labelframe1.pack(side="left", padx=10, pady=5, fill="both", expand=True)
self.labelframe1.columnconfigure(index=0, weight=1)
self.labelframe1.columnconfigure(index=1, weight=1)
self.labelframe1.columnconfigure(index=2, weight=1)
# 创建刷新按钮
self.refresh_button = tk.Button(self.labelframe1, text="刷新", width=8, command=self.refresh_checkbuttons)
self.refresh_button.grid(row=0, column=0, padx=5, pady=5, sticky="w")
# 创建全选按钮
self.select_all_button = tk.Button(self.labelframe1, text="全选", width=8, command=self.select_all_checkbuttons)
self.select_all_button.grid(row=0, column=1, padx=5, pady=5, sticky="w")
# 创建全不选按钮
self.deselect_all_button = tk.Button(self.labelframe1, text="全不选", width=8,
command=self.deselect_all_checkbuttons)
self.deselect_all_button.grid(row=0, column=2, padx=5, pady=5, sticky="w")
# 创建随机数量的Checkbutton
self.checkbuttons = []
self.refresh_checkbuttons()
# 创建右边的LabelFrame"升级参数"
self.labelframe2 = tk.LabelFrame(self.frame, text="升级参数")
self.labelframe2.pack(side="left", padx=10, pady=5, fill="both", expand=True)
# self.labelframe2.columnconfigure(index=0, weight=1)
self.labelframe2.columnconfigure(index=1, weight=4)
# 第一行:按钮和标签
# 创建选择大包路径的按钮
self.button_1 = tk.Button(self.labelframe2, text="大包路径", width=10, command=self.choose_directory)
self.button_1.grid(row=0, column=0, padx=10, pady=5, sticky="w")
# 创建选择root包路径的按钮
self.button_2 = tk.Button(self.labelframe2, text="root包路径", width=10, command=self.choose_root_directory)
self.button_2.grid(row=1, column=0, padx=10, pady=5, sticky="w")
# 创建用于显示大包路径的标签,初始文本为"eg:d:\limages\odex"
self.label_1 = tk.Label(self.labelframe2, text="eg:d:\\limages\\odex")
self.label_1.grid(row=0, column=1, sticky="w")
# 创建用于显示root包路径的标签,初始文本为"eg:d:\limages\root"
self.root_label = tk.Label(self.labelframe2, text="eg:d:\\limages\\root")
self.root_label.grid(row=1, column=1, sticky="w")
# 创建升级按钮
self.button_3 = tk.Button(self.labelframe2, text="升级", width=5, command=self.upgrade)
self.button_3.grid(row=0, column=2, rowspan=2, padx=10, pady=5, sticky="nsew")
# 创建文本框
self.textbox = tk.Text(self.labelframe2)
self.textbox.grid(row=2, column=0, columnspan=3, padx=10, pady=5, sticky="nsew")
# 重定向控制台输出到文本框
self.redirect_stdout_to_textbox()
def choose_directory(self):
"""选择大包路径的函数"""
threading.Thread(target=self.select_directory_worker).start()
def choose_root_directory(self):
"""选择root包路径的函数"""
threading.Thread(target=self.select_root_directory_worker).start()
def select_directory_worker(self):
directory_path = filedialog.askdirectory()
if directory_path:
self.label_1.config(text=directory_path)
def select_root_directory_worker(self):
directory_path = filedialog.askdirectory()
if directory_path:
self.root_label.config(text=directory_path)
def redirect_stdout_to_textbox(self):
"""将控制台输出重定向到文本框的函数"""
sys.stdout = StdoutRedirector(self.textbox)
def refresh_checkbuttons(self):
"""刷新Checkbutton"""
for cb in self.checkbuttons:
cb.destroy()
self.checkbuttons.clear()
num_checkbuttons = random.randint(5, 8)
for i in range(num_checkbuttons):
cb = tk.Checkbutton(self.labelframe1, text=f"选项 {i + 1}")
cb.grid(row=i + 1, column=0, columnspan=3, padx=5, pady=2, sticky="w")
self.checkbuttons.append(cb)
def select_all_checkbuttons(self):
"""全选Checkbutton"""
for cb in self.checkbuttons:
cb.select()
def deselect_all_checkbuttons(self):
"""全不选Checkbutton"""
for cb in self.checkbuttons:
cb.deselect()
def upgrade(self):
print("开始升级")
root = tk.Tk()
app = DirectorySelectionApp(root)
root.mainloop()
01-23
214