Python如何判断目标窗口是否置顶 解决宏程序热键误触发问题
问题根源
- 热键注册逻辑错误:原代码仅在程序启动调用
hotkey()时判断了一次btncdt的初始值,后续btncdt状态变化不会影响已经注册完成的热键,限制条件完全没有生效 - 缩进语法错误:原
hotkey()函数内的if btncdt > 0语句没有正确缩进,仅在全局执行一次,完全没有和热键触发逻辑绑定 - 缺失窗口关闭事件处理:如果用户点击编辑窗口右上角的叉号关闭,而不是点击确认按钮,
btncdt会一直保持为0,后续热键会完全失效
修复后代码
import tkinter as tk from tkinter import Label, Button, Text import keyboard root = tk.Tk() root.title("Fine Macro ver1.0") # 省略其他组件代码 btncdt = 1 # 1=热键可用,0=编辑窗口打开,热键禁用 def key(): global btncdt btncdt = 0 # 打开编辑窗口时直接设为禁用,避免乘算出现异常数值 keyWindow = tk.Toplevel(root) keyWindow.geometry("300x260+300+200") # 绑定窗口关闭事件,用户点叉号也恢复热键可用状态 keyWindow.protocol("WM_DELETE_WINDOW", lambda: close_key_window(keyWindow)) keyLabel = Label(keyWindow, text='키보드 입력내용을 설정하세요') keyText = Text(keyWindow, width=35, height=10 ) keyConfirm = Button(keyWindow,width=4, height=1 ,text="confirm", command=lambda: setKey(keyText, keyWindow)) keyLabel.pack(side=tk.TOP , pady=10) keyText.pack(side=tk.TOP, pady =5) keyConfirm.pack(side=tk.TOP, pady=10) def close_key_window(keyWindow): global btncdt btncdt = 1 keyWindow.destroy() def setKey(keyText, keyWindow): global btncdt keyvalue = keyText.get(1.0, tk.END).rstrip() putKey(keyvalue) # 你的原有逻辑保留 btncdt = 1 # 直接设为可用,避免加算出现异常数值 print(btncdt) keyWindow.destroy() def doStart(): # 原有宏执行逻辑保留 pass # 热键触发回调,每次按键都先判断状态 def hotkey_callback(e): global btncdt if btncdt > 0: doStart() def hotkey(): # 直接注册热键,触发时再判断是否允许执行 keyboard.on_press_key("S", hotkey_callback) hotkey() root.mainloop()
修改说明
- 将
btncdt的判断逻辑移到热键触发的回调函数中,每次按下S都会先检查编辑窗口状态,再决定是否执行宏 - 新增编辑窗口关闭事件绑定,不管用户是点确认按钮还是点右上角叉号,都会正确恢复热键可用状态
- 调整
btncdt的赋值逻辑,直接切换0/1状态,避免原代码的乘加操作可能出现的数值溢出/异常问题 - 修复了原代码中编辑窗口组件定义的作用域错误,避免出现变量未定义的报错
内容的提问来源于stack exchange,提问作者EurekaPoint
相关产品推荐
相关产品推荐

