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

Kivy框架下.kv文件中K5与Geo5屏幕无法切换问题求助

Kivy屏幕切换问题解决方法

你遇到的K5与Geo5屏幕无法切换的问题,根源在于「ГЕОМЕТРИЯ」按钮内部的FloatLayout拦截了触摸事件——默认情况下,FloatLayout会优先处理点击动作,导致Button绑定的on_press事件根本触发不了。

给你两个可行的解决办法:

方法一:替换FloatLayout为RelativeLayout

RelativeLayout不会拦截父控件的触摸事件,能让Button正常响应点击。同时调整内部控件的定位逻辑(RelativeLayout基于父控件相对定位):

ScreenManager:
    K5:
    Geo5:

<K5@Screen>:
    name: "main5klass"

    BoxLayout:
        orientation:"vertical"
        BoxLayout:
            canvas.before:
                Color:
                    rgba: (.47, 1, .35, 1)
                Rectangle:
                    pos: self.pos
                    size: self.size
            padding: "5dp"
            Button:
                background_color: 1, 1, 1, 0
                RelativeLayout:
                    Image:
                        source: "images/button1.png"
                        size: self.parent.size
                        pos: self.parent.pos
                        allow_stretch: True
                        keep_ratio: False
                    Label:
                        text:"АЛГЕБРА"
                        center_x: self.parent.center_x
                        center_y: self.parent.center_y
            Label:
                size_hint: .01 , 1
            Button:
                background_color: 1, 1, 1, 0
                on_press: app.root.current = 'geo5'
                RelativeLayout:
                    Image:
                        source: "images/button1.png"
                        size: self.parent.size
                        pos: self.parent.pos
                        allow_stretch: True
                        keep_ratio: False
                    Label:
                        text:"ГЕОМЕТРИЯ"
                        center_x: self.parent.center_x
                        center_y: self.parent.center_y
        BoxLayout:
            padding: "20dp"
            spacing: "20dp"
            size_hint:1,None
            Button:
                background_color: 1, 1, 1, 0
                on_press: app.root.current = 'menu'
                Image:
                    source: "images/back.png"
                    center_x: self.parent.center_x
                    center_y: self.parent.center_y
            Button:
                background_color: 1, 1, 1, 0
                on_press: app.root.current = 'menu'
                Image:
                    source: "images/home.png"
                    center_x: self.parent.center_x
                    center_y: self.parent.center_y

<Geo5@Screen>:
    name: 'geo5'

    BoxLayout:
        orientation: 'vertical'
        Label:
            text: "Экран геометрии"
            font_size: 24
            color: 1, 1, 1, 1

方法二:给FloatLayout添加触摸传递逻辑

如果一定要保留FloatLayout,需要手动让它把触摸事件传递给父Button:

# 在对应FloatLayout中添加如下事件处理
FloatLayout:
    on_touch_down: root.parent.dispatch('on_touch_down', touch)
    on_touch_move: root.parent.dispatch('on_touch_move', touch)
    on_touch_up: root.parent.dispatch('on_touch_up', touch)

两种方法都能解决屏幕切换问题,推荐使用方法一,逻辑更简洁,符合Kivy的控件设计逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:23:09