调用外部程序打开文件时如何保持Tkinter窗口为当前活动窗口
Tkinter热键播放音频窗口失焦问题及解决方法
基础实现
我有一个tkinter应用,实现了多个热键用于播放不同的mp3文件,基础实现代码如下:
import tkinter as tk import os root=tk.Tk() def openFile(event=None): os.startfile("Song.mp3") openFile() root.bind("<space>", openFile) root.mainloop()
存在的问题
上述代码可正常运行,但存在一个问题:当我按下空格键播放音频文件后,系统默认音乐播放器会成为活动窗口,此时再次按下空格键不会触发tkinter的热键逻辑,而是会执行音乐播放器中空格键对应的操作。想要重新播放文件,我需要先点击切回tkinter窗口将其激活后,才能再次按空格播放,而每次播放后又会再次激活音乐播放器窗口、取消tkinter窗口的活动状态,操作非常不便。
我不需要tkinter窗口始终为活动窗口,仅在从该窗口触发打开文件操作时保留活动状态即可;举例来说,如果我主动点击音乐播放器,那么播放器窗口应该正常成为活动窗口,无需被tkinter抢占。
最终解决方案
我已经使用win32gui实现了该需求,实现代码如下:
import tkinter as tk import os import win32gui, win32com.client def windowEnumerationHandler(hwnd, windows): windows.append((hwnd, win32gui.GetWindowText(hwnd))) windows = [] def front(windowID, windows): for i in windows: if i[0] == windowID: shell = win32com.client.Dispatch("WScript.Shell") shell.SendKeys('+') win32gui.SetForegroundWindow(i[0]) break root=tk.Tk() def openFile(event=None): windowID = win32gui.GetForegroundWindow() win32gui.EnumWindows(windowEnumerationHandler, windows) os.startfile("Pause.mp3") front(windowID, windows) openFile() root.bind("<space>", openFile) root.mainloop()
代码说明
其中调用shell的部分是必要的,我将SendKeys命令的参数从%修改为+,因为我的完整程序包含菜单栏,按下alt键(对应参数%)会触发菜单栏展开,这不是播放音频时需要的效果。
内容的提问来源于stack exchange,提问作者PebNischl
相关产品推荐
相关产品推荐

