改用ttk美化
This commit is contained in:
parent
8d77a2590d
commit
d351c07c18
1 changed files with 53 additions and 47 deletions
98
manage.py
98
manage.py
|
@ -1,12 +1,12 @@
|
||||||
from configparser import ConfigParser
|
from configparser import ConfigParser
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from json import dump, dumps
|
from json import dump, dumps
|
||||||
from subprocess import CREATE_NO_WINDOW, STDOUT, Popen, PIPE
|
from subprocess import STDOUT, Popen, PIPE
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
from queue import Empty, SimpleQueue
|
from queue import Empty, SimpleQueue
|
||||||
from tkinter import *
|
import tkinter as tk
|
||||||
|
import tkinter.ttk as ttk
|
||||||
from tkinter import filedialog
|
from tkinter import filedialog
|
||||||
from tkinter.ttk import *
|
|
||||||
from platform import system
|
from platform import system
|
||||||
|
|
||||||
config = ConfigParser()
|
config = ConfigParser()
|
||||||
|
@ -15,6 +15,9 @@ output_queue = SimpleQueue()
|
||||||
finished = False
|
finished = False
|
||||||
win_os = system() == "Windows"
|
win_os = system() == "Windows"
|
||||||
|
|
||||||
|
if win_os:
|
||||||
|
from subprocess import CREATE_NO_WINDOW
|
||||||
|
|
||||||
|
|
||||||
def check_config_valid(config: ConfigParser, options: dict[str, list[str]]) -> bool:
|
def check_config_valid(config: ConfigParser, options: dict[str, list[str]]) -> bool:
|
||||||
for sec in options:
|
for sec in options:
|
||||||
|
@ -87,7 +90,10 @@ def sync_func(command: list[str]) -> None:
|
||||||
output_queue.put_nowait(f"db.json: {db_log}\n")
|
output_queue.put_nowait(f"db.json: {db_log}\n")
|
||||||
output_queue.put_nowait(f"command: {command}\n")
|
output_queue.put_nowait(f"command: {command}\n")
|
||||||
output_queue.put_nowait("Started lftp...\n")
|
output_queue.put_nowait("Started lftp...\n")
|
||||||
|
if win_os:
|
||||||
proc = Popen(command, stdout=PIPE, stderr=STDOUT, creationflags=CREATE_NO_WINDOW)
|
proc = Popen(command, stdout=PIPE, stderr=STDOUT, creationflags=CREATE_NO_WINDOW)
|
||||||
|
else:
|
||||||
|
proc = Popen(command, stdout=PIPE, stderr=STDOUT)
|
||||||
ret_val = None
|
ret_val = None
|
||||||
while ret_val is None:
|
while ret_val is None:
|
||||||
ret_val = proc.poll()
|
ret_val = proc.poll()
|
||||||
|
@ -102,57 +108,57 @@ def display_output():
|
||||||
try:
|
try:
|
||||||
while True:
|
while True:
|
||||||
line = output_queue.get_nowait()
|
line = output_queue.get_nowait()
|
||||||
lftp_output.insert(END, line)
|
lftp_output.insert(tk.END, line)
|
||||||
except Empty:
|
except Empty:
|
||||||
pass
|
pass
|
||||||
lftp_output.see(END)
|
lftp_output.see(tk.END)
|
||||||
if not finished:
|
if not finished:
|
||||||
root.after(200, display_output)
|
root.after(200, display_output)
|
||||||
|
|
||||||
|
|
||||||
def sync_all_files(_: Event) -> None:
|
def sync_all_files(_: tk.Event) -> None:
|
||||||
get_config()
|
get_config()
|
||||||
lftp_output.delete("1.0", END)
|
lftp_output.delete("1.0", tk.END)
|
||||||
Thread(target=sync_func, args=(sync_all_command(),), daemon=True).start()
|
Thread(target=sync_func, args=(sync_all_command(),), daemon=True).start()
|
||||||
root.after(200, display_output)
|
root.after(200, display_output)
|
||||||
|
|
||||||
|
|
||||||
def sync_pdf_files(_: Event) -> None:
|
def sync_pdf_files(_: tk.Event) -> None:
|
||||||
get_config()
|
get_config()
|
||||||
lftp_output.delete("1.0", END)
|
lftp_output.delete("1.0", tk.END)
|
||||||
Thread(target=sync_func, args=(sync_pdf_command(),), daemon=True).start()
|
Thread(target=sync_func, args=(sync_pdf_command(),), daemon=True).start()
|
||||||
root.after(200, display_output)
|
root.after(200, display_output)
|
||||||
|
|
||||||
|
|
||||||
def select_lftp(_: Event) -> None:
|
def select_lftp(_: tk.Event) -> None:
|
||||||
file_path = filedialog.askopenfilename()
|
file_path = filedialog.askopenfilename()
|
||||||
config["ftp"]["lftp"] = file_path
|
config["ftp"]["lftp"] = file_path
|
||||||
lftp_entry.delete(0, END)
|
lftp_entry.delete(0, tk.END)
|
||||||
lftp_entry.insert(0, file_path)
|
lftp_entry.insert(0, file_path)
|
||||||
|
|
||||||
|
|
||||||
def select_local(_: Event) -> None:
|
def select_local(_: tk.Event) -> None:
|
||||||
file_path = filedialog.askdirectory()
|
file_path = filedialog.askdirectory()
|
||||||
config["file"]["local"] = file_path
|
config["file"]["local"] = file_path
|
||||||
local_entry.delete(0, END)
|
local_entry.delete(0, tk.END)
|
||||||
local_entry.insert(0, file_path)
|
local_entry.insert(0, file_path)
|
||||||
|
|
||||||
|
|
||||||
def load_config(_: Event) -> None:
|
def load_config(_: tk.Event) -> None:
|
||||||
config.read("config.ini")
|
config.read("config.ini")
|
||||||
if not check_config_valid(config, options):
|
if not check_config_valid(config, options):
|
||||||
set_default_config(config, options)
|
set_default_config(config, options)
|
||||||
host_entry.delete(0, END)
|
host_entry.delete(0, tk.END)
|
||||||
host_entry.insert(0, config["ftp"]["host"])
|
host_entry.insert(0, config["ftp"]["host"])
|
||||||
user_entry.delete(0, END)
|
user_entry.delete(0, tk.END)
|
||||||
user_entry.insert(0, config["ftp"]["user"])
|
user_entry.insert(0, config["ftp"]["user"])
|
||||||
pass_entry.delete(0, END)
|
pass_entry.delete(0, tk.END)
|
||||||
pass_entry.insert(0, config["ftp"]["pass"])
|
pass_entry.insert(0, config["ftp"]["pass"])
|
||||||
lftp_entry.delete(0, END)
|
lftp_entry.delete(0, tk.END)
|
||||||
lftp_entry.insert(0, config["ftp"]["lftp"])
|
lftp_entry.insert(0, config["ftp"]["lftp"])
|
||||||
local_entry.delete(0, END)
|
local_entry.delete(0, tk.END)
|
||||||
local_entry.insert(0, config["file"]["local"])
|
local_entry.insert(0, config["file"]["local"])
|
||||||
remote_entry.delete(0, END)
|
remote_entry.delete(0, tk.END)
|
||||||
remote_entry.insert(0, config["file"]["remote"])
|
remote_entry.insert(0, config["file"]["remote"])
|
||||||
|
|
||||||
|
|
||||||
|
@ -165,7 +171,7 @@ def get_config() -> None:
|
||||||
config["file"]["remote"] = remote_entry.get()
|
config["file"]["remote"] = remote_entry.get()
|
||||||
|
|
||||||
|
|
||||||
def save_config(_: Event) -> None:
|
def save_config(_: tk.Event) -> None:
|
||||||
get_config()
|
get_config()
|
||||||
with open("config.ini", "w") as f:
|
with open("config.ini", "w") as f:
|
||||||
config.write(f)
|
config.write(f)
|
||||||
|
@ -175,74 +181,74 @@ config.read("config.ini")
|
||||||
if not check_config_valid(config, options):
|
if not check_config_valid(config, options):
|
||||||
set_default_config(config, options)
|
set_default_config(config, options)
|
||||||
|
|
||||||
root = Tk()
|
root = tk.Tk()
|
||||||
|
|
||||||
ftp_frm = Frame(root, border=1)
|
ftp_frm = ttk.Frame(root, border=1)
|
||||||
ftp_frm.grid(row=0, column=0, pady=10, padx=10)
|
ftp_frm.grid(row=0, column=0, pady=10, padx=10)
|
||||||
|
|
||||||
Label(ftp_frm, text="FTP Settings").grid(row=0, column=0, columnspan=3)
|
ttk.Label(ftp_frm, text="FTP Settings").grid(row=0, column=0, columnspan=3)
|
||||||
|
|
||||||
Label(ftp_frm, text="Hostname", width=10).grid(row=1, column=0)
|
ttk.Label(ftp_frm, text="Hostname", width=10).grid(row=1, column=0)
|
||||||
host_entry = Entry(ftp_frm, width=40)
|
host_entry = ttk.Entry(ftp_frm, width=40)
|
||||||
host_entry.insert(0, config["ftp"]["host"])
|
host_entry.insert(0, config["ftp"]["host"])
|
||||||
host_entry.grid(row=1, column=1, columnspan=2)
|
host_entry.grid(row=1, column=1, columnspan=2)
|
||||||
|
|
||||||
Label(ftp_frm, text="Username", width=10).grid(row=2, column=0)
|
ttk.Label(ftp_frm, text="Username", width=10).grid(row=2, column=0)
|
||||||
user_entry = Entry(ftp_frm, width=40)
|
user_entry = ttk.Entry(ftp_frm, width=40)
|
||||||
user_entry.insert(0, config["ftp"]["user"])
|
user_entry.insert(0, config["ftp"]["user"])
|
||||||
user_entry.grid(row=2, column=1, columnspan=2)
|
user_entry.grid(row=2, column=1, columnspan=2)
|
||||||
|
|
||||||
Label(ftp_frm, text="Password", width=10).grid(row=3, column=0)
|
ttk.Label(ftp_frm, text="Password", width=10).grid(row=3, column=0)
|
||||||
pass_entry = Entry(ftp_frm, width=40, show="*")
|
pass_entry = ttk.Entry(ftp_frm, width=40, show="*")
|
||||||
pass_entry.insert(0, config["ftp"]["pass"])
|
pass_entry.insert(0, config["ftp"]["pass"])
|
||||||
pass_entry.grid(row=3, column=1, columnspan=2)
|
pass_entry.grid(row=3, column=1, columnspan=2)
|
||||||
|
|
||||||
Label(ftp_frm, text="lftp Path", width=10).grid(row=4, column=0)
|
ttk.Label(ftp_frm, text="lftp Path", width=10).grid(row=4, column=0)
|
||||||
lftp_entry = Entry(ftp_frm, width=29)
|
lftp_entry = ttk.Entry(ftp_frm, width=29)
|
||||||
lftp_entry.insert(0, config["ftp"]["lftp"])
|
lftp_entry.insert(0, config["ftp"]["lftp"])
|
||||||
lftp_entry.grid(row=4, column=1)
|
lftp_entry.grid(row=4, column=1)
|
||||||
lftp_select_btn = Button(ftp_frm, text="Select...", width=10)
|
lftp_select_btn = ttk.Button(ftp_frm, text="Select...", width=10)
|
||||||
lftp_select_btn.grid(row=4, column=2)
|
lftp_select_btn.grid(row=4, column=2)
|
||||||
lftp_select_btn.bind("<Button-1>", select_lftp)
|
lftp_select_btn.bind("<Button-1>", select_lftp)
|
||||||
|
|
||||||
file_frm = Frame(root)
|
file_frm = ttk.Frame(root)
|
||||||
file_frm.grid(row=1, column=0, pady=10, padx=10)
|
file_frm.grid(row=1, column=0, pady=10, padx=10)
|
||||||
|
|
||||||
Label(file_frm, text="File Path Settings").grid(row=0, column=0, columnspan=3)
|
ttk.Label(file_frm, text="File Path Settings").grid(row=0, column=0, columnspan=3)
|
||||||
|
|
||||||
Label(file_frm, text="Local Path", width=12).grid(row=1, column=0)
|
ttk.Label(file_frm, text="Local Path", width=12).grid(row=1, column=0)
|
||||||
local_entry = Entry(file_frm, width=27)
|
local_entry = ttk.Entry(file_frm, width=27)
|
||||||
local_entry.insert(0, config["file"]["local"])
|
local_entry.insert(0, config["file"]["local"])
|
||||||
local_entry.grid(row=1, column=1)
|
local_entry.grid(row=1, column=1)
|
||||||
local_select_btn = Button(file_frm, text="Select...", width=10)
|
local_select_btn = ttk.Button(file_frm, text="Select...", width=10)
|
||||||
local_select_btn.grid(row=1, column=2)
|
local_select_btn.grid(row=1, column=2)
|
||||||
local_select_btn.bind("<Button-1>", select_local)
|
local_select_btn.bind("<Button-1>", select_local)
|
||||||
|
|
||||||
Label(file_frm, text="Remote Path", width=12).grid(row=2, column=0)
|
ttk.Label(file_frm, text="Remote Path", width=12).grid(row=2, column=0)
|
||||||
remote_entry = Entry(file_frm, width=38)
|
remote_entry = ttk.Entry(file_frm, width=38)
|
||||||
remote_entry.insert(0, config["file"]["remote"])
|
remote_entry.insert(0, config["file"]["remote"])
|
||||||
remote_entry.grid(row=2, column=1, columnspan=2)
|
remote_entry.grid(row=2, column=1, columnspan=2)
|
||||||
|
|
||||||
actions_frm = Frame(root)
|
actions_frm = ttk.Frame(root)
|
||||||
actions_frm.grid(row=2, column=0, pady=10, padx=10)
|
actions_frm.grid(row=2, column=0, pady=10, padx=10)
|
||||||
|
|
||||||
load_btn = Button(actions_frm, text="Load Config", width=12)
|
load_btn = ttk.Button(actions_frm, text="Load Config", width=12)
|
||||||
load_btn.grid(row=0, column=0)
|
load_btn.grid(row=0, column=0)
|
||||||
load_btn.bind("<Button-1>", load_config)
|
load_btn.bind("<Button-1>", load_config)
|
||||||
|
|
||||||
save_btn = Button(actions_frm, text="Save Config", width=12)
|
save_btn = ttk.Button(actions_frm, text="Save Config", width=12)
|
||||||
save_btn.grid(row=0, column=1)
|
save_btn.grid(row=0, column=1)
|
||||||
save_btn.bind("<Button-1>", save_config)
|
save_btn.bind("<Button-1>", save_config)
|
||||||
|
|
||||||
sync_all_btn = Button(actions_frm, text="Sync all Files", width=12)
|
sync_all_btn = ttk.Button(actions_frm, text="Sync all Files", width=12)
|
||||||
sync_all_btn.grid(row=0, column=2)
|
sync_all_btn.grid(row=0, column=2)
|
||||||
sync_all_btn.bind("<Button-1>", sync_all_files)
|
sync_all_btn.bind("<Button-1>", sync_all_files)
|
||||||
|
|
||||||
sync_pdf_btn = Button(actions_frm, text="Sync PDF Files", width=12)
|
sync_pdf_btn = ttk.Button(actions_frm, text="Sync PDF Files", width=12)
|
||||||
sync_pdf_btn.grid(row=0, column=3)
|
sync_pdf_btn.grid(row=0, column=3)
|
||||||
sync_pdf_btn.bind("<Button-1>", sync_pdf_files)
|
sync_pdf_btn.bind("<Button-1>", sync_pdf_files)
|
||||||
|
|
||||||
lftp_output = Text(actions_frm, width=53, height=12)
|
lftp_output = tk.Text(actions_frm, width=53, height=12)
|
||||||
lftp_output.grid(row=1, column=0, columnspan=4)
|
lftp_output.grid(row=1, column=0, columnspan=4)
|
||||||
|
|
||||||
root.mainloop()
|
root.mainloop()
|
||||||
|
|
Loading…
Reference in a new issue