【问题标题】:Kivy, create MDChip from user TextField inputKivy,从用户 TextField 输入创建 MDChip
【发布时间】:2020-07-01 02:54:24
【问题描述】:

感谢您的宝贵时间。 我有一个正在开发的应用程序。我正在尝试使我在MDTextField id: sent 中写的每个单词都变成它自己的MDChip id: chip 以供用户稍后选择。

我得到的最接近的是使用这个:

class Main(Screen):
    """main application goes here"""
    def my_callback(dt):
        def __init__(self):
            sent = self.ids.sentence.text.lower()
            print(sent)
            for word in sent.split():
                c = MDChip(label=word, icon='check')
                self.ids.chip.add_widget(c)

    Clock.schedule_interval(my_callback, 0.5)

但它不起作用。 def init(self) 似乎从未真正运行过... idk... 我已经验证了my_callback 函数被时钟正确调用了,但仅此而已。

大家有什么想法吗?

也许 Kivy 中有一个更好的函数,可以在任何时候在文本字段中输入内容时调用?我认为那将是完美的......

最终我想使用用户选择的MDChip 之一,并用一个新词替换他们的句子。我真的很感激任何帮助。

【问题讨论】:

    标签: android python-3.x kivy kivy-language


    【解决方案1】:

    您的my_callback() 方法只是定义了另一个名为__init__() 的方法,而没有实际调用该新方法。这是一个inner function,在my_callback() 之外不可见。

    尝试将my_callback() 更改为:

        def my_callback(self, dt):
            sent = self.ids.sentence.text.lower()
            print(sent)
            for word in sent.split():
                c = MDChip(label=word, icon='check')
                self.ids.chip.add_widget(c)
    

    另外,__init__() 方法是用于初始化Widget 的方法,将该方法名称用于其他目的不是好的编程习惯。

    【讨论】:

    • 约翰,你是对的。我实际上已经尝试过:def my_callback(self, dt): 但它给了我一个错误,因为我不知道如何使用以下命令调用函数:Clock.schedule_interval(my_callback, 0.5) 似乎时钟 schedule_intervals 总是传递一个“dt”变量,所以我对如何将“self”参数传递给 my_callback(self, dt):
    • self 参数会在您调用实例方法时自动添加。因此,从您发布的代码来看,my_callback() 似乎是Main 类的一个方法。使用self 参数定义的调用my_callback() 应该使用Main 的实例来完成。例如,如果您安排从Main 的实例中调用my_callback(),则应将其调用为Clock.schedule_interval(self.my_callback, 0.5)
    【解决方案2】:

    在一些帮助下我终于找到了。谢谢大家。

    class Main(Screen):
        def on_pre_enter(self):
            Window.bind(on_key_down=self.call)
    
        def call(self, *args):
            self.ids.stack.clear_widgets()
            sent = self.ids.sentence.text.lower()
            for word in sent.split():
                c = MDChip(label=word,
                           callback=self.do_something,
                           icon='checkbox-blank-outline',
                           color=[.1, .1, .1, .5],)
                self.ids.stack.add_widget(c)
    
        def do_something(self, inst, word, *args):
            inst.icon = 'checkbox-marked-outline'
    
            WORD = word
            print(WORD)
            return WORD
    

    on_pre_enter 中使用Window.bind 是最重要的。然后一切都奏效了。这是我的 KV 代码:

            MDStackLayout:
                id: stack
                orientation: 'lr-tb'
                pos_hint: {'center_x': 0.5, 'center_y': 0.6}
                padding: dp(8)
                spacing: dp(8)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 2021-12-21
      • 2016-06-11
      • 2015-12-21
      • 2016-01-10
      • 1970-01-01
      • 2014-11-06
      相关资源
      最近更新 更多