Comments 15

У вас код не Python 3, и вообще не pythonic. Начиная с многочисленных нарушений PEP-8, заканчивая названиями переменных btn1, txt1 и бесполезными комментариями типа # очистить список.


Если делаете что-то для примера, то стоило бы вылизать код, тем более, что он настолько короткий.

Замечания приняты. Простите меня лентяя.
Если кому любопытно, то вот та же программа но уже с kv-файлами:
https://github.com/Alexmod/FoodOptionKV
Правда без buildozer.spec и я ее не проверял для сборки apk.

Все-таки лучше делать разметку UI именно с помощью KV Language. Структура элементов гораздо четче прослеживается, проще вносить изменения да и код самого UI не мешается под ногами в коде. Например, вот так было бы несколько лучше:


<ManagerScreens@ScreenManager>:

    MenuScreen:
        id: men
    SortedListFood:
        id: list_food
    AddFood:
        id: add_food

<MenuScreen@Screen>:
    name: "menu"

    BoxLayout:
        orientation: 'vertical'
        Button:
            text: "Дневник питания"
            on_press: app.screen_manager.current = 'list_food'
        Button:
            text: "Добавить блюдо в дневник питания"
            on_press: app.screen_manager.current = 'add_food'

<AddFood>:
    name: "add_food"
    _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_food"

    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'

Теперь код Python содержит только логику приложения:


import os
import ast
import time

from datetime import datetime

from kivy.app import App
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

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):
        self.ids.result_label.text = \
            "Последнее добавленное блюдо:  " + 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()
Простите за оффтоп, но овсянку нельзя есть каждый день на протяжении десятилетий. Она содержит фитиновую кислоту, которая препятствует усвоению кальция.
Я не знаю, возможно это и не оффтоп, так как я разместил эту статью в разделе «Здоровье гика», помимо python.
актуально для мест с очень жесткой водой, настолько жесткой что самый дорогой гейзеровский фильтр убивается дней за 10
Безотносительно кода приложения и гастрономических пристрастий спасибо за наводку на kivy. Будет, с чем поиграть на досуге.
Спасибо за коммент. Статья писалась как раз ради того, чтобы показать, что на kivy можно очень быстро получать кросс-платформенные приложения для Android, Windows, Linux и MacOS, а гастрономия и пример кода – это лишь образец, чтобы быстро запустить и проверить работоспособность.
Про то как создать приложение kivy для IOS ждем статью от HeaTTheatR
Ухх, оказывается, есть люди, которым такие же мысли приходят в голову. Я уж давно делал подобное приложение, даже с обменом блюдами через сеть.
«Чо куснуть» называется в Маркете.
Только никому оно не нужно, без раскрутки, как собственно, обычно последние годы.
Подскажите, а с блютуз как он уживается? можно ли пример кода сервера и клиента голубого зуба?
Only those users with full accounts are able to leave comments. Log in, please.