You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用外部程序打开文件时如何保持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:18:00