design in .kv, callback in .py.
class ListViewer(FloatLayout):
app = ObjectProperty(None)
lview = ObjectProperty(None)
transport = ObjectProperty(None)
data_items = ListProperty([])
chan_dict = DictProperty({}) #I'm Assuming.
def _args_converter(self, row_index, obj):
_dict = {'channel': obj.channel,
'size_hint_y': None,
'obj': self.app.main,
'twisted_obj': self.transport}
return _dict
def update_widget(self):
#self.chan_dict = {...}
#self.data_items = []
for i in self.chan_dict:
self.data_items.append(DataItem(text=self.chan_dict[i].channel, channel=self.chan_dict[i]))
# Updating your 'data' will AUTOMATICALLY update your `ListView`
def selection_changed(self, *args):
print 'You can even bind a callback that does something when your selection changes, if you want.'
class MyApp(App):
main = ObjectProperty()
def build(self):
app = ListViewer()
app.update_widget()
return app
Builder.load_string("""
#Note: `ListAdapter`s declare differently in kvlang (see here).
<ListViewer>:
lview: lview_id
app: app
ListView:
id: lview_id
pos_hint: {'center_x': 0.5, 'center_y': 0.5}
size_hint: 0.5, 0.7
on_selection_change: root.selection_changed(*args)
adapter:
ListAdapter(
data=root.data_items,
selection_mode='single',
args_converter=root._args_converter,
propagate_selection_to_data=True,
allow_empty_selection=False,
cls=Nimalist)
""")
if __name__ == '__main__':
MyApp().run()"...about your solution I don't understand what is the diffrence between kv languege and python class? as I know there is not any diffrence between them. am I right?"
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.uix.ScreenManager import Screen
from kivy.properties import StringProperty, ObjectProperty, BooleanProperty
class FriendWidget(Widget):
bg_image = StringProperty('')
class MyWidget(Widget):
my_friend = ObjectProperty(None)
foobar = BooleanProperty(False)
def on_foobar(self, *args):
if self.foobar:
self.my_friend.bg_image = ''
def on_touch_down(self, touch):
if self.collide_point(*touch.pos):
self.foobar = not self.foobar
return True
else:
return False
class MyScreen(Screen):
pass
kv = """
<FriendWidget>:
bg_image: 'atlas://data/images/defaulttheme/button_disabled'
canvas.before:
BorderImage:
source: self.bg_image
size: self.size
pos: self.pos
<MyWidget>:
canvas.before:
BorderImage:
source:'atlas://data/images/defaulttheme/button'
size: self.size
pos: self.pos
<MyScreen>:
name: 'My Screen'
FriendWidget:
id: friend_widget_id
size_hint: 0.1, 0.1
pos_hint: {'center_x': 0.25, 'center_y': 0.5}
MyWidget:
my_friend: friend_widget_id
size_hint: 0.1, 0.1
pos_hint: {'center_x': 0.75, 'center_y': 0.5}
"""
class MyApp(App):
def build(self):
Builder.load_string(kv)
return MyScreen()
if __name__ == '__main__':
MyApp().run()