Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
У вас код не Python 3, и вообще не pythonic. Начиная с многочисленных нарушений PEP-8, заканчивая названиями переменных btn1, txt1 и бесполезными комментариями типа # очистить список.
Если делаете что-то для примера, то стоило бы вылизать код, тем более, что он настолько короткий.
Все-таки лучше делать разметку 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 kivy для разнообразия рациона питания. От кода и до получения .apk файла для Android