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

Kivy安卓应用无法获取屏幕宽高,布局异常求助

Kivy安卓端屏幕尺寸获取与布局修复

问题原因

安卓设备启动时组件初始化顺序与PC端存在差异,root.width和root.height在布局渲染初期可能未正确加载实际屏幕尺寸,导致依赖这些值的布局、字体大小计算失效;而PC端窗口初始化速度快,组件尺寸能及时就绪,因此布局显示正常。

解决方案

1. 改用系统级窗口尺寸获取

直接调用Kivy的Window模块获取屏幕宽高,这是系统层面的尺寸信息,不受组件初始化顺序影响,稳定性更高。

2. 绑定尺寸变化事件

监听屏幕旋转或尺寸变更事件,确保布局能自动刷新适配新尺寸。

3. 简化字体大小计算

替换复杂的幂运算逻辑,改用基于屏幕最小边的比例计算,既稳定又易维护。

修改后的完整代码

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.core.window import Window  # 导入Window模块

Builder.load_string("""
<LoginScreen>:
    FloatLayout:
        name: 'login_p'
        FloatLayout:
            size: Window.width, Window.height/2  # 替换为Window系统尺寸
            Label:
                text: "Login to your Account"
                size_hint: 0.8, 0.25
                pos_hint: {"x":0.1, "top":1}
                font_size: min(Window.width, Window.height) / 20  # 简化字体计算逻辑

            Label:
                size_hint: 0.5,0.12
                pos_hint: {"x":0, "top":0.8}
                text: "Username : "
                font_size: min(Window.width, Window.height) / 25

            TextInput:
                pos_hint: {"x":0.4, "top":0.8}
                size_hint: 0.5, 0.12
                id: namee
                multiline: False
                font_size: min(Window.width, Window.height) / 25

            Label:
                size_hint: 0.5,0.12
                pos_hint: {"x":0, "top":0.67}
                text: "Password : "
                font_size: min(Window.width, Window.height) / 25

            TextInput:
                pos_hint: {"x":0.4, "top":0.67}
                size_hint: 0.5, 0.12
                id: password
                multiline: False
                font_size: min(Window.width, Window.height) / 25

        Button:
            pos_hint:{"x":0.2,"y":0.35}
            size_hint: 0.6, 0.1
            font_size: min(Window.width, Window.height) / 28
            text: "Already have an Account? Log In"
""")

class LoginScreen(Screen):
    pass    

class mainApp(App):
    def build(self):
        # 绑定窗口尺寸变化事件,触发布局刷新
        Window.bind(on_resize=self.on_window_resize)
        sm = ScreenManager()
        sm.add_widget(LoginScreen(name='login'))
        return sm

    def on_window_resize(self, window, width, height):
        # 屏幕尺寸变更时,强制根组件刷新尺寸
        if self.root:
            self.root.dispatch('on_size')

if __name__ == '__main__':
    mainApp().run()

额外注意事项

  • 打包安卓应用时,在buildozer.spec中指定稳定版Kivy(如kivy = 2.2.1),避免兼容性问题。
  • 如需适配不同屏幕密度,可结合kivy.metrics模块的dp()方法,将固定尺寸转换为设备无关像素,例如size: dp(200), dp(50)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:52:40