Эх сурвалжийг харах

d01 Добавление интерфейсов

SVI 2 жил өмнө
parent
commit
8fd7dc084e

+ 13 - 0
desktop/app/app.py

@@ -0,0 +1,13 @@
+"""Глобальный объект приложения."""
+
+from .kernel import kernel
+from .gui import gui
+
+
+class App:
+    """Глобальный объект приложения."""
+
+    def __init__(self) -> None:
+        """Создаёт новый объект приложения."""
+        self.kern: kernel.Kernel = kernel.Kernel()
+        self.gui: gui.Gui = gui.Gui(self)

+ 17 - 0
desktop/app/gui/gui.py

@@ -0,0 +1,17 @@
+"""Графическая подсистема клиента."""
+
+from typ import typ
+from app.gui.win_main import win_main
+
+
+class Gui:
+    """Графическая подсистема клиента."""
+
+    def __init__(self, app: typ.IApp) -> None:
+        """Возвращает новый экземпляр приложения."""
+        self.win: win_main.WinMain = win_main.WinMain(app)
+        "Главное окно приложения"
+
+    def run(self) -> None:
+        """Запускает графику в главную петлю."""
+        self.win.run()

+ 0 - 0
desktop/win_login/win_login.py → desktop/app/gui/win_login/win_login.py


+ 10 - 5
desktop/win_main/frm_down/frm_down.py → desktop/app/gui/win_main/frm_down/frm_down.py

@@ -1,12 +1,16 @@
-"""Нижний фрейм главного окна"""
+"""Нижний фрейм главного окна."""
 import tkinter
 
+from typ.iapp import IApp
+
 
 class FrmDown(tkinter.Frame):
-    """Нижний фрейм главного окна"""
-    def __init__(self, win: tkinter.Tk) -> None:
-        tkinter.Frame.__init__(self, win)
-        self.win: tkinter.Tk = win
+    """Нижний фрейм главного окна."""
+
+    def __init__(self, app: IApp) -> None:
+        """Возвращает новый объект нижнего фрейма главного окна."""
+        tkinter.Frame.__init__(self, app.gui().win_main())
+        self.win: tkinter.Tk = app.gui().win_main()
         self.btn_exit: tkinter.Button = tkinter.Button(self, text="Выход")
         self.btn_exit["command"] = self.quit
         self.btn_exit["fg"] = "#f00"
@@ -17,5 +21,6 @@ class FrmDown(tkinter.Frame):
         self.pack(expand=False, side="bottom", fill="x")
 
     def quit(self) -> None:
+        """Заставляет выйти изприложения."""
         print("FrmDown.quit()")
         self.win.destroy()

+ 6 - 5
desktop/win_main/main_menu/main_menu.py → desktop/app/gui/win_main/main_menu/main_menu.py

@@ -1,20 +1,21 @@
 """Меню главного окна"""
 
 import tkinter
-from win_login import win_login
+from typ.iapp import IApp
 
 
 class MainMenu(tkinter.Menu):
     """Главное меню главного окна"""
-    def __init__(self, win: tkinter.Tk) -> None:
-        tkinter.Menu.__init__(self, master=win)
-        self.win: tkinter.Tk = win
+
+    def __init__(self, app: IApp) -> None:
+        tkinter.Menu.__init__(self, master=app.gui().win_main())
+        self.win: tkinter.Tk = app
         mnu_file: tkinter.Menu = tkinter.Menu(master=self)
         mnu_file.add_command(label="Логин", command=self.login)
         mnu_file.add_separator()
         mnu_file.add_command(label="Выход", command=self.quit)
         self.add_cascade(label="Файл", menu=mnu_file)
-        win.config(menu=self)
+        app.config(menu=self)
 
     def login(self) -> None:
         """Выполняет логин на сервер"""

+ 24 - 0
desktop/app/gui/win_main/win_main.py

@@ -0,0 +1,24 @@
+"""Главное окно клиента вар-танка"""
+import tkinter
+from typ.iapp import IApp
+from typ.iwin_main import IWinMain
+from .frm_down import frm_down
+from .main_menu import main_menu
+
+
+class WinMain(tkinter.Tk, IWinMain):
+    """Главное окно клинта вартанка."""
+
+    def __init__(self, app: IApp) -> None:
+        tkinter.Tk.__init__(self)
+        self.wm_title("WarTank")
+        self.minsize(640, 480)
+        self.frm_down: frm_down.FrmDown = frm_down.FrmDown(app)
+        "Нижний фрейм главного окна"
+        self.menu: main_menu.MainMenu = main_menu.MainMenu(app)
+        "Меню главного окна"
+        self._app: IApp = app
+
+    def run(self) -> None:
+        """Запускает графику в работу."""
+        self.mainloop()

