@PashaLynx
Страшный дилетант

Kivy — как сделать галочки в приложении todo-шке?

Всем доброго времени суток. Начал изучать 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'


Также хотелось бы узнать, никто не знает, можно ли сделать так, чтобы дело можно было перетащить в какую-то область на экране - корзину, и дело бы удалялось. Заранее спасибо всем за помощь.
  • Вопрос задан
  • 127 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы