【问题标题】:kivy method gets called twice with Button bindkivy 方法被 Button 绑定调用了两次
【发布时间】:2020-05-24 17:32:32
【问题描述】:

我正在尝试将按下的Buttonid 传递给下面的move_to_chat() 方法,以便我可以评估它并创建一个变量。但是目前我的move_to_chat() 方法运行了两次,结果不同。

我不明白为什么绑定函数调用move_to_chat 函数两次,结果不同(第二次产生我想要的结果)

py 文件


class ChangedButton(Button):
    dock_id = StringProperty()


class WindowManager(ScreenManager):
    pass

class MyApp(MDApp):

    def on_start(self):
        self.docs = self.my_firestore.db.collection(u'users').where(u'value', u'==', True).stream()
        select_chat = self.root.get_screen("select_chat").ids['select_chat_grid']

        for doc in self.docs: # cycle through values in database and create Buttons for them
            dict = doc.to_dict()
            btn = ChangedButton(text="{} {}".format(dict['first_name'], dict['last_name']), dock_id=doc.id)
            btn.bind(on_release=lambda x:self.move_to_chat(doc.id))
            select_chat.add_widget(btn)

    def move_to_chat(self, doc_id):
        print("logged in user: ", self.local_id)
        print("user to message: ", doc_id)
        group_id = self.local_id + ":"+ doc_id
        print(group_id)
        MDApp.get_running_app().sm.current = "chat"

kv文件

<ChangedButton>
    on_release: app.move_to_chat(self.dock_id)

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    您有两条不同的行将on_release 绑定到您的move_to_chat 方法,因此当您触发该事件时,该方法会被调用两次。

    由于在 for loow 中使用了 lambda 函数,您还遇到了经典的 late binding closures 问题,这就是这两个调用具有不同参数的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2021-03-21
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      相关资源
      最近更新 更多