簡體   English   中英

如何在Kivy(Python3)中動態創建多個函數?

[英]How to create multiple functions dynamically in 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變量設置為固定數字[最后一個按鈕的索引],它無法識別按下了哪個按鈕。

一些可以幫助的圖片

所有按鈕都在這里

按下第一個按鈕后

按下第二個按鈕后

問題

如何以動態方式將按鈕與 function 綁定,以便每次按下按鈕時都能獲得該按鈕的確切索引或顯示確切信息?

嘗試改變:

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 function 在調用 lambda 時評估i (通過按下按鈕)。 更改為lambda x, j=i: self.find_function(j)在創建 `lambda 時強制評估i

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM