如何用Python代码实现KivyMD按钮点击时屏幕右向左切换
解决KivyMD中Python代码修改屏幕切换动画方向的问题
问题描述
需要通过Python代码实现返回按钮的屏幕切换动画为右向左(匹配返回上一页的视觉逻辑),默认左向右动画不符合需求。在kv文件中可通过root.manager.transition.direction = "right"实现,但当前屏幕必须用Python代码修改,尝试的back_button.on_release = lambda: setattr(self.manager, "transition", "right")代码无效。
错误原因
- 事件被覆盖:连续两次给
back_button.on_release赋值,第二次切换屏幕的代码直接覆盖了第一次修改动画方向的逻辑,导致动画设置代码从未执行。 - 属性修改错误:
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_
相关产品推荐
相关产品推荐

