-
Notifications
You must be signed in to change notification settings - Fork 0
/
webserver.py
155 lines (139 loc) · 4.46 KB
/
webserver.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
###########################################
#
# Permet de créer un serveur web
#
# Author : Antoine-Alexis Bourdon
# Link : https://github.com/antoinealexisb/
# Version : 0.1.0
# Year : 7 july 2020
# Dependency : tkinter, http.server, socketserver, threading
#
###########################################
# Librairies
from tkinter import *
import http.server
import socketserver
import threading
class ServerWeb:
'''Classe qui permet de mettre en place un server HTTP.
'''
def __init__(self, PORT=8000):
'''fonction qui initialise la classe ServerWeb
Param : - ServerWeb (modif)
- PORT (int) : numéro du port à utiliser
Return : None
'''
self.lancer = False
self.listButtons = None
self.Handler = http.server.SimpleHTTPRequestHandler
self.PORT = PORT
def initialisationThread(self):
'''Fonction qui initialise le threading et le server http.
Param : - ServerWeb (modif)
Return : None
'''
try:
self.httpd = socketserver.TCPServer(("", self.PORT), self.Handler)
except OSError:
erreurPort="Erreur : le port "+str(self.PORT)+" est déjà utilisé."
self.listButtons[4].config(text = erreurPort)
else:
self.listButtons[4].config(text = "")
self.thread = threading.Thread(target = self.httpd.serve_forever)
self.thread.daemon = True
def startAndStop(self):
'''Fontion qui met en place le serveur http ou non en fonction de l'état de celui-ci.
Param : - ServerWeb (modif)
Return : None
'''
if not self.lancer:
self.start()
else:
self.stop()
self.lancer = not self.lancer
def setListButtons(self, listButtons):
'''Fonction qui met la liste des boutons et des labels dans la variable associé et initialise le threading.
Param : - ServerWeb (modif)
Return : None
'''
self.listButtons = listButtons
self.initialisationThread()
def stop(self):
'''Fonction qui arrete le serveur http et actualise les boutons et le status en cours.
Param : - ServerWeb (modif)
Return : None
'''
if self.lancer:
self.httpd.shutdown()
self.listButtons[0].config(text = "START")
self.listButtons[3].config(text = "Status : Off", fg="blue")
def start(self):
'''Fonction qui met en route le serveur http.
Param : - ServerWeb (modif)
Return : None
'''
self.thread = threading.Thread(target = self.httpd.serve_forever)
self.thread.start()
self.listButtons[0].config(text = "STOP")
self.listButtons[3].config(text = "Status : On \n sur http://127.0.0.1:"+str(self.PORT), fg="green")
def fenetre():
'''Construit la fenetre principale "root"
params : None
Return : root (object tkinter)
'''
root = Tk()
root.title('Formation')
root.geometry("400x200")
return root
def gestionnaireGrille(root):
'''Configure la taille de la grille.
Params : root (object tkinter) = la fenetre principale
Return : None
'''
root.rowconfigure(5, weight=1)
root.columnconfigure(2, weight=1)
def creationBoutons(root,server):
'''Creer une liste de boutons et de labbels
Params : root (object tkinter) = la fenetre principale
Return : listButtons (list(Button))
'''
listButtons = []
root.protocol("WM_DELETE_WINDOW", lambda:[server.stop(),root.destroy()])
listButtons.append(Button(root, text='START', command= lambda: server.startAndStop()))
listButtons.append(Button(root, text='Quitter', command= lambda:[server.stop(),root.destroy()]))
listButtons.append(Label(root, text=""))
listButtons.append(Label(root, text="Status : Off", fg="blue", font=("Helvetica", 10)))
listButtons.append(Label(root, text="Erreur", fg="red", font=("Helvetica", 16)))
return listButtons
def placementBoutons(listButtons):
'''Placement des boutons dans la grille
Params : listButtons (list(Button))
Return : None
'''
listButtons[0].grid(row=0, column=2)
listButtons[1].grid(row=1, column=2)
listButtons[2].grid(row=3, column=0, columnspan=3, sticky='nesw')
listButtons[3].grid(row=4, column=0, columnspan=3, sticky='ns')
listButtons[4].grid(row=5, column=0, columnspan=3, sticky='ns')
def main(PORT=8000):
'''Fonction principale
Param : - PORT (int) : le port pour le serveur http.
Return : None
'''
server = ServerWeb(PORT)
root = fenetre()
gestionnaireGrille(root)
listButtons = creationBoutons(root,server)
server.setListButtons(listButtons)
placementBoutons(listButtons)
root.mainloop()
if __name__ == "__main__":
'''condition pour démarrer la fonction principale.
verifie si l'utilisateur à mit le fichier port.
'''
try:
tmp = int(open("port.txt","r").read())
except (FileNotFoundError,ValueError):
main()
else:
main((8000,tmp)[tmp>1])