Skip to content

Commit

Permalink
补充“从不弹出”模式
Browse files Browse the repository at this point in the history
  • Loading branch information
hiroi-sora committed Nov 4, 2022
1 parent cda77b0 commit 0ccb997
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 8 deletions.
2 changes: 1 addition & 1 deletion ui/tray.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def stop(self):
self.tray = None # 将引用置空,主窗口第二次按下关闭时可强行关闭

def showWin(self, e=None):
self.main.gotoTop()
self.main.gotoTop(isForce=True)

def screenshot(self, e=None):
self.main.win.event_generate('<<ScreenshotEvent>>')
Expand Down
49 changes: 42 additions & 7 deletions ui/win_main.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from utils.config import Config, Umi, ScsModeFlag # 最先加载配置
from utils.config import Config, Umi, ScsModeFlag, WindowTopModeFlag # 最先加载配置
from utils.logger import GetLog
from utils.asset import * # 资源
from utils.data_structure import KeyList
Expand Down Expand Up @@ -258,15 +258,24 @@ def initTopTips(): # 顶部提示
tipsLab.pack(side='top')
tk.Frame(fTips).pack(side='top') # 空框架,用于自动调整高度的占位

def switchWindowTopLock(): # 切换窗口锁定置顶
def changeWinTopMode(): # 改变窗口置顶【模式】事件
Config.set('isWindowTop',
Config.get('WindowTopMode') == WindowTopModeFlag.eternity)
Config.addTrace('WindowTopMode', changeWinTopMode)
changeWinTopMode() # 初始化

def changeWinTopIS(): # 改变窗口置顶【标志】事件
Config.set('WindowTopMode', # 改变窗口置顶模式
WindowTopModeFlag.eternity if Config.get('isWindowTop') else WindowTopModeFlag.finish)
self.gotoTop()
if Config.get('isWindowTop'): # 切换到置顶
tipsLab.pack(side='top')
else:
tipsLab.pack_forget()
# 不刷新框架,而是在尾部预留空间来容纳高度变化
# self.updateFrameHeight() # 刷新框架
Config.addTrace('isWindowTop', switchWindowTopLock)
Config.addTrace('isWindowTop', changeWinTopIS)
# 以上两个事件互相调用不会造成无限递归,因为配置项被修改同步后,第二次set不会再调用跟踪事件。
initTopTips()

def initSoftwareFrame(): # 软件行为设置
Expand Down Expand Up @@ -332,12 +341,32 @@ def updateTextpanel():
fr2 = tk.Frame(fSoft)
fr2.pack(side='top', fill='x', pady=2, padx=5)
self.balloon.bind(fr2, '不显示系统托盘图标时,关闭面板会退出软件')
tk.Label(fr2, text='  关闭主窗口:').pack(side='left', padx=2)
tk.Label(fr2, text='窗口关闭:').pack(side='left', padx=2)
ttk.Radiobutton(fr2, text='最小化到托盘',
variable=Config.getTK('isBackground'), value=True).pack(side='left')
ttk.Radiobutton(fr2, text='退出软件',
variable=Config.getTK('isBackground'), value=False).pack(side='left', padx=15)

# 弹出方式设置
fr3 = tk.Frame(fSoft)
fr3.pack(side='top', fill='x', pady=2, padx=5)
tk.Label(fr3, text='窗口置顶:').pack(side='left', padx=2)
wid = ttk.Radiobutton(fr3, text='自动弹出',
variable=Config.getTK('WindowTopMode'), value=WindowTopModeFlag.finish)
wid.pack(side='left')
self.balloon.bind(
wid, '当主窗口处于后台,\n唤起快捷识图、或批量任务完成时弹出')
wid = ttk.Radiobutton(fr3, text='始终置顶',
variable=Config.getTK('WindowTopMode'), value=WindowTopModeFlag.eternity)
wid.pack(side='left', padx=5)
self.balloon.bind(
wid, '窗口锁定于系统顶层\n\n启用后,软件内的鼠标悬停提示框会被隐藏')
wid = ttk.Radiobutton(fr3, text='不要弹出',
variable=Config.getTK('WindowTopMode'), value=WindowTopModeFlag.never)
wid.pack(side='left')
self.balloon.bind(
wid, '不会主动弹出窗口')

# 启动方式设置
fr4 = tk.Frame(fSoft)
fr4.pack(side='top', fill='x', pady=2, padx=5)
Expand Down Expand Up @@ -969,15 +998,21 @@ def updateFrameHeight(self): # 刷新设置页框架高度
self.optFrame.pack_propagate(False) # 禁用框架自动宽高调整
self.optFrame["height"] = rH # 手动还原高度

def gotoTop(self): # 主窗置顶
def gotoTop(self, isForce=False): # 主窗置顶
flag = Config.get('WindowTopMode')
if flag == WindowTopModeFlag.never and not isForce: # 模式:从不置顶
self.win.attributes('-topmost', 0)
return
if self.win.state() == 'iconic': # 窗口最小化状态下
self.win.state('normal') # 恢复前台状态
self.win.attributes('-topmost', 1) # 设置层级最前
geometry = self.win.geometry() # 缓存主窗当前位置大小
self.win.deiconify() # 主窗获取焦点
self.win.geometry(geometry) # 若主窗正在贴边,获取焦点会退出贴边模式,所以重新设置位置恢复贴边
if not Config.get('isWindowTop'): # 窗口锁定置顶,则一段时间后解除置顶
self.win.after(500, lambda: self.win.attributes('-topmost', 0))
if flag == WindowTopModeFlag.eternity: # 模式:窗口永远置顶
return
# 模式:自动弹出,一段时间后解除置顶
self.win.after(500, lambda: self.win.attributes('-topmost', 0))

# 进行任务 ===============================================

Expand Down
13 changes: 13 additions & 0 deletions utils/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,14 @@ class ClickTrayModeFlag(Enum):
clipboard = 2 # 粘贴图片


class WindowTopModeFlag():
'''窗口置顶模式标志'''
# 不继承枚举
never = 0 # 永不
finish = 1 # 任务完成时置顶
eternity = 2 # 永远保持置顶


# 配置文件路径
ConfigJsonFile = 'Umi-OCR_config.json'

Expand Down Expand Up @@ -104,6 +112,11 @@ class ClickTrayModeFlag(Enum):
},
'isWindowTop': { # T时窗口置顶
'default': False,
'isSave': False, # 不保存,仅作为标记
'isTK': True,
},
'WindowTopMode': { # 窗口置顶模式
'default': WindowTopModeFlag.finish,
'isSave': True,
'isTK': True,
},
Expand Down

0 comments on commit 0ccb997

Please sign in to comment.