【问题标题】:Kivy: pass data to another classKivy:将数据传递给另一个类
【发布时间】:2017-08-13 15:59:11
【问题描述】:

例如,我正在尝试使用 Kivy(1.9) 制作一个简单的 GUI,使用弹出窗口更改列表中的一些选项并将其保存到数据库中。当我调用 popup() 时,Python(3.4.5) 崩溃..

main.py:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.popup import Popup
from kivy.properties import ListProperty
from kivy.lang import Builder

Builder.load_string('''
<PopView>:
    title: 'Popup'
    size_hint: (.8, .8)
    Button:
        text: 'Save'
''')

class MainApp(App):

    def build(self):
        b = Button(text='click to open popup')
        b.bind(on_click=self.view_popup())
        return b

    def view_popup(self):
        a=PopView()
        a.data=[1,2,3,4] #e.g.
        a.open()

class PopView(Popup):

    def __init__(self):
        self.data = ListProperty()

    def save_data(self):
        #db.query(self.data)
        pass


if __name__ in ('__main__', '__android__'):
    MainApp().run()

【问题讨论】:

    标签: python python-3.x class popup kivy


    【解决方案1】:

    这里有几件事。

    首先,如果您要覆盖__init__,请记得致电super
    但在这种简单的情况下,您不需要__init__

    那么,Button 上没有 on_click 事件。使用on_presson_release

    最后但同样重要的是:您不需要在绑定函数中调用该方法。只通过它(没有()

    所以现在你的例子看起来像这样。

    from kivy.app import App
    from kivy.uix.button import Button
    from kivy.uix.popup import Popup
    from kivy.properties import ListProperty
    from kivy.lang import Builder
    
    Builder.load_string('''
    <PopView>:
        title: 'Popup'
        size_hint: (.8, .8)
        Button:
            text: 'Save'
    ''')
    
    class MainApp(App):
    
        def build(self):
            b = Button(text='click to open popup')
            b.bind(on_release=self.view_popup)
            return b
    
        def view_popup(self,*args):
            a = PopView()
            a.data=[1,2,3,4] #e.g.
            a.open()
    
    class PopView(Popup):
        data = ListProperty()
    
        def save_data(self):
            #db.query(self.data)
            pass
    
    
    if __name__ in ('__main__', '__android__'):
        MainApp().run()
    

    【讨论】:

    • 它现在可以工作了,但我是新手,我仍然不明白你为什么在 view_popup() 函数中使用 *args。如果我在 __init__() 之外声明数据,我会对不同的 popview 对象有问题吗?非常感谢!
    • @JavierStacul *args 只允许您传递多个参数,而无需指定每个参数。在这种情况下,只有 Button 被传递,所以你不妨做def view_pop(self,button)。你可以试试print(args)看看。如果你这样做 **kwargs 你可以传递 key=val 参数。试试这个 def test(**kwargs): print(kwargs) 然后 test(a=1,b=2).. 即使你在 init 内部或外部定义 data ,它也将是相应对象的一个​​实例。但是,当您创建一个新的弹出窗口时,就像您每次在这种情况下所做的那样,您也会创建一个新数据。
    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2021-12-08
    相关资源
    最近更新 更多