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 я потерялся. Мне будет достаточно, чтоб таблица хотя бы отображалась при нажатии на кнопу "ИСТОРИЯ"


Ответы (0 шт):