Просмотр исходного кода

SVI Добавление графики и логики

SVI 2 месяцев назад
Родитель
Сommit
c21e7a325f

+ 2 - 2
lev0/pak_svi/mod_env.py

@@ -57,10 +57,10 @@ def env_bool(name_env: str) -> Result[bool]:
     """Возвращает строку из переменной окружения"""
     param: str | None = os.getenv(name_env)
     if param is None:
-        return Result(err=f"env_str(): env {name_env} is None")
+        return Result(err=f"env_bool(): env {name_env} is None")
     param = param.upper()
     if param == "TRUE":
         return Result(result=True)
     if param == "FALSE":
         return Result(result=False)
-    return Result(err=f"env_str(): env {name_env} bad, val={param}")
+    return Result(err=f"env_bool(): env {name_env} bad, val={param}")

+ 7 - 0
lev1/__init__.py

@@ -0,0 +1,7 @@
+"""
+Базовые компоненты языка
+"""
+
+from .pak_context import Context
+
+__all__ = ["Context"]

+ 7 - 0
lev1/pak_context/__init__.py

@@ -0,0 +1,7 @@
+""""
+Пакет контекста языка
+"""
+
+from .mod_context import Context
+
+__all__ = ["Context"]

+ 67 - 0
lev1/pak_context/mod_context.py

@@ -0,0 +1,67 @@
+"""
+Модуль контекста prolet.
+Это главная конструкция языка
+"""
+
+from lev0 import Logger
+
+
+class Context:
+    """
+    Контекст каждого выражения.
+    Основа всего языка.
+    """
+
+    def __init__(self, src: str | None = None,
+                 param: str | None = None) -> None:
+        """
+        Конструктор контекста
+        @src - исходный код
+        @param - параметр
+        """
+        self.__log = Logger("Context")
+        self.__log("")
+        if src is None and param is None:
+            self.__log.error("Ошибка конструктора: строка кода и " +
+                             "параметры отсутствуют")
+            exit(4)
+        self.__param: str = ""
+        if param is not None:
+            self.__param = param
+        self.__lst_ctx: list[Context] = []
+        if src is None:
+            self.__tail: str = ""
+            return
+        # Отбор своего выражения
+        lit = src[0]
+        self.__line = lit
+        while lit != ")":
+            if lit != "(":  # Простой перебор контекста со всеми переменными
+                lit = src[0]
+                self.__line += lit
+                src = src[1:]
+                continue
+            # Начался новый контекст
+            ctx = Context(src)
+            self.__lst_ctx.append(ctx)
+            src = ctx.tail
+            lit = src[0]
+        # Остаток строки перебора
+        self.__tail = src
+
+    @property
+    def param(self) -> str:
+        """
+        Возвращает параметр
+        """
+        if self.__param == "":
+            self.__log.error("")
+            exit(5)
+        return self.__param
+
+    @property
+    def tail(self) -> str:
+        """
+        Возвращает хвост исходного кода
+        """
+        return self.__tail

+ 5 - 0
lev3/pak_app/mod_app.py

@@ -4,6 +4,7 @@
 
 from lev0 import Logger
 from lev3.pak_gui import Gui
+from lev3.pak_lang import Lang
 
 
 class ProletApp:
@@ -14,12 +15,16 @@ class ProletApp:
     def __init__(self) -> None:
         self.__log = Logger("ProletApp")
         self.__log.debug("")
+        self.__lang = Lang()
         self.__gui = Gui()
+        self.__gui.txt_code.insert("1.0", self.__lang.start_file)
+        self.__gui.set_fn_step(self.__lang.step)
 
     def run(self) -> None:
         """
         Запуск приложения
         """
         self.__log.debug(msg="start")
+
         self.__gui.run()
         self.__log("end")

+ 8 - 0
lev3/pak_gui/mod_gui.py

@@ -2,6 +2,7 @@
 Главный интерфейс
 """
 
+from collections.abc import Callable
 from lev0 import Logger
 from .pak_win_main import WinMain
 
@@ -15,6 +16,13 @@ class Gui:
         self.__log = Logger("Gui")
         self.__log("")
         self.__win_main = WinMain()
+        self.txt_code = self.__win_main.frm_code.txt_code
+
+    def set_fn_step(self, fn_step: Callable[[], None]) -> None:
+        """
+        Установка функции для выполнения шага
+        """
+        self.__win_main.set_fn_step(fn_step)
 
     def run(self) -> None:
         """

+ 11 - 0
lev3/pak_gui/pak_win_main/mod_win_main.py

@@ -2,8 +2,11 @@
 Главное окно приложения
 """
 
+from collections.abc import Callable
+
 from tkinter import Tk
 from lev0 import Logger
+from .pak_frm_code import FrmCode
 from .pak_frm_status import FrmStatus
 
 
@@ -19,6 +22,14 @@ class WinMain(Tk):
         self.title("Prolet")
         self.geometry("1000x600")
         self.__frm_status = FrmStatus(self)
+        self.frm_code = FrmCode(self)
+
+    def set_fn_step(self, fn_step: Callable[[], None]) -> None:
+        """
+        Устанавливает функцию для передачи значения
+        """
+        assert fn_step is not None, "fn_step is None"
+        self.__frm_status.set_fn_step(fn_step)
 
     def run(self) -> None:
         """

+ 7 - 0
lev3/pak_gui/pak_win_main/pak_frm_code/__init__.py

@@ -0,0 +1,7 @@
+"""
+Фрейм с кодом главного окна
+"""
+
+from .mod_frm_code import FrmCode
+
+__all__ = ["FrmCode"]

+ 17 - 0
lev3/pak_gui/pak_win_main/pak_frm_code/mod_frm_code.py

@@ -0,0 +1,17 @@
+"""
+Форма статуса главного окна
+"""
+
+from tkinter import Text, Tk, Frame
+
+
+class FrmCode(Frame):
+    """
+    Форма кода главного окна
+    """
+
+    def __init__(self, root: Tk):
+        Frame.__init__(self, root, border=3, relief="sunken")
+        self.pack(fill="both", expand=True)
+        self.txt_code = Text(self, border=2, relief="raised")
+        self.txt_code.pack(fill="both", expand=True)

+ 25 - 1
lev3/pak_gui/pak_win_main/pak_frm_status/mod_frm_status.py

@@ -2,10 +2,13 @@
 Фрейм статуса главного окна
 """
 
+from collections.abc import Callable
 from datetime import date
 import time
 from tkinter import Frame, Label, Tk, Button
 
+from lev0 import Logger
+
 
 class FrmStatus(Frame):
     """
@@ -13,6 +16,7 @@ class FrmStatus(Frame):
     """
 
     def __init__(self, winMain: Tk) -> None:
+        self.__log = Logger("FrmStatus")
         Frame.__init__(self, master=winMain, border=3, relief="raised")
         self.pack(fill="x", side="bottom")
         self.__lbl_date = Label(self, text="Date: 2024-01-01",
@@ -26,16 +30,36 @@ class FrmStatus(Frame):
                                  command=self.__exit, border=2,
                                  relief="groove", bg="red")
         self.__btn_exit.pack(side="right")
+        self.__fn_step: Callable[[], None] | None = None
+        self.__btn_step = Button(self, text="Step",
+                                 command=self.__step, border=2,
+                                 relief="groove", bg="yellow")
+        self.__btn_step.pack(side="left")
+
+    def set_fn_step(self, fn_step: Callable[[], None]) -> None:
+        """
+        Устанавливает функцию для передачи значения
+        """
+        self.__fn_step = fn_step
+
+    def __step(self) -> None:
+        """
+        Выполнение шага
+        """
+        self.__log("step!")
+        if self.__fn_step is not None:
+            self.__fn_step()
 
     def __exit(self) -> None:
         """
         Выход из программы
         """
+        self.__log("exit")
         exit(0)
 
     def __next_tick(self) -> None:
         """
-        Следующий тик
+        Следующий тик для меток времени
         """
         self.__lbl_date["text"] = f"Date: {date.today()}"
         self.__lbl_time["text"] = f"Time: {time.strftime('%H:%M:%S')}"

+ 7 - 0
lev3/pak_lang/__init__.py

@@ -0,0 +1,7 @@
+"""
+Пакет содержит код языка и вспомогательные инструменты
+"""
+
+from .mod_lang import Lang
+
+__all__ = ["Lang"]

+ 49 - 0
lev3/pak_lang/mod_lang.py

@@ -0,0 +1,49 @@
+"""
+Инструменты языка и вспомогательные инструменты.
+"""
+
+from lev0 import Logger
+from lev1 import Context
+
+
+class Lang:
+    """
+    Главный класс языка
+    """
+
+    def __init__(self) -> None:
+        self.__log = Logger("Lang")
+        self.__log("start")
+        self.__src: str = ""
+        self.__lst_ctx: list[Context] = []
+
+    def step(self) -> None:
+        """
+        Шаг выполнения
+        """
+        self.__log("step!")
+
+    @property
+    def start_file(self) -> str:
+        """
+        Содержимое стартового файла
+        """
+        try:
+            f = open("./plt/main.plt", "r", encoding="utf-8")
+            self.__src = f.read()
+            f.close()
+        except Exception as e:
+            self.__log.error(msg=f"Ошибка при чтении файла, ош=\n\t{e}")
+        return self.__src
+
+    def parse_ctx(self) -> None:
+        """
+        Парсинг контекстов программы
+        """
+        self.__log("")
+        src = self.__src
+        while src != "":
+            lit = src[0]
+            if lit == "(":
+                ctx = Context(src)
+                self.__lst_ctx.append(ctx)

+ 1 - 0
plt/main.plt

@@ -0,0 +1 @@
+(уст 0 рег0)