单屏多类致FloatLayout失效及Kivy按钮调用问题排查
我来帮你拆解这两个Kivy小问题——按钮缩在左下角和点击没反应,都是新手常踩的布局与组件层级坑:
1. 按钮定位异常的原因与修复
你的GoS类继承自Widget,而Widget默认的尺寸是(100,100),size_hint是(None, None)。也就是说这个GoS控件本身只有巴掌大,里面嵌套的FloatLayout自然也只能在这个小范围内布局,导致按钮看起来缩在左下角。
修复方案选其一即可:
- 方案一:把
GoS的父类从Widget改成FloatLayout,这样它会默认占满父容器的全部空间(FloatLayout默认size_hint: (1,1))。 - 方案二:在kv文件中给
GoS添加size_hint: (1,1),强制它撑满父FloatLayout。
2. 按钮点击无响应的原因与正确语法
你写的self.parent.current完全找错了对象:self是GoS实例,它的parent是Screen1里的第二个FloatLayout,而FloatLayout根本没有current属性——这个属性是ScreenManager(也就是你的WindowManager)的专属属性。
推荐两种简洁的正确调用方式:
方式一:直接在kv中操作(无需写Python方法)
把按钮的on_press改成直接定位到ScreenManager:
on_press: root.manager.current = "screen2"
这里的root指的是当前的Screen1,root.manager就是它所属的WindowManager实例,直接修改current就能切换屏幕。
方式二:在Python方法中正确获取ScreenManager
如果你想保留goscreen()方法,可以修改代码通过组件层级或App实例找到目标:
from kivy.app import App def goscreen(self): # 方式1:通过组件层级向上找 screen_manager = self.parent.parent.manager screen_manager.current = "screen2" # 方式2:直接通过App实例获取根控件(更通用) # App.get_running_app().root.current = "screen2"
修正后的完整代码
kv文件(用方案一修改GoS父类,简化布局)
WindowManager: Screen1: Screen2: <Screen1>: name: "screen1" FloatLayout: Label: pos_hint: {'top': 1, "center_x": 0.5} size_hint: (0.2, 0.5) font_size: 40 text: "TEXT AT TOP OF SCREEN" FloatLayout: TextInput: pos_hint: {"x": 0.1, "y": 0.05} size_hint: (0.3, 0.05) multiline:False GoS: Button: text: "PRESS TO GO TO SCREEN 2" pos_hint: {"right": 0.5, "center_y": 0.7} on_press: root.manager.current = "screen2" <Screen2>: name: "screen2" Label: text: "YOU ARE ON SCREEN TWO"
py文件(修改GoS父类)
from kivy.app import App from kivy.lang import Builder from kivy.uix.floatlayout import FloatLayout from kivy.uix.screenmanager import ScreenManager, Screen class Screen1(Screen): pass # 将Widget改为FloatLayout,让控件占满父容器 class GoS(FloatLayout): # 如果用kv直接设置current,这个方法可以删掉 # def goscreen(self): # App.get_running_app().root.current = "screen2" class Screen2(Screen): pass class WindowManager(ScreenManager): pass kv = Builder.load_file("rec_view.kv") class TestApp(App): def build(self): return kv if __name__ == "__main__": TestApp().run()
修改后按钮会正确显示在你设定的位置,点击也能顺利跳转到Screen2。
内容的提问来源于stack exchange,提问作者c_n_blue
相关产品推荐
相关产品推荐

