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

同时运行Kivy应用与无限倒计时循环时窗口显示异常如何解决

问题根因
  • 多进程内存隔离:multiprocessing 创建的子进程拥有独立的内存空间,你在计时进程里修改的 days/hours 等全局变量,Kivy进程完全读取不到,也没有任何逻辑把计时数据同步到界面,所以界面除了背景没有其他内容,呈现白屏状态。
  • Kivy运行逻辑不符合要求:GUI框架的渲染逻辑必须运行在主进程的主线程中,你把子进程用来运行Kivy的run()方法,Windows系统下多进程默认使用spawn启动模式,子进程启动时会重新导入执行整个脚本,就会触发重复创建窗口的问题。
  • 冗余依赖:你完全不需要引入pygame做时钟控制,Kivy自带的Clock调度器原生支持高精度定时任务,额外引入pygame只会增加包体积,不利于后续打包移动端。
  • 界面缺少时间显示组件:你当前的MyFloat布局只加了背景图,没有添加用来展示剩余时间的Label组件,就算有计时数据也无法显示到界面上。
修复方案

直接抛弃多进程设计,用Kivy自带的Clock调度器实现计时逻辑,所有逻辑都在Kivy主进程中运行,避免跨进程同步的问题。修复后可直接运行,后续打包移动端也不会有兼容问题:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import Image
from kivy.uix.label import Label
from kivy.clock import Clock
from kivy.core.window import Window

# 窗口适配移动端,可按需调整
Window.size = (360, 640)

class MyFloat(FloatLayout):
    def __init__(self, **kwargs):
        super(MyFloat, self).__init__(**kwargs)
        # 背景图
        self.background = Image(source="textures/background.jpg", allow_stretch=True, keep_ratio=False)
        self.add_widget(self.background)
        # 时间显示标签
        self.time_label = Label(
            text="00天00时00分00秒00",
            font_size=40,
            pos_hint={"center_x": 0.5, "center_y": 0.5},
            color=(1,1,1,1)
        )
        self.add_widget(self.time_label)
        
        # 初始化倒计时参数
        self.days = 0
        self.hours = 0
        self.minutes = 0
        self.seconds = 30
        self.miliseconds = 0
        self.active = True
        
        # 启动10ms一次的调度,对应100Hz刷新,和你原来pygame的tick(100)精度一致
        Clock.schedule_interval(self.check_time, 0.01)

    def check_time(self, dt):
        if not self.active:
            return False
        self.miliseconds -= 1
        if self.miliseconds < 0:
            self.miliseconds += 100
            self.seconds -= 1
        if self.seconds < 0:
            self.seconds += 60
            self.minutes -= 1
        if self.minutes < 0:
            self.minutes += 60
            self.hours -= 1
        if self.hours < 0:
            self.hours += 24
            self.days -= 1
        if self.days < 0:
            self.active = False
            self.time_label.text = "倒计时结束"
            print("End")
            return False
        # 更新界面显示
        self.time_label.text = f"{self.days:02d}天{self.hours:02d}时{self.minutes:02d}分{self.seconds:02d}秒{self.miliseconds:02d}"

class MyApp(App):
    def build(self):
        return MyFloat()

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

内容的提问来源于stack exchange,提问作者Darqetaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:24:05