-
Notifications
You must be signed in to change notification settings - Fork 0
/
EntryFrame.py
268 lines (247 loc) · 13.5 KB
/
EntryFrame.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
from tkinter import *
from tkinter import ttk
from Global import __VERSION__, __AUTHOR__, JMOIS, CDATE # variables globales
from tkinter import messagebox as msgbox
# permet d'exécuter des fonctions avec arguments avec des widgets tk
from functools import partial
from WebHandler import WebInterface # Classe d'interfacage avec un serveur web
class EntryFrame(LabelFrame):
"""
Frame utilisé pour la récupération d'information textuelles :
- Récupération d'une adresse web
- Connexion à un compte
- Création d'un compte
- Ajout d'une tâche
située (packée) dans MainFrame
"""
def __init__(self, master, goal="login"):
"""
Création et affichage de la Frame souhaitée
master : fenêtre maîtresse (sera MainFrame)
goal : str : indique le but de la Frame à afficher (et donc les widgets à ajouter):
- "login" : fenêtre de connexion avec id et mdp
- "signup" : fenêtre de création de compte avec id, nom et mdp
- "adress": fenêtre de récupéation d'une adresse web
- "task" : bloc de récupération d'infos pour l'ajout d'une tâche
"""
super().__init__(master, background="#424864",
relief=SOLID, text="EntryFrame", foreground="white")
self.master = master
if goal == "login":
self.LoginFrame()
elif goal == "signup":
self.SignupFrame()
elif goal == "adress":
self.ConnexionFrame()
elif goal == "task":
self.TaskFrame()
self.pack(anchor="nw", pady=5, padx=20, expand=True)
def LoginFrame(self):
# Création variables des entrées
iD = StringVar()
passwd = StringVar()
def login_attempt(iD, passwd):
try:
self.master.master.Server.login(
iD.get(), passwd.get(), self.master.master.Server.adress+"/login")
self.master.master.title(
f"Productivity App v{__VERSION__} : {self.master.master.Server.adress} : {iD.get()}")
msgbox.showinfo("login Serveur",
f"Connexion au compte {iD.get()} réussie")
self.show_server_data()
self.destroy()
except Exception as e:
self.master.master.Server.Account = None
print(f"Echec login au compte {iD.get()}")
msgbox.showerror(
"login Serveur", f"Echec de la connexion, veuillez réessayer : {e}")
self["text"] = "Connexion à un compte"
# Création widgets
Label(self, text="email :", font=(17), background=self["background"], foreground="white"
).grid(row=0, column=0, padx=10, pady=10, sticky="w")
Label(self, text="password :", font=(17), background=self["background"], foreground="white"
).grid(row=1, column=0, padx=10, pady=10, sticky="w")
ttk.Button(self, text="login", command=partial(login_attempt, iD, passwd), width=20
).grid(row=2, column=1, padx=10, pady=10)
idEntry = ttk.Entry(self, textvariable=iD, width=30,
background=self["background"])
passwdEntry = ttk.Entry(self, textvariable=passwd,
width=30, background=self["background"], show="*")
idEntry.grid(row=0, column=1, padx=10, pady=10)
passwdEntry.grid(row=1, column=1, padx=10, pady=10)
def SignupFrame(self):
"""
Widgets de frame permettant de créer un nouveau compte
"""
# Création variables des entrées
iD = StringVar()
passwd = StringVar()
name = StringVar()
def signup_attempt(iD, name, passwd):
try:
self.master.master.Server.sign_up(iD.get(), passwd.get(
), name.get(), self.master.master.Server.adress+"/signup")
self.master.master.title(
f"Productivity App v{__VERSION__} : {self.master.master.Server.adress} : {iD.get()}")
msgbox.showinfo("sign_up Serveur",
f"Création du compte {iD.get()} réussie")
self.show_server_data()
self.destroy()
except Exception as e:
self.master.master.Server.Account = None
print(f"Echec signup compte {iD.get()}")
msgbox.showerror(
"sign_up Serveur", f"Echec de la création du compte, veuillez réessayer : {e}")
self["text"] = "Création d'un compte"
# Création widgets
Label(self, text="email :", font=(17), background=self["background"], foreground="white"
).grid(row=0, column=0, padx=10, pady=10, sticky="w")
Label(self, text="name :", font=(17), background=self["background"], foreground="white"
).grid(row=1, column=0, padx=10, pady=10, sticky="w")
Label(self, text="password :", font=(17), background=self["background"], foreground="white"
).grid(row=2, column=0, padx=10, pady=10, sticky="w")
ttk.Button(self, text="sign_up", command=partial(signup_attempt, iD, name, passwd), width=20
).grid(row=3, column=1, padx=10, pady=10)
idEntry = ttk.Entry(self, textvariable=iD, width=30,
background=self["background"])
nameEntry = ttk.Entry(self, textvariable=name,
width=30, background=self["background"])
passwdEntry = ttk.Entry(self, textvariable=passwd,
width=30, background=self["background"], show="*")
idEntry.grid(row=0, column=1, padx=10, pady=10)
nameEntry.grid(row=1, column=1, padx=10, pady=10)
passwdEntry.grid(row=2, column=1, padx=10, pady=10)
def show_server_data(self):
self.master.ReaderIndex = 0
self.master.Tasks = self.master.master.Server.get_data()
self.master.render_tasks()
print("Synchronisation réussie")
def ConnexionFrame(self):
# Création variables des entrées
adress = StringVar()
def connexion_attempt(adress):
adresse = adress.get()
try:
self.master.master.Server = WebInterface(adress=adresse)
print(f"Connecté au serveur : {adresse}")
self.master.master.title(
f"Productivity App v{__VERSION__} : {adresse} : Non identifié")
self.master.master.Menu.entryconfig("File", state=DISABLED)
msgbox.showinfo(
"Connexion serveur", f"Connexion réussie au serveur à l'adresse {adresse}")
self.destroy()
except Exception:
print(f"Connexion au serveur à l'adresse {adresse} échouée")
msgbox.showerror(
"Connexion serveur", f"Connexion au serveur à l'adresse {adresse} échouée")
self["text"] = "Connexion à un serveur"
# Création widgets
Label(self, text="Adresse web :", font=(17), background=self["background"], foreground="white"
).grid(row=0, column=0, padx=10, pady=10, sticky="w")
ttk.Button(self, text="Connect to server", command=partial(connexion_attempt, adress), width=20
).grid(row=1, column=1, padx=10, pady=10)
ttk.Button(self, text="Cancel", command=self.destroy, width=20
).grid(row=1, column=0, padx=10, pady=10)
adressEntry = ttk.Entry(self, textvariable=adress, width=40,
background=self["background"])
adressEntry.grid(row=0, column=1, padx=10, pady=10)
def TaskFrame(self):
"""
Frame permettant de récupérer les informations nécessaires à l'ajout d'une tâche (sous forme de liste)
Cette liste sera ensuite ajoutée au fichier CSV ou au serveur selon la connexion active
"""
# Création variables des entrées
task = StringVar()
taskdate = StringVar()
priority = StringVar()
priority.set("medium")
tag = StringVar()
# création dates sur le mois
self.dates = self.create_date_list()
taskdate.set('{2}-{1}-{0}'.format(CDATE.day, CDATE.month, CDATE.year)) # assignation taskdate à la date d'aujourd'hui
def GetTask(task, taskdate, priority, tag):
try:
if self.master.master.Server != None: # connecté à un serveur
print("Ajout de la tâche au serveur...")
newtask = {
"goal": "addElement",
"task": task.get(),
"date": taskdate.get(),
"priority": priority.get(),
"tag": tag.get(),
"status": "enable"}
print("Tâche :", newtask)
self.master.master.Server.add(newtask)
print("Synchronisation des modifications...")
# mise à jour liste des tâches
self.master.Tasks = self.master.master.Server.get_data()
# mise à jour index (pour montrer la nouvelle tâche)
self.master.ReaderIndex = (len(self.master.Tasks)-self.master.update_max_aff()
if len(self.master.Tasks)-self.master.update_max_aff() >= 0 else 0) # mise à jour index (pour montrer la nouvelle tâche)
self.master.render_tasks() # mise à jour lecteur
elif self.master.master.File != None: # base de donnée CSV ouverte
newtask = [(str(int(self.master.Tasks[-1][0])+1) if self.master.Tasks else "0"),
(self.master.Tasks[-1][1]
if self.master.Tasks else "anonymous"),
task.get(), taskdate.get(), priority.get(), "enable", tag.get()]
print("Tâche :", newtask)
print("Ajout de la tâche au fichier CSV...")
self.master.master.File.add(newtask)
print("Synchronisation des modifications...")
self.master.Tasks = self.master.master.File.get_tasks() # mise à jour liste des tâches
self.master.ReaderIndex = (len(self.master.Tasks)-self.master.update_max_aff()
if len(self.master.Tasks)-self.master.update_max_aff() >= 0 else 0) # mise à jour index (pour montrer la nouvelle tâche)
self.master.render_tasks() # mise à jour lecteur
# Erreur : rien d'ouvert (normalement impossible en conditions normales)
else:
print("Aucune BDD ouverte, ajout d'une tâche impossible")
msgbox.showerror("Ajout d'une tâche",
f"Echec de l'ajout de la tâche {task.get()} \nAucune base de donnée n'est ouverte")
self.destroy()
except Exception as e:
self.master.task = None
print(
f"Echec de l'ajout de la tâche : {task.get()} : \n-->{e}")
self["text"] = "Ajout d'une tâche"
# Création widgets
Label(self, text="Task", font=(17), background=self["background"], foreground="white"
).grid(row=0, column=0, padx=10, pady=10, sticky="n")
Label(self, text="Due date", font=(17), background=self["background"], foreground="white"
).grid(row=0, column=1, padx=10, pady=10, sticky="n")
Label(self, text="Priority", font=(17), background=self["background"], foreground="white"
).grid(row=0, column=2, padx=10, pady=10, sticky="n")
Label(self, text="Tag", font=(17), background=self["background"], foreground="white"
).grid(row=0, column=3, padx=10, pady=10, sticky="n")
ttk.Button(self, text="Cancel", command=self.master.render_tasks, width=20
).grid(row=0, column=4, padx=10, pady=10)
ttk.Button(self, text="Confirm", command=partial(GetTask, task, taskdate, priority, tag), width=20
).grid(row=1, column=4, padx=10, pady=10)
taskEntry = ttk.Entry(self, textvariable=task, width=20,
background=self["background"])
dateBox = ttk.Combobox(self, textvariable=taskdate, width=15,
background=self["background"], state="readonly",
values=self.dates)
priorityBox = ttk.Combobox(self, textvariable=priority, width=15,
background=self["background"], state="readonly",
values=["hight", "medium", "low"])
tagEntry = ttk.Entry(self, textvariable=tag, width=15,
background=self["background"])
taskEntry.grid(row=1, column=0, padx=10, pady=10)
dateBox.grid(row=1, column=1, padx=10, pady=10)
priorityBox.grid(row=1, column=2, padx=10, pady=10)
tagEntry.grid(row=1, column=3, padx=10, pady=10)
def create_date_list(self):
"""
retourne une liste des dates dans le format AAAA-MM-JJ sur 30 jours inclus avec cdate
"""
return [
'{2}-{1}-{0}'.format(
(CDATE.day + i) % 31 + 1,
(CDATE.month +
((CDATE.day + i) // 31)) % 12,
CDATE.year +
((CDATE.month + ((CDATE.day + i) // 31)) // 12))
for i in range(31)
]
if __name__ == '__main__':
print("Le test d'EntryFrame se fait via celui du Menu")