Найти - Пользователи
Полная версия: KivyMD компиляция в EXE
Начало » GUI » KivyMD компиляция в EXE
1
Vlad174
Всем привет! Я новичок) самоучка. Столкнулся с проблемой компиляции под винду. Сообственно испробывал уже всё прежде чем искать ресурс и идти сюда :-)
Собираю через 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
);





ZerG
Картинка не читабельна
ЛОг ошибки и команду на создание ЕХЕ файла в студию
Vlad174
скрин

команда
pyinstaller --noconfirm --onedir --windowed --log-level "DEBUG" --strip --add-data "D:/_apps/testKivy01/testKivy01.db;." --paths "D:/_apps/testKivy01"  "D:/_apps/testKivy01/main.py"

Логи в аттаче
Vlad174
Так никто и не ответил)) смысл этого сообщества
Я уже переписал всё на pyqt и всё компилится как надо. Но конечно мне kivy понравился больше. Удобнее как-то.
xam1816
Vlad174
Так никто и не ответил)) смысл этого сообщества
Отключи логирование в киви
py.user.next
Vlad174
Всем привет! Я новичок) самоучка. Столкнулся с проблемой компиляции под винду. Сообственно испробывал уже всё прежде чем искать ресурс и идти сюда :-)
Собираю через pyinstall.
Здесь писал про установку.

Vlad174
Так никто и не ответил)) смысл этого сообщества
Да устали уже писать две вещи по сто раз. 1) Не используй kivy и питон для смартфона. 2) Не компилируй код, делай установщик.

Vlad174
Я уже переписал всё на pyqt и всё компилится как надо. Но конечно мне kivy понравился больше. Удобнее как-то.
Дальше оно не будет запускаться на всех компьютерах. И ты с этим столкнёшься в самый неожиданный момент - когда прогу запустить надо будет срочно и полюбому, а времени на её переделку не будет вообще.
Vlad174
xam1816
Благодарю! Это помогло

py.user.next
Спасибо! Про установщик отличный совет) намотаю на ус
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB