1 Commits

Author SHA1 Message Date
4830651886 fix: GUI увеличили 2021-04-29 00:11:16 +03:00
7 changed files with 56 additions and 205 deletions

View File

@@ -15,4 +15,4 @@ repos:
rev: 3.9.0 rev: 3.9.0
hooks: hooks:
- id: flake8 - id: flake8
args: ["--ignore=E203,W503,FI10,FI11,FI12,FI13,FI14,FI15,FI16,FI17,FI58,E501", "--builtins=_"] args: ["--ignore=E203,W503,FI10,FI11,FI12,FI13,FI14,FI15,FI16,FI17,FI58,E501"]

View File

@@ -32,16 +32,10 @@
## Как запустить проект ## Как запустить проект
### Frontend ### Frontend
Интерфейс на русском языке
```bash ```bash
python3 todo_tk.py python3 todo_tk.py
``` ```
Интерфейс на английском языке
```bash
LANG=eng python3 todo_tk.py
```
### backend ### backend
```bash ```bash
docker-compose up docker-compose up

View File

@@ -1,11 +1,7 @@
import gettext
import os
import tkinter as tk import tkinter as tk
from user import User from user import User
import message import message
gettext.install("todo", os.path.join(os.path.dirname(__file__), "po"))
class LoginFrame(tk.Frame): class LoginFrame(tk.Frame):
@@ -61,22 +57,21 @@ class LoginFrame(tk.Frame):
tk.Grid.columnconfigure(self, columns, weight=1) tk.Grid.columnconfigure(self, columns, weight=1)
# Подпись и поле ввода для логина # Подпись и поле ввода для логина
t = _("Введите логин") login_label = tk.Label(self, text="Введите логин")
login_label = tk.Label(self, text=t)
login_label.grid(row=9, column=12, columnspan=3, rowspan=1, sticky="nsew") login_label.grid(row=9, column=12, columnspan=3, rowspan=1, sticky="nsew")
self.login = tk.Entry(self) self.login = tk.Entry(self)
self.login.grid(row=10, column=12, columnspan=3, rowspan=1, sticky="nsew") self.login.grid(row=10, column=12, columnspan=3, rowspan=1, sticky="nsew")
# Подпись и поле ввода для пароля # Подпись и поле ввода для пароля
password_label = tk.Label(self, text=_("Введите пароль")) password_label = tk.Label(self, text="Введите пароль")
password_label.grid(row=11, column=12, columnspan=3, rowspan=1, sticky="nsew") password_label.grid(row=11, column=12, columnspan=3, rowspan=1, sticky="nsew")
self.password = tk.Entry(self, show="*") self.password = tk.Entry(self, show="*")
self.password.grid(row=12, column=12, columnspan=3, rowspan=1, sticky="nsew") self.password.grid(row=12, column=12, columnspan=3, rowspan=1, sticky="nsew")
# Кнопка авториазции # Кнопка авториазции
btn = tk.Button(self, text=_("Войти"), command=self.login_clicked) btn = tk.Button(self, text="Войти", command=self.login_clicked)
btn.grid(row=14, column=12, columnspan=3, rowspan=1, sticky="nsew") btn.grid(row=14, column=12, columnspan=3, rowspan=1, sticky="nsew")
# Если захочется реализовать в логине # Если захочется реализовать в логине

View File

@@ -1,12 +1,8 @@
import gettext
import os
from tkinter import messagebox as mb from tkinter import messagebox as mb
gettext.install("todo", os.path.join(os.path.dirname(__file__), "po")) TITLE_INFO_BOX = "Сообщение!"
MESSAGE_INVALID_LOGIN = "Неправильный логин или пароль"
TITLE_INFO_BOX = _("Сообщение!") MESSAGE_EMPTY = "Сдесь могло быть ваше сообщение"
MESSAGE_INVALID_LOGIN = _("Неправильный логин или пароль")
MESSAGE_EMPTY = _("Сдесь могло быть ваше сообщение")
def infobox(msg: str = None) -> None: def infobox(msg: str = None) -> None:

View File

@@ -1,83 +0,0 @@
# English (United States) translations for PROJECT.
# Copyright (C) 2021 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2021.
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-06-06 23:42+0300\n"
"PO-Revision-Date: 2021-06-07 00:24+0300\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en_US\n"
"Language-Team: en_US <LL@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.8.1\n"
#: todo_tk.py:20
msgid "Приложение для планирования"
msgstr "ToDo Application"
#: message.py:6
msgid "Сообщение!"
msgstr "Message!"
#: message.py:7
msgid "Неправильный логин или пароль"
msgstr "Wrong login or password"
#: message.py:8
msgid "Сдесь могло быть ваше сообщение"
msgstr "This could have been your message"
#: login.py:63
msgid "Введите логин"
msgstr "Enter your username"
#: login.py:71
msgid "Введите пароль"
msgstr "Enter your password"
#: login.py:78
msgid "Войти"
msgstr "Enter"
#: workspace.py:17
msgid "Не реализовано"
msgstr "Not implemented"
#: workspace.py:25
msgid "Текст"
msgstr "Text"
#: workspace.py:28
msgid "Выполнено"
msgstr "Done"
#: workspace.py:31
msgid "Создано"
msgstr "Created"
#: workspace.py:60
msgid "Удалить"
msgstr "Delete"
#: workspace.py:88
msgid "Добавить заметку"
msgstr "Add note"
#: workspace.py:91
msgid "Удалить лист"
msgstr "Delete list"
#: workspace.py:149
msgid "Запомнить меня"
msgstr "Remember me"
#: workspace.py:158
msgid "Добавить лист"
msgstr "Add list"

View File

@@ -1,24 +1,20 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import gettext
import os
import sys import sys
import tkinter as tk import tkinter as tk
from login import LoginFrame from login import LoginFrame
from workspace import WorkSpaceFrame from workspace import WorkSpaceFrame
from user import User from user import User
gettext.install("todo", os.path.join(os.path.dirname(__file__), "po"))
if "win" in sys.platform.lower(): if "win" in sys.platform.lower():
DEFAULT_URL = "http://localhost:8000" DEFAULT_URL = "http://localhost:8000"
else: else:
DEFAULT_URL = "http://0.0.0.0:8000" DEFAULT_URL = "http://0.0.0.0:8000"
BASE_W = 900 BASE_W = 1600
BASE_H = 400 BASE_H = 600
TITLE_APP = _("Приложение для планирования") TITLE_APP = "ToDo Application"
class Application(tk.Tk): class Application(tk.Tk):
@@ -54,6 +50,7 @@ class Application(tk.Tk):
def center_window(self, width: str = BASE_W, heigh: str = BASE_H) -> None: def center_window(self, width: str = BASE_W, heigh: str = BASE_H) -> None:
""" """
Центрирует приложение по центру экрана Центрирует приложение по центру экрана
:param width: ширина окна :param width: ширина окна
:param heigh: высота окна :param heigh: высота окна
""" """

View File

@@ -1,65 +1,60 @@
import gettext
import os
import tkinter as tk import tkinter as tk
gettext.install("todo", os.path.join(os.path.dirname(__file__), "po"))
def str_time(time): def str_time(time):
return time.strftime("%Y-%m-%d %H:%M:%S") return time.strftime("%Y-%m-%d %H:%M:%S")
TODO_ITEM_TABLE_TEXT_WIDTH = 25 TODO_ITEM_TABLE_TEXT_WIDTH = 24
TODO_ITEM_TABLE_FINISHED_WIDTH = 20 TODO_ITEM_TABLE_FINISHED_WIDTH = 12
TODO_ITEM_TABLE_CREATED_AT_WIDTH = 24
TODO_ITEM_TABLE_CREATED_AT_WIDTH = 25
def placeholder(): def placeholder():
print(_("Не реализовано")) print("Не реализовано")
class ToDoItemWidget(tk.Frame): class ToDoItemWidget(tk.Frame):
def __init__(self, *args, row_number, item, table, **argv): @staticmethod
def header(parent):
body = tk.Frame(parent)
text = tk.Label(body, text="Текст", width=TODO_ITEM_TABLE_TEXT_WIDTH)
text.pack(side="left")
text = tk.Label(body, text="Выполнено", width=TODO_ITEM_TABLE_FINISHED_WIDTH)
text.pack(side="left")
text = tk.Label(body, text="Создано", width=TODO_ITEM_TABLE_CREATED_AT_WIDTH)
text.pack(side="left")
return body
def __init__(self, *args, item, **argv):
super().__init__(*args, **argv) super().__init__(*args, **argv)
self.parent = self.master self.parent = self.master
self.item = item self.item = item
self.noteLabel = tk.Label( self.noteLabel = tk.Label(self, text=item.text, width=TODO_ITEM_TABLE_TEXT_WIDTH)
table, self.noteLabel.pack(side="left")
text=item.text,
width=TODO_ITEM_TABLE_TEXT_WIDTH,
justify="center",
font=("Arial", 8),
)
self.noteLabel.grid(row=row_number, column=0)
self.finished = tk.IntVar(value=int(item.finished)) self.finished = tk.IntVar(value=int(item.finished))
self.finishedButton = tk.Checkbutton( self.finishedButton = tk.Checkbutton(
table, self,
variable=self.finished, variable=self.finished,
command=self.finishedButton_command, command=self.finishedButton_command,
width=TODO_ITEM_TABLE_FINISHED_WIDTH, width=TODO_ITEM_TABLE_FINISHED_WIDTH,
justify="center",
) )
self.finishedButton.grid(row=row_number, column=1) self.finishedButton.pack(side="left")
self.createdAt = tk.Label( self.createdAt = tk.Label(
table, self, text=str_time(item.created_at), width=TODO_ITEM_TABLE_CREATED_AT_WIDTH
text=str_time(item.created_at),
width=TODO_ITEM_TABLE_CREATED_AT_WIDTH,
justify="center",
) )
self.createdAt.grid(row=row_number, column=2) self.createdAt.pack(side="left")
self.remove = tk.Button( self.remove = tk.Button(self, text="Удалить", command=lambda: self.parent.remove(self.item))
table, self.remove.pack(side="left")
text=_("Удалить"),
command=lambda: self.parent.remove(self.item),
justify="center",
)
self.remove.grid(row=row_number, column=3)
def finishedButton_command(self): def finishedButton_command(self):
self.item.modify(finished=self.finished.get() > 0) self.item.modify(finished=self.finished.get() > 0)
@@ -70,69 +65,26 @@ class ToDoListWidget(tk.Frame):
super().__init__(*args, **argv) super().__init__(*args, **argv)
self.delete_list = delete_list self.delete_list = delete_list
def create_table_header(self, body): def fill(self, itemList):
header_font = ("Arial", "10", "bold") header = ToDoItemWidget.header(self)
text = tk.Label( header.pack(side="left")
body, header.pack(side="top", fill="y")
text=_("Текст"),
width=TODO_ITEM_TABLE_TEXT_WIDTH,
justify="center",
font=header_font,
)
text.grid(row=0, column=0)
done = tk.Label(
body,
text=_("Выполнено"),
width=TODO_ITEM_TABLE_FINISHED_WIDTH,
justify="center",
font=header_font,
)
done.grid(row=0, column=1)
created = tk.Label(
body,
text=_("Создано"),
width=TODO_ITEM_TABLE_CREATED_AT_WIDTH,
justify="center",
font=header_font,
)
created.grid(row=0, column=2)
def create_table(self, itemList):
table = tk.LabelFrame(self, relief=tk.GROOVE)
table.grid()
self.create_table_header(table)
self.itemList = itemList self.itemList = itemList
row_number = 1
for item in itemList: for item in itemList:
item = ToDoItemWidget(self, row_number=row_number, item=item, table=table) item = ToDoItemWidget(self, item=item)
row_number += 1 item.pack(side="top", fill="y")
return table
def create_new_item(self): self.itemToAdd = tk.Text(self, width=15, height=1)
table = tk.LabelFrame(self, relief=tk.GROOVE) self.itemToAdd.pack(side="top")
table.grid()
self.itemToAdd = tk.Text(table, width=15, height=1)
self.itemToAdd.grid(row=0, column=0)
add = tk.Button(table, text=_("Добавить заметку"), command=self.add_command) add = tk.Button(self, text="Добавить заметку", command=self.add_command)
add.grid(row=0, column=1) add.pack(side="top")
return table
def fill(self, itemList): delete = tk.Button(self, text="Удалить лист", command=self.delete_list)
self.frame = tk.LabelFrame(self, relief=tk.GROOVE) delete.pack(side="top")
self.frame.grid(sticky="NEWS")
table = self.create_table(itemList)
table.grid(row=0, column=0)
new = self.create_new_item()
new.grid(row=2, column=0)
delete = tk.Button(self, text=_("Удалить лист"), command=self.delete_list)
delete.grid(row=4, column=0)
def update(self, itemList=None): def update(self, itemList=None):
self.clear() self.clear()
@@ -189,20 +141,20 @@ class WorkSpaceFrame(tk.Frame):
# Запомнить пользователя # Запомнить пользователя
self.rbtn_var = tk.IntVar(value=1) self.rbtn_var = tk.IntVar(value=1)
rbtn = tk.Checkbutton(self, text=_("Запомнить меня"), variable=self.rbtn_var, command=None) rbtn = tk.Checkbutton(self, text="Запомнить меня", variable=self.rbtn_var, command=None)
rbtn.pack(anchor="n") rbtn.pack(anchor="n")
# data # data
self.lists = user.fetchUserLists() self.lists = user.fetchUserLists()
self.add_list_text = tk.Text(self, width=15, height=1) self.add_list_text = tk.Text(self, width=25, height=1)
self.add_list_text.pack(anchor="sw") self.add_list_text.pack(anchor="sw")
add = tk.Button(self, text=_("Добавить лист"), command=self.add_list) add = tk.Button(self, text="Добавить лист", command=self.add_list)
add.pack(anchor="sw") add.pack(anchor="sw")
# select list box # select list box
self.listBox = tk.Listbox(self, width=30, selectmode=tk.SINGLE) self.listBox = tk.Listbox(self, width=40, selectmode=tk.SINGLE)
self.listBox.pack(side="left", fill="y") self.listBox.pack(side="left", fill="y")
self.listBox.bind("<<ListboxSelect>>", self.listBox_selected) self.listBox.bind("<<ListboxSelect>>", self.listBox_selected)