如何在 Kivy (Python3) 中动态创建多个函数?

如何解决如何在 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),background_color = (0/255,153/255,204/255,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,1))
        self.info_grid.add_widget(self.category_label)
        self.category_value = Label(text = meeting["category"],color = (0,1))
        self.info_grid.add_widget(self.category_value)
        self.time_label = Button(text = "Time:",1))
        self.info_grid.add_widget(self.time_label)
        self.time_value = Label(text = meeting["time"],1))
        self.info_grid.add_widget(self.time_value)
        self.subject_label = Button(text = "Subject:",1))
        self.info_grid.add_widget(self.subject_label)
        self.subject_value = Label(text = meeting["meeting_subject"],1))
        self.info_grid.add_widget(self.subject_value)
        self.organizer_label = Button(text = "Organizer:",1))
        self.info_grid.add_widget(self.organizer_label)
        self.organizer_value = Label(text = meeting["meeting_organizer"],1))
        self.info_grid.add_widget(self.organizer_value)
        self.meeting_id_label = Button(text = "Meeting ID:",1))
        self.info_grid.add_widget(self.meeting_id_label)
        self.meeting_id_value = Label(text = str(meeting["meeting_id"]),1))
        self.info_grid.add_widget(self.meeting_id_value)
        self.passcode_label = Button(text = str("Meeting Passcode:"),1))
        self.info_grid.add_widget(self.passcode_label)
        self.passcode_value = Label(text = meeting["passcode"],1))
        self.info_grid.add_widget(self.passcode_value)
        self.activation_status_label = Button(text = "Activation Status:",1))
        self.info_grid.add_widget(self.activation_status_label)
        self.activation_status_value = Label(text = str(meeting["active"]),1))
        self.info_grid.add_widget(self.activation_status_value)
        self.add_widget(self.info_grid)

但问题是当我点击一个按钮时,我只能得到我添加的最后一个按钮小部件。 我的意思是作为索引属性i 变量被设置为一个固定数字 [最后一个按钮的索引],它无法识别按下了哪个按钮。

一些可以帮助的图片

all buttons are here

after pressing the first button

after pressing the second button

问题

如何动态绑定按钮和函数,让每次按下按钮都能得到那个按钮的准确索引或显示准确信息?

解决方法

尝试改变:

heading[1] = Button(text = heading[0],font_size = 15,color = (1,1,1),background_color = (0/255,153/255,204/255,on_release = lambda x: self.find_function(i))

到:

heading[1] = Button(text = heading[0],on_release = lambda x,j=i: self.find_function(j))

lambda 函数在调用 lambda 时(通过按下按钮)计算 i。更改为 lambda x,j=i: self.find_function(j) 会在创建 `lambda 时强制对 i 求值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?