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

如何在Kivy中设置Window窗口始终置顶?(Windows 10环境)

解决Kivy窗口在Windows 10下始终置顶的问题

嘿,我刚好在Win10 + Python3.6.5的环境下折腾过这个需求,你之前试的Window.on_hide = Window.raise_window其实没踩对触发时机——on_hide只有窗口被完全隐藏(比如最小化)时才会触发,而窗口被其他窗口覆盖时根本不会触发这个事件,所以没用很正常。给你两个亲测有效的方案:

方案一:调用Windows API直接设置置顶

Kivy本身没有内置的置顶属性,但我们可以通过ctypes调用Windows系统的SetWindowPos函数来实现,这是最直接的方法:

from kivy.app import App
from kivy.uix.label import Label
from kivy.core.window import Window
import ctypes

# 定义Windows API需要的常量
HWND_TOPMOST = -1
SWP_NOMOVE = 0x0002  # 不改变窗口位置
SWP_NOSIZE = 0x0001  # 不改变窗口大小

def keep_window_topmost():
    # 获取Kivy窗口的系统句柄
    window_handle = Window._window.get_handle()
    # 调用API设置窗口始终置顶
    ctypes.windll.user32.SetWindowPos(
        window_handle,
        HWND_TOPMOST,
        0, 0, 0, 0,
        SWP_NOMOVE | SWP_NOSIZE
    )

class TopmostApp(App):
    def on_start(self):
        # 应用启动后立即设置置顶
        keep_window_topmost()
    
    def build(self):
        return Label(text="我是始终置顶的Kivy窗口!")

if __name__ == "__main__":
    TopmostApp().run()

这个方法的原理是告诉Windows系统把这个窗口标记为“最顶层窗口”,它会一直显示在所有非置顶窗口的上方。

方案二:定时刷新置顶状态(防止意外丢失)

有时候某些系统操作或者其他程序可能会暂时抢占置顶权限,如果你想要绝对稳妥,可以加个定时任务,每隔一段时间重新设置一次置顶:

from kivy.clock import Clock

class TopmostApp(App):
    def on_start(self):
        keep_window_topmost()
        # 每隔1秒刷新一次置顶状态,可根据需求调整间隔
        Clock.schedule_interval(lambda dt: keep_window_topmost(), 1)
    
    def build(self):
        return Label(text="我是稳如狗的置顶Kivy窗口!")

这个小技巧能确保窗口不会因为意外情况失去置顶效果,适合对置顶稳定性要求高的场景。

额外说明

  • 这个方案只适用于Windows系统,因为用到了Windows专属的API;如果以后需要跨平台,记得加个平台判断(比如用platform.system()区分Windows和其他系统)。
  • 如果你需要取消置顶,可以把HWND_TOPMOST换成HWND_NOTOPMOST(-2),调用同样的函数即可。

内容的提问来源于stack exchange,提问作者Jakub Bláha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:21:38