Собираю через pyinstall.
auto-py-to-exe юзал тоже. Все другое компилится кроме этого. Уже голову сломал..
Вот собственно сам код (python 3.11) + простейшая БД (sqlite3) в аттаче:
main.py
import sqlite3 from kivy.lang import Builder from kivy.uix.screenmanager import FadeTransition from kivy.uix.screenmanager import ScreenManager, Screen from kivymd.app import MDApp from kivymd.uix.boxlayout import MDBoxLayout from kivymd.uix.button import MDRaisedButton from kivymd.uix.gridlayout import MDGridLayout from kivymd.uix.label import MDLabel db = 'testKivy01.db' # разметка Builder.load_string(""" <MainMenuScreen>: cols: 3 spacing: 5 <OtherScreen>: orientation: 'vertical' spacing: 5 """) class MainMenuScreen(MDGridLayout): def __init__(self, **kwargs): self.sm = kwargs.pop('sm', None) # Извлекаем sm из kwargs и сохраняем в self.sm super().__init__(**kwargs) # ГЛАВНОЕ МЕНЮ - КНОПКИ conn = sqlite3.connect(db) cursor = conn.cursor() cursor.execute("SELECT id, name FROM test") buttons = cursor.fetchall() for button_data in buttons: button_id, button_name = button_data button = MDRaisedButton( text=button_name, size_hint=(1 / 3, 1 / 4), height=150, ) button.elevation = 0 # button.radius = [20, 50, 50, 20] button.md_bg_normal = {'radius': [20, 20, 0, 0]} button.shadow_color = [0.15, 0.15, 0.15, 1] # Изменяем цвет фона каждой второй кнопки if button_id % 2 == 0: # Четные индексы button.md_bg_color = [0.25, 0.25, 0.25, 1] # серый else: button.md_bg_color = [0.9, 0.5, 0.12, 0.9] # золотой if button_id == 4: button.md_bg_color = [1, 0, 0, 0.5] # красный button.md_bg_normal = {'radius': [50, 50, 50, 50]} button.bind(on_release=lambda instance, id=button_id: self.switch_screen(id)) self.add_widget(button) if button_id >=12: break conn.close() def switch_screen(self, button_id): self.sm.current = f'screen_{button_id}' # Используем self.sm для переключения экранов class OtherScreen(MDBoxLayout): def __init__(self, screen_name, **kwargs): self.sm = kwargs.pop('sm', None) # Извлекаем sm из kwargs и сохраняем в self.sm super().__init__(**kwargs) self.orientation = 'vertical' return_button = MDRaisedButton(text="Вернуться на главный экран") return_button.elevation = 0 return_button.shadow_color = [0.15, 0.15, 0.15, 1] return_button.md_bg_color = [0.55, 0.55, 0.55, 1] return_button.bind(on_release=self.return_to_main) self.add_widget(return_button) label = MDLabel(text=screen_name, font_style='H4', halign='center') self.add_widget(label) def return_to_main(self, instance): self.sm.current = 'main_menu' # Используем self.sm для переключения экранов class MyApp(MDApp): def on_start(self): self.title = "testKivy01" def build(self): self.sm = ScreenManager(transition=FadeTransition()) # Сохраняем ScreenManager в self.sm main_menu_screen = MainMenuScreen(sm=self.sm) # Передаем ScreenManager в MainMenuScreen main_screen = Screen(name='main_menu') main_screen.add_widget(main_menu_screen) layout = MDBoxLayout(padding=10) layout.md_bg_color = [0.15, 0.15, 0.15, 1] layout.add_widget(self.sm) # Добавляем self.sm self.sm.add_widget(main_screen) conn = sqlite3.connect(db) cursor = conn.cursor() cursor.execute("SELECT id, name FROM test") buttons = cursor.fetchall() for button_data in buttons: button_id, button_name = button_data screen = OtherScreen(screen_name=button_name, sm=self.sm) # Передаем self.sm в OtherScreen self.sm.add_widget(Screen(name=f'screen_{button_id}')) self.sm.get_screen(f'screen_{button_id}').add_widget(screen) conn.close() return layout if __name__ == '__main__': app = MyApp() app.run()
kivyTest01.db
CREATE TABLE "test" ( "id" INTEGER, "name" TEXT );