URL: https://linuxfr.org/forums/programmation-python/posts/mon-premier-code-python Title: Mon premier code python Authors: Eh_Dis_Mwan Date: 2019年01月22日T19:27:17+01:00 License: CC By-SA Tags: Score: 3 Bonjour, Voilà dans mon apprentissage de python, j'ai pondu ce code ```python import datetime from tkinter import Entry, Button, Scrollbar from tkinter import Listbox, StringVar, Tk from tkinter import Label, LabelFrame, Menu, ANCHOR, E, N, S from tkinter.colorchooser import askcolor from tkinter.messagebox import showinfo import os import sys import math import pytz ###VARIABLES obj = dict() listtz = list(pytz.all_timezones) BINPATH = os.path.dirname(os.path.realpath(__file__)) with open("{}/tz.conf".format(BINPATH), "r") as conffile: TIMEZONES = conffile.readlines() TIMEZONES = list(map(lambda s: s.strip(), TIMEZONES)) citytable = [] for element in TIMEZONES: tmpelement = element.split("/") try: citytable.append(tmpelement[::-1]) except: pass TIMEZONES = [] citytable.sort() for element in citytable: element.reverse() TIMEZONES.append("/".join(element)) listtz = [x for x in listtz if x not in TIMEZONES] print("Timezones initialization....OK") colorsdic = dict() try: with open("{}/colors.conf".format(BINPATH), "r") as CONFFILE: COLORS = CONFFILE.readlines() COLORS = list(map(lambda s: s.strip(), COLORS)) for i in COLORS: j = i.split(":") colorsdic[str(j[0])] = (j[1]) except: with open("{}/colors.conf".format(BINPATH), "w") as f: f.write('bgcolor:bisque\nfgcolor:maroon\nbgclock:black\nfgclock:yellow\nbgday:white\nfgday:black\n') with open("{}/colors.conf".format(BINPATH), "r") as conffile: COLORS = conffile.readlines() COLORS = list(map(lambda s: s.strip(), COLORS)) for i in COLORS: j = i.split(":") colorsdic[j[0]] = (j[1]) COLORDAY = [colorsdic['bgday'],colorsdic['fgday']] COLORCLOCK = [colorsdic['bgclock'],colorsdic['fgclock']] COLORFRAME = [colorsdic['bgcolor'],colorsdic['fgcolor']] print("Colors initialization ...OK") framewidth = 0 for element in listtz: lenframe = len(element) if lenframe> framewidth: framewidth = lenframe i = 0 column = 1 row = 0 rowmax = 7 relief = 'sunken' city = 'localtime' bgcolor = '#AA0000' fgcolor = 'yellow' ############CLASS class clock: """ Defines displays of the CLOCKS """ def __init__(self,city,bgcol,fgcol,bgclock,fgclock,bgday,fgday,fontsize,column,row,relief): if city == 'localtime': pass else: self.timezone = pytz.timezone(city) self.bgcol = bgcol self.fgcol = fgcol self.bgclock = bgclock self.fgclock = fgclock self.bgday = bgday self.fgday = fgday self.column = column self.row = row self.tz = city self.bgcol = bgcol self.fgcol = fgcol self.fontsize = fontsize if city == 'localtime': self.date = datetime.datetime.now() else: self.date = datetime.datetime.now(self.timezone) self.daybefore = int(self.date.day) self.monthbefore = int(self.date.month) self.yearbefore = int(self.date.year) self.Frame = LabelFrame(root,bg=self.bgcol,fg=self.fgcol,highlightbackground="yellow", highlightcolor="green", highlightthickness=2) self.temptable = [] self.labeltext = StringVar() self.entrydatetext = StringVar() self.entryhourtext = StringVar() self.labelsecondtext = StringVar() self.display_cal() self.update_window() def display_cal(self): self.label = Label(self.Frame,textvariable=self.labeltext,width=15,height=int(framewidth/5),bg=self.bgcol,fg=self.fgcol) self.label.config(font=("URW Gothic", self.fontsize+2,"bold")) self.temptable = self.tz.split("/") if len(self.temptable) == 1: self.labeltext.set('Localtime') self.labeltext.set(self.temptable[-1].upper()) self.entryhour = Entry(self.Frame,textvariable=self.entryhourtext,width=5,bg=self.bgclock,fg=self.fgclock,relief=relief) self.entrydate = Entry(self.Frame,textvariable=self.entrydatetext,width=10,bg=self.bgday,fg=self.fgday,relief=relief) self.labelsecond = Label(self.Frame,textvariable=self.labelsecondtext,bg=self.bgcol,fg=self.fgcol) self.entrydate.config(font=("Swiss 721",14)) self.entryhour.config(font=("Serto Kharput",28,"bold")) self.labelsecond.config(font=("Console",8)) self.label.grid(column=0,row=0,rowspan=2) self.entryhour.grid(column=1,row=0) self.entrydate.grid(column=1,row=1) def update_window(self): if self.tz == 'localtime': self.date = datetime.datetime.now() else: self.date = datetime.datetime.now(self.timezone) self.place = self.tz.upper() self.year = str(self.date.year) if int(self.year)> self.yearbefore: showinfo("HAPPY","Happy new year {}".format(self.place)) self.yearbefore = int(self.date.year) self.month = str(self.date.month).zfill(2) if int(self.month)> self.monthbefore: showinfo("WARNING","The month has changed in {}".format(self.place)) self.monthbefore = int(self.date.month) self.day = str(self.date.day).zfill(2) if int(self.day)> self.daybefore: showinfo("WARNING","The day has changed in {}".format(self.place)) self.daybefore = int(self.date.day) self.hour = str(self.date.hour).zfill(2) self.minute = str(self.date.minute).zfill(2) self.second = str(self.date.second).zfill(2) self.calendar = "{}/{}/{}".format(self.day,self.month,self.year) self.time = "{}:{}".format(self.hour,self.minute) self.entrydatetext.set(self.calendar) self.entryhourtext.set(self.time) self.labelsecondtext.set(self.second) self.label.grid(column=0,row=0,rowspan=2) self.entryhour.grid(column=1,row=0) self.entrydate.grid(column=1,row=1) self.labelsecond.grid(column=2,row=0) self.Frame.grid(column=self.column,row=self.row) root.after(1000,self.update_window) def removeinstance(self): with open("{}/tz.conf".format(BINPATH), 'r') as f1: lines = f1.readlines() with open("{}/tz.conf".format(BINPATH), 'w') as f: for line in lines: if self.tz not in line: f.write(line) f.truncate() os.execl(sys.executable, os.path.abspath(__file__), *sys.argv) def __str__(self): return(self) #DEF def addtz(str,column,row): locallisttz = [] str=str+'/' OptionFrame.grid_forget() for widget in OptionFrame.winfo_children(): widget.grid_forget() SetTzList.delete(0, 'end') LabelText.set('Add timezone') def CurSelet(evt): global row global column global COLORDAY global COLORFRAME global COLORCLOCK global relief if (row + column) %2 == 0: (bgday, fgday)=COLORDAY (bgcolor,fgcolor)=COLORFRAME (bgclock,fgclock)=COLORCLOCK relief='sunken' else: (fgday, bgday)=COLORDAY (fgcolor,bgcolor)=COLORFRAME (fgclock,bgclock)=COLORCLOCK relief='ridge' value = (SetTzList.get(ANCHOR)) with open("{}/tz.conf".format(BINPATH), 'a') as f1: f1.write("{}{}\n".format(str,value)) obj[value]=clock("{}{}".format(str,value),bgcolor,fgcolor,bgclock,fgclock,bgday,fgday,10,column,row,relief) DelTZ.add_command(label=value, command=obj[value].removeinstance) if row < rowmax: row += 1 else: row = 0 column += 1 for element in listtz: locallisttz=[x for x in listtz if str in x] LabelTitle.grid(column=0, row=1) SetTzList.grid(column=0, row=2) table=[] for entries in locallisttz: table=entries.split('/') if len(table)> 2: SetTzList.insert("end", "{}/{}".format(table[1],table[2])) else: SetTzList.insert("end", table[1]) value=SetTzList.get(ANCHOR) value=SetTzList.bind('<>', CurSelet) scrollbar.grid(column=1,row=2,sticky=E+N+S) scrollbar.config( command = SetTzList.yview ) SetTzList.config(yscrollcommand=scrollbar.set) ButtonCancel.grid(column=0,row=4,columnspan=2) OptionFrame.grid(column=0,row=0,rowspan=rowmax+2) def SetColors(): OptionFrame.grid_forget() for widget in OptionFrame.winfo_children(): widget.grid_forget() SetTzList.delete(0, 'end') LabelText.set('Setcolors') OptionFrame.grid(column=0,row=0,rowspan=rowmax+1) def changecolor(key): newlist=[] (a, newcolor) = askcolor(color=colorsdic[key],title='Choose...') if newcolor: for oldkey, oldvalues in colorsdic.items(): if oldkey == key: oldvalues=newcolor newlist.append("{}:{}\n".format(oldkey,str(oldvalues))) with open("{}/colors.conf".format(BINPATH), 'w') as f1: f1.writelines(newlist) os.execl(sys.executable, os.path.abspath(__file__), *sys.argv) Buttonbg=Button(OptionFrame,text=colorsdic['bgcolor'],bg=colorsdic['bgcolor'],width=7,command=lambda: changecolor('bgcolor')) Buttonbg.grid(column=0,row=0) Buttonfg=Button(OptionFrame,text=colorsdic['fgcolor'],bg=colorsdic['fgcolor'],width=7,command=lambda: changecolor('fgcolor')) Buttonfg.grid(column=0,row=1) Buttonbgclock=Button(OptionFrame,text=colorsdic['bgclock'],bg=colorsdic['bgclock'],width=7,command=lambda: changecolor('bgclock')) Buttonbgclock.grid(column=1,row=0) Buttonfgclock=Button(OptionFrame,text=colorsdic['fgclock'],bg=colorsdic['fgclock'],width=7,command=lambda: changecolor('fgclock')) Buttonfgclock.grid(column=1,row=1) Buttonbgday=Button(OptionFrame,text=colorsdic['bgday'],bg=colorsdic['bgday'],width=7,command=lambda: changecolor('bgday')) Buttonbgday.grid(column=2,row=0) Buttonfgday=Button(OptionFrame,text=colorsdic['fgday'],bg=colorsdic['fgday'],width=7,command=lambda: changecolor('fgday')) Buttonfgday.grid(column=2,row=1) ButtonCancel.grid(column=0,row=2,columnspan=3) def info(): OptionFrame.grid_forget() for widget in OptionFrame.winfo_children(): widget.grid_forget() SetTzList.grid_forget() SetTzList.delete(0, 'end') LabelText.set('Developped...') OptionFrame.config(text="?") LabelTitle.grid(column=0, row=0) labelGPL=Label(OptionFrame,text="under GPL",bg=fgcolor,fg=bgcolor,width=16) labelname=Label(OptionFrame,text="by David LUCAS",bg=bgcolor,fg=fgcolor,width=16) labelmail=Label(OptionFrame,text="davlucas@gmail.com",bg=bgcolor,fg=fgcolor,width=16) labelthanks=Label(OptionFrame,text="thanks:",bg=fgcolor,fg=bgcolor,width=16) labelfunmooc=Label(OptionFrame,text="INRIA and fun-mooc",bg=bgcolor,fg=fgcolor,width=16) labelryoko=Label(OptionFrame,text="Ryoko SHINOHARA",bg=bgcolor,fg=fgcolor,width=16) labelGPL.grid(column=0, row=1) labelname.grid(column=0, row=2) labelmail.grid(column=0,row=3) labelthanks.grid(column=0, row=4) labelfunmooc.grid(column=0, row=5) labelryoko.grid(column=0, row=6) OptionFrame.grid(column=0,row=0,rowspan=rowmax+1) ButtonCancel.grid(column=0,row=7) def refresh(): os.execl(sys.executable, os.path.abspath(__file__), *sys.argv) ############MAIN root=Tk() root.title("Clock ") menubar = Menu(root) LabelText=StringVar() OptionFrame = LabelFrame(root, text='SETTINGS',width=int(framewidth/1.5)) SetTzList = Listbox(OptionFrame,width=int(framewidth/1.5),bg='white',fg='black') scrollbar = Scrollbar(OptionFrame,width=5,borderwidth=1) LabelTitle = Label(OptionFrame, textvariable=LabelText) ButtonCancel = Button(OptionFrame,text='CANCEL',width=6,command=OptionFrame.grid_forget) obj_localtime=clock(city,'green','black','black','yellow','green','black',8,column,row,relief) row+=1 for city in TIMEZONES: if (row + column) %2 == 0: (bgday, fgday)=COLORDAY (bgcolor,fgcolor)=COLORFRAME (bgclock,fgclock)=COLORCLOCK relief='sunken' else: (fgday, bgday)=COLORDAY (fgcolor,bgcolor)=COLORFRAME (fgclock,bgclock)=COLORCLOCK relief='ridge' obj[city]=clock(city,bgcolor,fgcolor,bgclock,fgclock,bgday,fgday,10,column,row,relief) if row < (rowmax): row += 1 else: row = 0 column += 1 tzmenu = Menu(menubar, tearoff=0) AddTZ= Menu (tzmenu,tearoff=0) AddTZ.add_command(label='Africa',command= lambda: addtz('Africa',column,row)) AddTZ.add_command(label='America',command= lambda: addtz('America',column,row)) AddTZ.add_command(label='Antarctica',command= lambda: addtz('Antarctica',column,row)) AddTZ.add_command(label='Asia',command= lambda: addtz('Asia',column,row)) AddTZ.add_command(label='Australia',command= lambda: addtz('Australia',column,row)) AddTZ.add_command(label='Canada',command= lambda: addtz('Canada',column,row)) AddTZ.add_command(label='Europa',command= lambda: addtz('Europe',column,row)) AddTZ.add_command(label='Indian',command= lambda: addtz('Indian',column,row)) AddTZ.add_command(label='Pacific',command= lambda:addtz('Pacific',column,row)) AddTZ.add_command(label='USA',command= lambda:addtz('US',column,row)) AddTZ.add_command(label='Etc',command= lambda:addtz('Etc',column,row)) tzmenu.add_cascade(label="Add timezone",menu=AddTZ) DelTZ= Menu (tzmenu,tearoff=0) for element in TIMEZONES: DelTZ.add_command(label=element, command=obj[element].removeinstance) tzmenu.add_cascade(label="Remove timezone",menu=DelTZ) color=Menu(menubar,tearoff=0) color.add_command(label='change colors settings',command=SetColors) menubar.add_cascade(label="Timezones Operations", menu=tzmenu) menubar.add_cascade(label="Set Colors", menu=color) menubar.add_separator() About=Menu(menubar,tearoff=0) About.add_command(label='?',command=info) About.add_command(label='Refresh display',command=refresh) About.add_command(label='Quit',command=root.destroy) menubar.add_cascade(label='About and Refresh',menu=About) root.config(menu=menubar) root.mainloop() ``` Donc, comme vous pouvez le voir, je suis parti d'un timer et puis j'ai rajouté des horloges selon différentes timezones, au début sans classe, j(ai vite vu l'avantage de programmé en objet. Même si ce code doit vous faire rire (pylint le note -6 quelque chose, c'est que c'est pas terrible) , j'en suis content et ravi. Néanmoins, persiste un problème, que je pense de design mais je préfère avoir confirmation: Chaque horloge est donc une classe qui actualise son affichage toutes les secondes. Donc, si je détruit la frame lors de la supression d'une TZ, cela n'a aucune conséquence: l'objet est bloqué dans la func update_clock. Ma question est donc : est il possible de supprimer subitement une instance de classe et de la forcer à s'arrêter de tourner ?

AltStyle によって変換されたページ (->オリジナル) /