+ 2 - 1
desktop/kernel/kernel.py → desktop/app/kernel/kernel.py

@@ -1,11 +1,12 @@
 """Ядро логики клиента."""
 
-from .user import user
+from app.kernel.user import user
 
 
 class Kernel:
     """Ядро логики клиента."""
 
     def __init__(self) -> None:
+        """Создаёт экземпляр ядра."""
         self.user: user.User = user.User()
         "Пользователь клиента"

+ 25 - 0
desktop/app/kernel/user/user.py

@@ -0,0 +1,25 @@
+"""Пользователь клиента."""
+
+
+from typ import typ
+from app.kernel.user.user_login import user_login
+from app.kernel.user.user_pass import user_pass
+
+
+class User(typ.IUser):
+    """Пользователь клиента."""
+
+    def __init__(self) -> None:
+        """Возвращает новы   объект пользователя клиента."""
+        self._login: typ.ILogin = user_login.UserLogin()
+        "Логин юзера"
+        self._password: typ.IPass = user_pass.UserPass()
+        "Пароль юзера"
+
+    def login(self) -> typ.ILogin:
+        """Логин пользователя."""
+        return self._login
+
+    def password(self) -> typ.IPass:
+        """Пароль пользователя."""
+        return self._password

+ 8 - 4
desktop/kernel/user/user_login/user_login.py → desktop/app/kernel/user/user_login/user_login.py

@@ -1,7 +1,9 @@
 """Логин пользователя клиента."""
 
+from typ import typ
 
-class UserLogin:
+
+class UserLogin(typ.ILogin):
     """Логин пользователя клиента."""
 
     def __init__(self) -> None:
@@ -13,10 +15,12 @@ class UserLogin:
         """Возвращает хранимый логин клиента."""
         return self._login
 
