Python + Kivy: Просмотреть последние 10 записей в SQL, помощь с таблицей
Люди помогите. Изучаю Kivy и только сейчас узнал, что нормальные таблицы есть только у KivyMD
Мне очень нужно получать в таблицу в окне "ИСТОРИЯ" последние 10 записей. По id с сервера приходят данные, но мне нужен вход для этих данных, то есть сама таблица. А как ее реализовать я не понял.
Main.py
# CLIENT GasMeter V0.1
import socket
import pickle
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.uix.textinput import TextInput
Builder.load_file("main.kv")
BUFFER_SIZE = 4096
server_address = ('localhost', 10000)
barrel = ''
class ScreenFrame(BoxLayout):
def XZ(self):
sm.current = "XZ"
def dacha(self):
sm.current = "dacha"
def history(self):
sm.current = "history" <-----------------------------
def back_menu(self):
sm.current = "start"
class Start_Screen(Screen):
def call_base(self, server, bases):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Подключаем сокет к порту, через который прослушивается сервер
print('Подключение к {} порт {}'.format(*server_address))
sock.connect(server_address)
print('ПОДКЛЮЧЕНО')
all_data = bytearray()
# Отправка данных
obj = ['Hello']
data = pickle.dumps(obj)
sock.sendall(data)
# Смотрим ответ
data = sock.recv(BUFFER_SIZE)
all_data += data
okk = pickle.loads(all_data)
print(f'Получено: {okk}')
if 'SERVER SQL: ON' in okk[0]:
server.text = "СЕРВЕР \n ДОСТУПЕН "
bases.text = "БАЗА \n ДОСТУПНА "
elif 'SERVER SQL: OFF' in okk[0]:
server.text = "СЕРВЕР \n ДОСТУПЕН "
bases.text = "БАЗА \n НЕ ДОСТУПНА "
else:
print("ERROR 1082")
except socket.error as e:
print("Ошибка", e)
server.text = "СЕРВЕР \n НЕ ДОСТУПЕН "
bases.text = "БАЗА \n НЕ ДОСТУПНА "
finally:
print('Закрываем сокет')
sock.close()
class History_Screen(Screen): <-----------------------------
pass
class XZ_Screen(Screen):
def zavod1(self, zavod1):
global barrel
zavod1.text = "zavod_1_92_25"
barrel = zavod1.text
print(barrel)
zavod1.text = "1 - 92\n\n25m2"
def zavod2(self, zavod2):
global barrel
zavod2.text = "zavod_2_92_25"
barrel = zavod2.text
print(barrel)
zavod2.text = "2 - 92\n\n25m2"
def zavod3(self, zavod3):
global barrel
zavod3.text = "zavod_3_95_15"
barrel = zavod3.text
print(barrel)
zavod3.text = "3 - 95\n\n15m2"
def zavod4(self, zavod4):
global barrel
zavod4.text = "zavod_4_95_10"
barrel = zavod4.text
print(barrel)
zavod4.text = "4 - 95\n\n10m2"
def zavod5(self, zavod5):
global barrel
zavod5.text = "zavod_5_dt_15"
barrel = zavod5.text
print(barrel)
zavod5.text = "5 - ДТ\n\n15m2"
def zavod6(self, zavod6):
global barrel
zavod6.text = "zavod_6_dt_10"
barrel = zavod6.text
print(barrel)
zavod6.text = "6 - ДТ\n\n10m2"
class DACHA_Screen(Screen):
def dacha1(self, dacha1):
global barrel
dacha1.text = "dacha_1_92_25"
barrel = dacha1.text
print(barrel)
dacha1.text = "1 - 92\n\n25m2"
def dacha2(self, dacha2):
global barrel
dacha2.text = "dacha_2_92_25"
barrel = dacha2.text
print(barrel)
dacha2.text = "2 - 92\n\n25m2"
def dacha3(self, dacha3):
global barrel
dacha3.text = "dacha_3_95_25"
barrel = dacha3.text
print(barrel)
dacha3.text = "3 - 95\n\n25m2"
def dacha4(self, dacha4):
global barrel
dacha4.text = "dacha_4_95_25"
barrel = dacha4.text
print(barrel)
dacha4.text = "4 - 95\n\n25m2"
def dacha5(self, dacha5):
global barrel
dacha5.text = "dacha_5_98_25"
barrel = dacha5.text
print(barrel)
dacha5.text = "5 - 98\n\n25m2"
def dacha6(self, dacha6):
global barrel
dacha6.text = "dacha_6_dt_25"
barrel = dacha6.text
print(barrel)
dacha6.text = "6 - ДТ\n\n25m2"
class Save(Screen):
def clear_inputs(self):
save = self.manager.get_screen('save')
for child in reversed(save.ids.container.children):
if isinstance(child, TextInput):
child.text = ''
print("CLEAR")
def send_to_server(self, text_0, text_1, text_2, text_3, text_4):
print(barrel)
print(text_0.text)
print(text_1.text)
print(text_2.text)
print(text_3.text)
print(text_4.text)
try:
# СоздаемTCP/IP сокет
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Подключаем сокет к порту, через который прослушивается сервер
print('Подключено к {} порт {}'.format(*server_address))
sock.connect(server_address)
# Отправка данных
obj = [barrel, text_0.text, text_1.text, text_2.text, text_3.text, text_4.text]
print('Отправка:', obj)
data = pickle.dumps(obj)
sock.sendall(data)
print('Close')
sock.close()
except socket.error as e:
print("Ошибка", e)
finally:
print('Закрываем сокет')
sock.close()
class Finish(Screen):
pass
# Скрин манагер
sm = ScreenManager()
sm.add_widget(Start_Screen(name='start'))
sm.add_widget(History_Screen(name='history')) <-----------------------------
sm.add_widget(DACHA_Screen(name='dacha'))
sm.add_widget(XZ_Screen(name='XZ'))
sm.add_widget(Save(name='save'))
sm.add_widget(Finish(name='finish'))
class MainApp(App):
def build(self):
return sm
if __name__ == "__main__":
MainApp().run()
main.kv
<ScreenFrame>:
orientation: 'vertical'
cols: 2
ActionBar:
ActionView:
pos_hint: {'top':1}
use_separator: True
ActionPrevious:
title: "Семь раз замерь, один раз залей"
with_previous: False
ActionButton:
text: "На главную"
on_press: root.back_menu()
BoxLayout:
orientation: 'vertical'
cols: 2
size_hint: 1, 0.30
Button:
text: "ИСТОРИЯ"
on_release: root.history()
BoxLayout:
orientation: 'horizontal'
cols: 2
size_hint: 1, 1
Button:
text: "ХЛЕБЗАВОД"
on_release: root.XZ()
Button:
text: "ДАЧНАЯ"
on_release: root.dacha()
<Start_Screen>:
ScreenFrame:
BoxLayout:
Label:
text: "?"
id: server
Label:
text: "?"
id: bases
Button:
text: "ОБНОВИТЬ"
on_release: root.call_base(server, bases)
<History_Screen>: < ------------------------- ----------------
ScreenFrame:
BoxLayout:
Button:
text: "Получить"
<XZ_Screen>:
ScreenFrame:
BoxLayout:
orientation: 'vertical'
cols: 2
size_hint: 1, 1
BoxLayout:
orientation: 'horizontal'
cols: 1
size_hint: 1, 1
Button:
text: "1 - 92\n\n25m2"
id: zavod1
on_press: root.zavod1(zavod1)
on_press: app.root.current = 'save'
Button:
text: "2 - 92\n\n25m2"
id: zavod2
on_press: root.zavod2(zavod2)
on_press: app.root.current = 'save'
BoxLayout:
orientation: 'horizontal'
cols: 1
size_hint: 1, 1
Button:
text: "3 - 95\n\n15m2"
id: zavod3
on_press: root.zavod3(zavod3)
on_press: app.root.current = 'save'
Button:
text: "5 - ДТ\n\n15m2"
id: zavod5
on_press: root.zavod5(zavod5)
on_press: app.root.current = 'save'
BoxLayout:
orientation: 'horizontal'
cols: 1
size_hint: 1, 1
Button:
text: "4 - 95\n\n10m2"
id: zavod4
on_press: root.zavod4(zavod4)
on_press: app.root.current = 'save'
Button:
text: "6 - ДТ\n\n10m2"
id: zavod6
on_press: root.zavod6(zavod6)
on_press: app.root.current = 'save'
<DACHA_Screen>:
ScreenFrame:
BoxLayout:
orientation: 'vertical'
cols: 4
size_hint: 1, 1
Button:
text: "1 - 92\n\n25m2"
id: dacha1
on_press: root.dacha1(dacha1)
on_press: app.root.current = 'save'
Button:
text: "2 - 92\n\n25m2"
id: dacha2
on_press: root.dacha2(dacha2)
on_press: app.root.current = 'save'
Button:
text: "4 - 95\n\n25m2"
id: dacha4
on_press: root.dacha4(dacha4)
on_press: app.root.current = 'save'
Button:
text: "3 - 95\n\n25m2"
id: dacha3
on_press: root.dacha3(dacha3)
on_press: app.root.current = 'save'
Button:
text: "5 - 98\n\n25m2"
id: dacha5
on_press: root.dacha5(dacha5)
on_press: app.root.current = 'save'
Button:
text: "6 - ДТ\n\n25m2"
id: dacha6
on_press: root.dacha6(dacha6)
on_press: app.root.current = 'save'
<Save>:
ScreenFrame:
BoxLayout:
orientation: 'vertical'
cols: 4
size_hint: 1, 1
id: container
Label:
text: 'Операторские продажи'
TextInput:
text: ''
input_filter: 'int'
id: text_0
multiline: False
Label:
text: 'ЗАМЕР ДО СЛИВА (см)'
TextInput:
text: ''
input_filter: 'int'
id: text_1
multiline: False
Label:
text: 'ОБЪЕМ БЕНЗОВОЗА (л)'
TextInput:
text: ''
input_filter: 'int'
id: text_2
multiline: False
Label:
text: 'ЗАМЕР ПОСЛЕ СЛИВА (см)'
TextInput:
text: ''
input_filter: 'int'
id: text_3
multiline: False
Label:
text: 'ПОКАЗАНИЯ СЧЁТЧИКА'
TextInput:
text: ''
input_filter: 'int'
id: text_4
multiline: False
Button:
text: "ЗАПИСАТЬ В БАЗУ"
on_press: root.send_to_server(text_0, text_1, text_2, text_3, text_4)
on_release: root.clear_inputs()
on_press: app.root.current = 'finish'
<Finish>:
ScreenFrame:
BoxLayout:
Label:
text: "НОВАЯ ЗАПИСЬ ДОБАВЛЕНА УСПЕШНО"
И вот конечно же код таблицы, помогите просто оптимизировать в мой код и дать входящие для заполнения таблицы.
from kivymd.app import MDApp
from kivymd.uix.screen import Screen
from kivymd.uix.datatables import MDDataTable
from kivy.metrics import dp
class DemoApp(MDApp):
def build(self):
screen = Screen()
data_table = MDDataTable(pos_hint={'center_x': 0.5, 'center_y': 0.5},
size_hint=(0.9, 0.6),
check=True,
rows_num=10,
column_data=[
("No.", dp(18)),
("Food", dp(20)),
("Calories", dp(20))
],
row_data=[
("1", "Burger", "300"),
("2", "Oats", "200"),
("3", "Oats", "200"),
("4", "Oats", "200"),
("5", "Oats", "200"),
("6", "Oats", "200"),
("7", "Oats", "200"),
("8", "Oats", "200")
]
)
data_table.bind(on_row_press=self.on_row_press)
data_table.bind(on_check_press=self.on_check_press)
screen.add_widget(data_table)
return screen
def on_row_press(self, instance_table, instance_row):
print(instance_table, instance_row)
def on_check_press(self, instance_table, current_row):
print(instance_table, current_row)
DemoApp().run()
Из за этой путаницы с kivy и kivyHD я потерялся. Мне будет достаточно, чтоб таблица хотя бы отображалась при нажатии на кнопу "ИСТОРИЯ"