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_press
或on_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:将数据传递给另一个类的主要内容,如果未能解决你的问题,请参考以下文章