-    def set(self, login: str) -> str:
+    def set(self, val: str) -> str:
         """Устанавливает значение логина клиента.
-            Возвращает ошибку, если логин пустой или установлен ранее."""
-        if login == "":
+
+        Возвращает ошибку, если логин пустой или установлен ранее.
+        """
+        if val == "":
             return "UserLogin.set(): логин пустой"
         if self._login != "":
             return "UserLogin.set(): логин установлен ранее"

+ 24 - 0
desktop/app/kernel/user/user_pass/user_pass.py

@@ -0,0 +1,24 @@
+"""Пароль пользователя клиента."""
+
+from typ import typ
+
+
+class UserPass(typ.IPass):
+    """Пароль пользователя клиента."""
+
+    def __init__(self) -> None:
+        """Возвращает новый пароль пользователя."""
+        self._pass: str = ""
+
+    def get(self) -> str:
+        """Возвращает хранимый пароль."""
+        return self._pass
+
+    def set(self, val: str) -> str:
+        """Устанавливает новое значение пароля пользователя клиента."""
+        if val == "":
+            return "UserPass.set(): password is empty"
+        if self._pass != "":
+            return "User.password_set(): пароль уже установлен"
+        self._pass = val
+        return ""

+ 6 - 5
desktop/desktop.py

@@ -1,12 +1,13 @@
-"""Пускач для десктоп-клиента сервера вар-танк"""
+"""Пускач для десктоп-клиента сервера вар-танк."""
+
 
-from win_main import win_main
 
 
 def main() -> None:
-    """Главная функци клиента"""
-    win: win_main.WinMain = win_main.WinMain()
-    win.run()
+    """Главная функци клиента."""
+    kern: kernel.Kernel = kernel.Kernel()
+
+
 
 
 if __name__ == "__main__":

+ 0 - 30
desktop/kernel/user/user.py

@@ -1,30 +0,0 @@
-"""Пользователь клиента"""
-
-from .user_login import user_login
-
-
-class User:
-    """Пользователь клиента"""
-
-    def __init__(self) -> None:
-        self._login: user_login.UserLogin = user_login.UserLogin()
-        "Логин юзера"
-        self._password: str = ""
-        "Пароль юзера"
-
-    def login(self) -> user_login.UserLogin:
-        """Логин пользователя"""
-        return self._login
-
-    def password(self) -> str:
-        """Пароль пользователя"""
-        return self._password
-
-    def password_set(self, password: str) -> str:
-        """Устанавливает пароль пользователя.
-            Возвращает ошибку. если пароль пустой или установлен ранее."""
-        if password == "":
-            return "User.password_set(): пароль пустой"
-        if self._password != "":
-            return "User.password_set(): пароль уже установлен"
-        return ""

+ 18 - 0
desktop/typ/iapp.py

@@ -0,0 +1,18 @@
+"""Интерфейс к объекту приложения."""
+
+import abc
+
+from typ.ikernel import IKern
+from typ.igui import IGui
+
+
+class IApp(abc.ABC):
+    """Интерфейс к объекту приложения."""
+
+    @abc.abstractmethod
+    def kern(self) -> IKern:
+        """Возвращает ядро приложения."""
+
+    @abc.abstractmethod
+    def gui(self) -> IGui:
+        """Возвращает GUI приложения."""

+ 17 - 0
desktop/typ/igui.py

@@ -0,0 +1,17 @@
+"""Интерфейс к графике."""
+
+import abc
+from typ.iwin_main import IWinMain
+from typ.iwin_login import IWinLogin
+
+
+class Gui(abc.ABC):
+    """Графика для клиента."""
+
+    @abc.abstractmethod
+    def win_main(self) -> IWinMain:
+        """Возвращает главное окно."""
+
+    @abc.abstractmethod
+    def win_login(self) -> IWinLogin:
+        """Возвращает окно логина."""

+ 16 - 0
desktop/typ/ikernel.py

@@ -0,0 +1,16 @@
+"""Интерфейс ядра приложения клиента."""
+
+import abc
+
+from typ.iuser import IUser
+
+
+class IKern(abc.ABC):
+    """Ядро логики приложения."""
+
+    def __init__(self) -> None:
+        """Возвращает новый объект ядра."""
+
+    @abc.abstractmethod
+    def user(self) -> IUser:
+        """Возвращает объект пользователя системы."""

+ 14 - 0
desktop/typ/ilogin.py

@@ -0,0 +1,14 @@
+"""Логин пользователя для клиента вар-танка."""
+import abc
+
+
+class ILogin(abc.ABC):
+    """Объект логина пользователя клиента."""
+
+    @abc.abstractmethod
+    def get(self) -> str:
+        """Возвращает хранимый логин."""
+
+    @abc.abstractmethod
+    def set(self, val: str) -> str:
+        """Устанавливает хранимый логин."""

+ 14 - 0
desktop/typ/ipass.py

@@ -0,0 +1,14 @@
+"""Пароль для логина на сервер вар-танка."""
+import abc
+
+
+class IPass(abc.ABC):
+    """Объект пароля пользователя клиента."""
+
+    @abc.abstractmethod
+    def get(self) -> str:
+        """Возвращает хранимый логин."""
+
+    @abc.abstractmethod
+    def set(self, val: str) -> str:
+        """Устанавливает хранимый логин."""

+ 18 - 0
desktop/typ/iuser.py

@@ -0,0 +1,18 @@
+"""Интерфейс к объекту пользователя клиента."""
+
+import abc
+
+from typ.ilogin import ILogin
+from typ.ipass import IPass
+
+
+class IUser(abc.ABC):
+    """Тип пользователя клиента."""
+
+    @abc.abstractmethod
+    def login(self) -> ILogin:
+        """Возвращает логин пользователя."""
+
+    @abc.abstractmethod
+    def password(self) -> IPass:
+        """Возвращает пароль пользователя."""

+ 7 - 0
desktop/typ/iwin_login.py

@@ -0,0 +1,7 @@
+"""Интерфейс к окну логина."""
+
+import abc
+
+
+class IWinLogin(abc.ABC):
+    """Интерфейс к окну логина."""

+ 6 - 0
desktop/typ/iwin_main.py

@@ -0,0 +1,6 @@
+"""Интерфейс к главному окну приложения."""
+import abc
+
+
+class IWinMain(abc.ABC):
+    """Интерфейс главного окна приложения."""

+ 1 - 0
desktop/typ/typ.py

@@ -0,0 +1 @@
+"""Содержит необходимые интерфейсы для работы."""

+ 0 - 20
desktop/win_main/win_main.py

@@ -1,20 +0,0 @@
-"""Главное окно клиента вар-танка"""
-import tkinter
-from .frm_down import frm_down
-from .main_menu import main_menu
-
-
-class WinMain(tkinter.Tk):
-    """Главное окно клинта вартанка"""
-    def __init__(self) -> None:
-        tkinter.Tk.__init__(self)
-        self.wm_title("WarTank")
-        self.minsize(640, 480)
-        self.frm_down: frm_down.FrmDown = frm_down.FrmDown(self)
-        "Нижний фрейм главного окна"
-        self.menu: main_menu.MainMenu = main_menu.MainMenu(self)
-        "Меню главного окна"
-
-    def run(self) -> None:
-        """Запускает графику в работу"""
-        self.mainloop()