Kivy Python动态按钮关联对应Label实现度分秒角度调整的问题
背景说明
应用内某屏幕用于展示度分秒格式的角度值,这些值是进入屏幕时创建的MDLabel组件,数值取自用户在上一屏幕MDTextField中输入的内容。角度的数量由第一屏幕用户输入的点数量决定:若有5个点则生成5组角度,每组对应独立的度分秒输入值。每个角度为包含度、分、秒3个值的列表,所有角度存储在名为angles的二维列表中以便后续计算。
问题描述
需要实现用户点击+/-按钮调整角度的功能,每点击一次将对应角度的秒数增减1。当前无法将按钮与对应角度关联,比如点击第二个角度的+按钮,仅会给第二个角度的秒数加1,不清楚如何编写对应的plus()/minus()方法实现该逻辑。
现有代码修改点
首先调整on_enter方法中的组件存储逻辑和按钮绑定逻辑,通过默认参数传递角度索引解决闭包晚绑定问题:
class AngleAdjustment(Screen): def on_enter(self, *args): self.adj_angles_widgets = [] self.minus_buttons = [] self.plus_buttons = [] angle_number = 0 for angle in angles: angle_number += 1 self.angle_to_adjust_title = MDLabel(text="Angle " + str(angle_number), font_size=20, halign="center") self.angle_adjustment_gridlayout = MDGridLayout(cols=5, spacing="10dp", padding="10dp", adaptive_height=True) self.minus_button = MDIconButton(icon="minus-circle", user_font_size="40sp") self.degrees_to_adjust = MDLabel(text=str(angle[0]), halign="center") self.minutes_to_adjust = MDLabel(text=str(angle[1]), halign="center") self.seconds_to_adjust = MDLabel(text=str(angle[2]), halign="center") self.plus_button = MDIconButton(icon="plus-circle", user_font_size="40sp") # 存储Label组件引用而非固定数值,方便后续更新界面 self.adj_angle_widgets = [self.degrees_to_adjust, self.minutes_to_adjust, self.seconds_to_adjust] self.adj_angles_widgets.append(self.adj_angle_widgets) self.minus_buttons.append(self.minus_button) self.plus_buttons.append(self.plus_button) self.angle_adjustment_gridlayout.add_widget(self.minus_button) self.angle_adjustment_gridlayout.add_widget(self.degrees_to_adjust) self.angle_adjustment_gridlayout.add_widget(self.minutes_to_adjust) self.angle_adjustment_gridlayout.add_widget(self.seconds_to_adjust) self.angle_adjustment_gridlayout.add_widget(self.plus_button) self.ids.angle_adjustment.add_widget(self.angle_to_adjust_title) self.ids.angle_adjustment.add_widget(self.angle_adjustment_gridlayout) # 绑定按钮时传入当前角度的索引,用默认参数固定当前循环的索引值 self.minus_button.bind(on_press=lambda btn, idx=angle_number-1: self.minus(idx)) self.plus_button.bind(on_press=lambda btn, idx=angle_number-1: self.plus(idx))
实现plus/minus方法
在AngleAdjustment类中添加以下两个方法,包含度分秒的进位/借位逻辑,同时同步更新全局angles数组:
def plus(self, index): deg_label, min_label, sec_label = self.adj_angles_widgets[index] deg = int(deg_label.text) minute = int(min_label.text) sec = int(sec_label.text) sec += 1 # 处理进位逻辑 if sec >= 60: sec -= 60 minute += 1 if minute >= 60: minute -= 60 deg += 1 # 更新界面显示 deg_label.text = str(deg) min_label.text = str(minute) sec_label.text = str(sec) # 同步更新全局角度数组 angles[index] = [deg, minute, sec] def minus(self, index): deg_label, min_label, sec_label = self.adj_angles_widgets[index] deg = int(deg_label.text) minute = int(min_label.text) sec = int(sec_label.text) sec -= 1 # 处理借位逻辑,角度为负时直接返回不修改 if sec < 0: if minute <= 0 and deg <= 0: return sec += 60 minute -= 1 if minute < 0: if deg <= 0: return minute += 60 deg -= 1 # 更新界面显示 deg_label.text = str(deg) min_label.text = str(minute) sec_label.text = str(sec) # 同步更新全局角度数组 angles[index] = [deg, minute, sec]
内容的提问来源于stack exchange,提问作者Guy Mendel
相关产品推荐
相关产品推荐

