Kivy:将数据传递给另一个类

Posted

技术标签:

【中文标题】Kivy:将数据传递给另一个类【英文标题】:Kivy: pass data to another class 【发布时间】: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()

【问题讨论】:

【参考方案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 ,它也将是相应对象的一个​​实例。但是,当您创建一个新的弹出窗口时,就像您每次在这种情况下所做的那样,您也会创建一个新数据。

以上是关于Kivy:将数据传递给另一个类的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中不使用 ODBC.DataReader 将数据传递给另一个类

将数据传递给另一个组件[重复]

通过 Redirect 将数据传递给组件

Vue-Router 将数据传递给另一个组件

将数据传递给 viewController

如何将数据传递给另一个视图函数进行处理