Всем доброго времени суток. Начал изучать kivy, делаю приложение todo-шку. Возник вопрос - как в списке дел в каждом деле иметь окошко куда можно поставить галочку.
Код main.py
import os
import ast
import time
from datetime import datetime
from kivy.app import App
from kivy import PY2
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import Screen
from kivy.config import ConfigParser
from kivy.lang import Builder
from kivy.factory import Factory
if not PY2:
Builder.load_string(open('ui.kv', encoding='utf-8').read())
else:
Builder.load_file('ui.kv')
class SortedListFood(Screen):
def on_enter(self):
data_foods = self.get_data_foods()
self.set_list_foods(data_foods)
def get_data_foods(self):
return ast.literal_eval(
App.get_running_app().config.get('General', 'user_data'))
def set_list_foods(self, data_foods):
for f, d in sorted(data_foods.items(), key=lambda x: x[1]):
fd = f.decode('u8') + ' ' + (datetime.fromtimestamp(d).strftime(
'%Y-%m-%d'))
data = {'viewclass': 'Button', 'text': fd}
if data not in self.ids.rv.data:
self.ids.rv.data.append({'viewclass': 'Button', 'text': fd})
class AddFood(Screen):
_app = ObjectProperty()
def set_user_data(self, input_food):
self._app.user_data = \
ast.literal_eval(self._app.config.get('General', 'user_data'))
self._app.user_data[input_food.encode('u8')] = int(time.time())
def save_user_data(self):
self._app.config.set('General', 'user_data', self._app.user_data)
self._app.config.write()
def set_new_food(self, name_food):
if not PY2:
self.ids.result_label.text = \
"Последнее дело: " + name_food
else:
self.ids.result_label.text = \
u"Последнее дело: " + name_food
def button_clicked(self, input_food):
self.set_user_data(input_food)
self.save_user_data()
self.set_new_food(input_food)
class FoodOptionsApp(App):
def __init__(self, **kvargs):
super(FoodOptionsApp, self).__init__(**kvargs)
self.config = ConfigParser()
self.screen_manager = Factory.ManagerScreens()
self.user_data = {}
def build_config(self, config):
config.adddefaultsection('General')
config.setdefault('General', 'user_data', '{}')
def set_value_from_config(self):
self.config.read(os.path.join(self.directory, '%(appname)s.ini'))
self.user_data = ast.literal_eval(self.config.get(
'General', 'user_data'))
def get_application_config(self):
return super(FoodOptionsApp, self).get_application_config(
'{}/%(appname)s.ini'.format(self.directory))
def build(self):
return self.screen_manager
if __name__ == '__main__':
FoodOptionsApp().run()
код .kv
<ManagerScreens@ScreenManager>:
MenuScreen:
id: men
SortedListFood:
id: list_todo
AddFood:
id: add_todo
<MenuScreen@Screen>:
name: "menu"
canvas:
Color:
rgba: 1, 1, 1, 1
Rectangle:
pos: self.pos
size: self.size
BoxLayout:
orientation: 'vertical'
Button:
text: "Список дел"
on_release: app.screen_manager.current = 'list_todo'
Button:
text: "Добавить дело"
on_release: app.screen_manager.current = 'add_todo'
<AddFood>:
name: "add_todo"
_app: app
BoxLayout:
orientation: 'vertical'
Button:
text: '< Назад в главное меню'
on_press: app.screen_manager.current = 'menu'
size_hint_y: None
height: dp(40)
TextInput:
id: field_food
multiline: False
height: dp(40)
size_hint_y: None
hint_text: "Дело"
Button:
text: "Добавить дело"
size_hint_y: None
height: dp(40)
on_press:
if field_food.text != '': root.button_clicked(field_food.text); \
field_food.text = ''
Label:
id: result_label
<SortedListFood>:
name: "list_todo"
BoxLayout:
orientation: 'vertical'
Button:
text: '< Назад в главное меню'
on_press: app.screen_manager.current = 'menu'
size_hint_y: None
height: dp(40)
RecycleView:
id: rv
key_viewclass: 'viewclass'
key_size: 'height'
RecycleBoxLayout:
default_size: None, dp(40)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
Также хотелось бы узнать, никто не знает, можно ли сделать так, чтобы дело можно было перетащить в какую-то область на экране - корзину, и дело бы удалялось. Заранее спасибо всем за помощь.