diff --git a/common_funcs.py b/common_funcs.py new file mode 100644 index 0000000000000000000000000000000000000000..cd2ba946068380fd2b70a3171a697d31cf86b432 --- /dev/null +++ b/common_funcs.py @@ -0,0 +1,9 @@ + +def get_split_path(full_path) -> list: + ''' + 通用函数: + 将完整路径按照斜杠拆分,得到每个文件夹到文件名的列表。 + ''' + test_str = full_path.replace('\\', '/', -1) + test_str_res = test_str.split('/') + return (test_str_res) diff --git a/my_gui_adds.py b/my_gui_adds.py new file mode 100644 index 0000000000000000000000000000000000000000..f694fdd04ca7617ef0b5cd2535037dec9b1e2ca8 --- /dev/null +++ b/my_gui_adds.py @@ -0,0 +1,208 @@ +import tkinter as tk +from tkinter import ttk + +LOGO_PATH = './src/LOGO.ico' +LARGE_FONT = 10 # 表头字号 +MON_FONTSIZE = 9 # 正文字号 + + +class my_progress_window: + ''' + 一个出现在主窗口中间的进度条 + ''' + + # input_window = '' # =tk.Toplevel(self.form0) + + def __init__(self, parent, prog_value=0, prog_text='') -> None: + ''' + 进度条,输入进度数值 + ''' + + # 变量设置 + self.form0 = parent + + self.input_value = '' + self.input_window = tk.Toplevel(self.form0) + print('———————————— 进度条激活 ——————————') + self.input_window.title('进度') + self.my_prog = tk.DoubleVar() # 进度 + self.my_text = prog_text + self.my_prog.set(prog_value) + # + # 窗口设置 + self.input_window.overrideredirect(True) # 这句话可以去掉标题栏,同时也会没有阴影 + self.w_width = 800 + self.w_height = 100 + # + # 屏幕中央: + # self.screenwidth = SCREEN_WIDTH + # self.screenheight = SCREEN_HEIGHT + # self.x_pos = (self.screenwidth - self.w_width) / 2 + # self.y_pos = (self.screenheight - self.w_height) / 2 + # + # 主窗口中央: + self.x_pos=self.form0.winfo_x()+(self.form0.winfo_width()-self.w_width)/2 + self.y_pos=self.form0.winfo_y()+(self.form0.winfo_height()-self.w_height)/2 + + self.input_window.geometry('%dx%d+%d+%d' % (self.w_width, self.w_height, self.x_pos, self.y_pos)) + # self.input_window.title(self.title) + self.input_window.transient(self.form0) # 避免在任务栏出现第二个窗口,而且可以实现置顶 + self.input_window.withdraw() + + try: + self.input_window.iconbitmap(LOGO_PATH) # 左上角图标 + except: + pass + + self.iframe = tk.Frame(self.input_window, padx=20, pady=20) + self.iframe.pack(expand=0, fill=tk.BOTH) + # 标签 + self.pct = tk.Label(self.iframe) + self.pct.pack() + # 进度条 + self.prog_bar = ttk.Progressbar(self.iframe, variable=self.my_prog) + self.prog_bar.pack(expand=0, fill=tk.BOTH) + # + self.prog_bar.bind('<1>',self.force_close) + + def force_close(self,event=None): + self.input_window.destroy() + + def set(self, value): + self.progress = value + self.my_prog.set(self.progress) + self.pct.configure(text=self.my_text + str(int(value)) + '%') + self.input_window.update() + # self.pct.update() + # self.prog_bar.update() + if value == 0: + self.input_window.withdraw() + elif value > 0: + self.input_window.deiconify() # 置顶 + # self.input_window.lift() # 置顶,但是会导致后面失去输入能力 + # self.input_window.focus_force() + + self.input_window.grab_set() # 模态 + + if value >= 100: + self.input_window.withdraw() + # self.input_window.overrideredirect(False) + self.input_window.destroy() + self.__destroy__() + + +# 自制输入窗体 +class my_input_window: + ''' + 输入窗体类。 + 实现了一个居中的模态窗体。 + ''' + input_value = '' + + def __init__(self, parent, title='未命名', msg='未定义', default_value='', selection_range=None) -> None: + ''' + 自制输入窗体的初始化; + 参数: + selection_range 是默认选中的范围。 + ''' + + # 变量设置 + self.form0 = parent # 父窗格 + # + self.input_value = '' + self.title = title + self.msg = msg + self.default_value = default_value + self.input_window = tk.Toplevel(self.form0) + # + self.input_window.transient(self.form0) # 避免在任务栏出现第二个窗口,而且可以实现置顶 + self.input_window.grab_set() # 模态 + + # + # 窗口设置 + # self.input_window.overrideredirect(True) # 这句话可以去掉标题栏,同时也会没有阴影 + self.w_width = 800 + self.w_height = 160 + # + # 屏幕中央: + # self.screenwidth = SCREEN_WIDTH + # self.screenheight = SCREEN_HEIGHT + # self.x_pos = (self.screenwidth - self.w_width) / 2 + # self.y_pos = (self.screenheight - self.w_height) / 2 + # + # 主窗口中央: + self.x_pos=self.form0.winfo_x()+(self.form0.winfo_width()-self.w_width)/2 + self.y_pos=self.form0.winfo_y()+(self.form0.winfo_height()-self.w_height)/2 + + self.input_window.geometry('%dx%d+%d+%d' % (self.w_width, self.w_height, self.x_pos, self.y_pos)) + self.input_window.title(self.title) + # + + try: + self.input_window.iconbitmap(LOGO_PATH) # 左上角图标 + except: + pass + + self.iframe = tk.Frame(self.input_window, padx=20, pady=10) + self.iframe.pack(expand=0, fill=tk.BOTH) + + # 文本框 + self.lb = tk.Label(self.iframe, text=self.msg, font="微软雅黑 " + str(MON_FONTSIZE)) + self.lb.pack(anchor='sw', pady=5) + self.input_window.update() + + # 输入框 + self.et = tk.Entry(self.iframe, font="微软雅黑 " + str(MON_FONTSIZE)) + self.et.insert(0, self.default_value) + self.et.pack(expand=0, fill=tk.X, pady=5) + + # self.et.selection_range(0, len(self.et.get())) + if selection_range is None: + self.et.selection_range(0, len(self.et.get())) + else: + self.et.selection_range(0, selection_range) + self.et.focus() # 获得焦点 + + # self.et.focus() + # 键盘快捷键 + self.input_window.bind_all('', self.bt_yes_click) + self.input_window.bind_all('', self.bt_cancel_click) + + self.iframe_bt = tk.Frame(self.input_window, padx=10, pady=10) + self.iframe_bt.pack() + # self.iframe_bt.pack(expand=0,fill=tk.BOTH) + # 按钮 + self.bty = ttk.Button(self.iframe_bt, text='确定', command=self.bt_yes_click) + self.bty.pack(side=tk.LEFT, padx=20) + self.btc = ttk.Button(self.iframe_bt, text='取消', command=self.bt_cancel_click) + self.btc.pack(side=tk.LEFT, padx=20) + + self.input_window.deiconify() + self.input_window.lift() + self.input_window.focus_force() + + self.form0.wait_window(self.input_window) # 要用这句话拦截主窗体的代码运行 + + def bt_cancel_click(self, event=None): + self.input_window.unbind_all('') + self.input_window.unbind_all('') + self.input_window.destroy() + + def bt_yes_click(self, event=None) -> str: + self.input_window.unbind_all('') + self.input_window.unbind_all('') + try: + self.input_value = self.et.get() # + except Exception as e: + print(e) + # print(self.input_value) + self.input_window.destroy() + return self.input_value + + def __str__(self) -> str: + return self.input_value + + def __del__(self) -> str: + self.input_value = '' + # self.input_window.destroy() + return '' diff --git "a/\346\240\207\347\255\276\346\226\207\345\272\223.py" "b/\346\240\207\347\255\276\346\226\207\345\272\223.py" index 40a5b7d12ee2c67b90c36cb200cbee64a1799b80..25a7f01b57fadca5ad4e6870862a3ee852df1c82 100644 --- "a/\346\240\207\347\255\276\346\226\207\345\272\223.py" +++ "b/\346\240\207\347\255\276\346\226\207\345\272\223.py" @@ -31,6 +31,9 @@ from win32com.shell import shell,shellcon import shutil import queue +from my_gui_adds import my_progress_window,my_input_window +from common_funcs import * + # import my_logger # import send2trash # 回收站(目前作废) @@ -38,10 +41,12 @@ URL_HELP = 'https://gitee.com/horse_sword/my-local-library' # 帮助的超链 URL_ADV = 'https://gitee.com/horse_sword/my-local-library/issues' # 提建议的位置 URL_CHK_UPDATE = 'https://gitee.com/horse_sword/my-local-library/releases' # 检查更新的位置 TAR = 'Tagdox / 标签文库' # 程序名称 -VER = 'v0.19.0.4' # 版本号 +VER = 'v0.19.0.5 beta' # 版本号 ''' ## 近期更新说明 +#### v0.19.0.5 2021年9月5日 +代码拆分成多个文件,首先拆分进度条和弹窗类。 #### v0.19.0.4 2021年9月5日 修复初始化时定位文件夹错误的bug。 #### v0.19.0.3 2021年9月5日 @@ -122,7 +127,8 @@ OPT_DEFAULT = { # %% ####################################################################### -def get_split_path(full_path) -> list: + +def get_split_path_XXX(full_path) -> list: ''' 通用函数: 将完整路径按照斜杠拆分,得到每个文件夹到文件名的列表。 @@ -1072,7 +1078,7 @@ def show_window_info(): # 自制输入窗体 -class my_input_window: +class my_input_window_XXX: ''' 输入窗体类。 实现了一个居中的模态窗体。 @@ -1188,16 +1194,16 @@ class my_input_window: return '' -class my_progress_window: +class my_progress_window_XXX: ''' - 一个出现在主窗口中间的进度条 + # 一个出现在主窗口中间的进度条 ''' # input_window = '' # =tk.Toplevel(self.form0) def __init__(self, parent, prog_value=0, prog_text='') -> None: ''' - 进度条,输入进度数值 + # 进度条,输入进度数值 ''' # 变量设置