python - 如何在 Kivy (Python3) 中动态创建多个函数?
问题描述
情况
我正在创建一个会议查找器应用程序,它将搜索 JSON 文件并返回多个会议字典的列表。我想为每个会议创建按钮,以便我可以了解有关会议的更多信息或加入会议。由于我需要查询会议列表,所以我不知道会有多少个会议按钮。我需要动态生成和绑定这些按钮。
Python代码
只添加导致问题的那部分代码。
class MeetingDisplayer(Screen):
def __init__(self,back,info,**kwargs):
super().__init__(**kwargs)
self.back = back
self.info = info # this is the meetings list which contains multiple meeting dictionaries.
self.headings = [] # this will contain the text of the buttons
for meeting in self.info:
meeting_subject = meeting["meeting_subject"]
meeting_organizer = meeting["meeting_organizer"]
time = meeting["time"]
heading = f"{meeting_subject} | {meeting_organizer} | {time}"
self.headings.append([heading,None])
self.scroller = ScrollView()
self.scroller.pos_hint = {"x": 0.1, "top": 0.75}
self.scroller.size_hint = (0.8, 0.63)
self.info_grid = GridLayout()
self.info_grid.cols = 1
if len(self.headings) > 20:
self.info_grid.size_hint = 1, 2
elif len(self.headings) > 10:
self.info_grid.size_hint = 1, 1.4
elif len(self.headings) > 5:
self.info_grid.size_hint = 1, 0.8
else:
self.info_grid.size_hint = 1, 0.35
i = -1
for heading in self.headings:
i += 1
heading[1] = Button(text = heading[0], font_size = 15, color = (1,1,1,1), background_color = (0/255, 153/255, 204/255, 1), on_release = lambda x: self.find_function(i))
self.info_grid.add_widget(heading[1])
self.scroller.add_widget(self.info_grid)
self.add_widget(self.scroller)
def find_function(self, i):
sm.add_widget(MeetingInformation(self.info, name = "MeetingInformation"))
MeetingInformation_screen = sm.get_screen('MeetingInformation')
setattr(MeetingInformation_screen, "index", i)
sm.transition = SlideTransition(direction = "left")
sm.current = "MeetingInformation"
class MeetingInformation(Screen):
def __init__(self, meeting_list, **kwargs):
super().__init__(**kwargs)
self.meeting_list = meeting_list
def on_pre_enter(self):
print(self.index)
meeting = self.meeting_list[self.index]
self.info_grid = GridLayout()
self.info_grid.cols = 2
self.info_grid.size_hint = 0.9, 0.4
self.info_grid.pos_hint = {"x": 0.05, "top": 0.67}
self.category_label = Button(text = "Category:", font_size = 14, color = (1,1,1,1), background_color = (0/255, 153/255, 204/255, 1))
self.info_grid.add_widget(self.category_label)
self.category_value = Label(text = meeting["category"], font_size = 14, color = (0,0,0,1))
self.info_grid.add_widget(self.category_value)
self.time_label = Button(text = "Time:", font_size = 14, color = (1,1,1,1), background_color = (0/255, 153/255, 204/255, 1))
self.info_grid.add_widget(self.time_label)
self.time_value = Label(text = meeting["time"], font_size = 14, color = (0,0,0,1))
self.info_grid.add_widget(self.time_value)
self.subject_label = Button(text = "Subject:", font_size = 14, color = (1,1,1,1), background_color = (0/255, 153/255, 204/255, 1))
self.info_grid.add_widget(self.subject_label)
self.subject_value = Label(text = meeting["meeting_subject"], font_size = 14, color = (0,0,0,1))
self.info_grid.add_widget(self.subject_value)
self.organizer_label = Button(text = "Organizer:", font_size = 14, color = (1,1,1,1), background_color = (0/255, 153/255, 204/255, 1))
self.info_grid.add_widget(self.organizer_label)
self.organizer_value = Label(text = meeting["meeting_organizer"], font_size = 14, color = (0,0,0,1))
self.info_grid.add_widget(self.organizer_value)
self.meeting_id_label = Button(text = "Meeting ID:", font_size = 14, color = (1,1,1,1), background_color = (0/255, 153/255, 204/255, 1))
self.info_grid.add_widget(self.meeting_id_label)
self.meeting_id_value = Label(text = str(meeting["meeting_id"]), font_size = 14, color = (0,0,0,1))
self.info_grid.add_widget(self.meeting_id_value)
self.passcode_label = Button(text = str("Meeting Passcode:"), font_size = 14, color = (1,1,1,1), background_color = (0/255, 153/255, 204/255, 1))
self.info_grid.add_widget(self.passcode_label)
self.passcode_value = Label(text = meeting["passcode"], font_size = 14, color = (0,0,0,1))
self.info_grid.add_widget(self.passcode_value)
self.activation_status_label = Button(text = "Activation Status:", font_size = 14, color = (1,1,1,1), background_color = (0/255, 153/255, 204/255, 1))
self.info_grid.add_widget(self.activation_status_label)
self.activation_status_value = Label(text = str(meeting["active"]), font_size = 14, color = (0,0,0,1))
self.info_grid.add_widget(self.activation_status_value)
self.add_widget(self.info_grid)
但问题是当我点击一个按钮时,我只能得到我添加的最后一个按钮小部件。我的意思是索引属性的i变量设置为固定数字[最后一个按钮的索引],它无法识别按下了哪个按钮。
一些可以帮助的图片
问题
如何以动态方式将按钮与功能绑定,以便每次按下按钮时都能获得该按钮的确切索引或显示确切信息?
解决方案
尝试改变:
heading[1] = Button(text = heading[0], font_size = 15, color = (1,1,1,1), background_color = (0/255, 153/255, 204/255, 1), on_release = lambda x: self.find_function(i))
至:
heading[1] = Button(text = heading[0], font_size = 15, color = (1,1,1,1), background_color = (0/255, 153/255, 204/255, 1), on_release = lambda x, j=i: self.find_function(j))
该lambda
函数评估i
何时调用 lambda(通过按下按钮)。更改为lambda x, j=i: self.find_function(j)
强制评估i
何时创建 `lambda。
推荐阅读
- html - 使用 Bootstrap 5 时无法让空白消失
- automation - 复制批准级别的问题(订阅)
- sandbox - HPP 沙盒环境是否支持挑战?
- google-cloud-platform - 关于配置 YAML 文件的问题
- c# - 当类必须相互通信时避免循环引用(依赖注入)
- swift - 在 SwiftUI 中使用 DatePicker 时如何将时间设置为标准值
- python-3.x - 如何滚动页面?
- google-cloud-platform - 在 Julia 应用程序中使用谷歌云存储
- google-sheets - 具有两个条件的条件格式
- java - 如何在java中打印整行文本(来自输入文件)