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

如何用Python代码实现KivyMD按钮点击时屏幕右向左切换

解决KivyMD中Python代码修改屏幕切换动画方向的问题

问题描述

需要通过Python代码实现返回按钮的屏幕切换动画为右向左(匹配返回上一页的视觉逻辑),默认左向右动画不符合需求。在kv文件中可通过root.manager.transition.direction = "right"实现,但当前屏幕必须用Python代码修改,尝试的back_button.on_release = lambda: setattr(self.manager, "transition", "right")代码无效。

错误原因

  1. 事件被覆盖:连续两次给back_button.on_release赋值,第二次切换屏幕的代码直接覆盖了第一次修改动画方向的逻辑,导致动画设置代码从未执行。
  2. 属性修改错误:self.manager.transition是ScreenTransition类型的对象,直接赋值字符串"right"是错误操作,应该修改该对象的direction属性。

解决方案

将修改动画方向和切换屏幕的逻辑合并到同一个lambda函数中,确保两个操作都能执行,并且正确修改transition的direction属性:

back_button.on_release = lambda: (
    setattr(self.manager.transition, "direction", "right"),
    setattr(self.manager, 'current', 'c_t')
)

如果需要保证前进按钮的动画恢复为默认的左向右,可以给前进按钮也添加动画方向设置:

next_button.on_release = lambda: (
    setattr(self.manager.transition, "direction", "left"),
    setattr(self.manager, 'current', 't_y')
)

修改后的完整Contraindicaciones类代码

from kivy.core.window import Window
from kivymd.uix.screen import MDScreen
from kivymd.uix.scrollview import MDScrollView
from kivymd.uix.gridlayout import MDGridLayout
from kivymd.uix.label import MDLabel
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.button import MDFillRoundFlatButton
from kivymd.uix.checkbox import MDCheckbox
from kivy.metrics import dp

class Contraindicaciones(MDScreen):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # Scrollview
        self.scrollview_contraindicaciones = MDScrollView(size_hint=(1, None), size = (Window.width, Window.height))

        # GridLayout
        layout_contraindicaciones = MDGridLayout(orientation = "lr-tb", spacing = "60dp", padding = "20dp", size_hint_x = 1, size_hint_y = None, cols = 2)
        layout_contraindicaciones.bind(minimum_height = layout_contraindicaciones.setter("height"))

        # Go Back Button:
        invisible_label1 = MDLabel(text = "")
        invisible_label1.size_hint_y = None
        invisible_label1.size_hint_x = 0.5
        invisible_label1.height = dp(50)

        back_button_layout = MDBoxLayout(orientation = "vertical")
        back_button = MDFillRoundFlatButton(text = "Anterior", font_name = "fonts/Lato-Bolditalic.ttf")
        back_button.halign = "left"  # 修正原代码拼写错误:haling → halign
        back_button.size_hint_y = None
        back_button.size_hint_x = 0.5

        # 合并动画设置与屏幕切换逻辑
        back_button.on_release = lambda: (
            setattr(self.manager.transition, "direction", "right"),
            setattr(self.manager, 'current', 'c_t')
        )

        back_button_layout.add_widget(back_button)
        layout_contraindicaciones.add_widget(back_button_layout)
        layout_contraindicaciones.add_widget(invisible_label1)

        #title
        title_label = MDLabel(text = "Contraindicaciones", halign="left")
        title_label.font_size = "15dp"
        title_label.size_hint_y = None
        title_label.size_hint_x = 1
        title_label.font_name = "fonts/Lato-Bolditalic.ttf"
        title_label.height = dp(50)

        # Invisible Label
        invisible_label2 = MDLabel(text = "")
        invisible_label2.size_hint_y = None
        invisible_label2.size_hint_x = 0.25
        invisible_label2.height = dp(50)

        # Title and Invisible Label to not mess the rest up
        layout_contraindicaciones.add_widget(title_label)
        layout_contraindicaciones.add_widget(invisible_label2)

        contraindicaciones = ["Hemorragia intracraneal (HIC) previa", "Lesión vascular cerebral estructural conocida",
        "Neoplasia intracraneal maligna conocida ya sea primaria o metastásica", "Accidente cerebrovascular isquémico en un plazo de 3 meses",
        "Sospecha de disección aórtica", "Hemorragia activa o diátesis hemorrágica", "Traumatismo craneoencefálico cerrado importante o traumatismo facial en los últimos 3 meses",
        "Cirugía intracraneal o intramedular en un plazo de 3 meses", "Hipertensión no controlada grave", "En caso de estreptoquinasa, el tratamiento previo debe ser dentro de los 6 meses previos"]

        for contraindicacion in contraindicaciones:
            size_checkbox = dp(32)
            size_labels = dp(12)
            checkbox = MDCheckbox(size_hint = (0.5, None), size = (size_checkbox, size_checkbox))
            label = MDLabel(text = contraindicacion, size_hint = (0.5, None), size = (size_labels, size_labels))
            label.font_name = "fonts/Lato-Italic.ttf"
            layout_contraindicaciones.add_widget(label)
            layout_contraindicaciones.add_widget(checkbox)

        # Button and invisible label
        invisible_label3 = MDLabel(text = "")
        invisible_label3.size_hint_y = None
        invisible_label3.size_hint_x = 0.5
        invisible_label3.height = dp(50)

        next_button = MDFillRoundFlatButton(text = "Continuar", font_name = "fonts/Lato-Bolditalic.ttf")
        next_button.halign = "right"  # 修正原代码拼写错误:haling → halign
        next_button.size_hint_y = None
        next_button.size_hint_x = 0.5
        # 恢复前进按钮的默认动画方向
        next_button.on_release = lambda: (
            setattr(self.manager.transition, "direction", "left"),
            setattr(self.manager, 'current', 't_y')
        )

        layout_contraindicaciones.add_widget(invisible_label3)
        layout_contraindicaciones.add_widget(next_button)

        #Se agrega Grid a Scroll
        self.scrollview_contraindicaciones.add_widget(layout_contraindicaciones)
        self.add_widget(self.scrollview_contraindicaciones)

补充说明

  • 修正了原代码中按钮haling的拼写错误,应为halign。
  • 合并lambda操作时,使用逗号分隔多个表达式,确保两个操作都被执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 21:10:55