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

如何在Kivy中点击按钮修改屏幕尺寸?搭配Screen Manager失效

解决Screen Manager搭配窗口尺寸修改失效的问题

我之前也遇到过一模一样的情况——单独用Window.size或者修改Config调整窗口尺寸完全没问题,但一结合ScreenManager就失效。核心原因是上下文引用错误或者没有在正确时机触发窗口更新,下面给你两个亲测有效的解决方案:

方案1:通过App实例操作窗口(最可靠)

ScreenManager切换屏幕时,直接调用全局的Window.size容易因为上下文丢失导致失效。更稳妥的方式是通过当前运行的App实例获取窗口引用,这样在任何Screen里都能稳定操作:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button

class MainScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 添加触发调整的按钮
        resize_btn = Button(text="调整窗口为800x600", on_press=self.resize_window)
        self.add_widget(resize_btn)
    
    def resize_window(self, instance):
        # 获取当前运行的App实例
        current_app = App.get_running_app()
        # 通过App实例绑定的窗口引用修改尺寸
        current_app.window.size = (800, 600)

class MyApp(App):
    def build(self):
        # 把主窗口引用绑定到App实例,方便后续调用
        self.window = self.root_window
        sm = ScreenManager()
        sm.add_widget(MainScreen(name="main"))
        return sm

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

这个方法的核心是避免直接依赖全局Window对象,而是通过App实例持有稳定的窗口引用,适配多屏幕切换的场景。

方案2:结合Config修改并手动生效

如果你需要通过Config持久化窗口尺寸设置,可以修改配置后手动触发窗口更新(因为Config的自动生效通常只在App启动阶段):

from kivy.app import App
from kivy.config import Config
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button

class ConfigScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        config_btn = Button(text="设置窗口为1000x700并保存配置", on_press=self.update_config_and_resize)
        self.add_widget(config_btn)
    
    def update_config_and_resize(self, instance):
        # 修改Config中的尺寸配置
        Config.set('graphics', 'width', '1000')
        Config.set('graphics', 'height', '700')
        # 保存配置到文件(可选,下次启动App会自动使用该尺寸)
        Config.write()
        # 手动将新尺寸应用到当前窗口
        current_app = App.get_running_app()
        new_width = int(Config.get('graphics', 'width'))
        new_height = int(Config.get('graphics', 'height'))
        current_app.window.size = (new_width, new_height)

class MyApp(App):
    def build(self):
        self.window = self.root_window
        sm = ScreenManager()
        sm.add_widget(ConfigScreen(name="config"))
        return sm

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

额外注意事项

  • 不要在Screen的__init__方法里直接修改窗口尺寸,此时窗口可能还未完全初始化,应该在用户交互(比如按钮点击)的回调里执行操作。
  • 多屏幕切换时,确保你的尺寸修改逻辑不会被Screen的生命周期方法(比如on_pre_enter、on_leave)干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:33:42