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
| import tkinter as tk
from tkinter import ttk
def date_changed(event):
global yearchoosen, monthchoosen, daychoosen
if event.widget.grid_info()['column'] == 0: #grid_info() permet de donner en autres la position (column, row) du widget en question
#Avant de pouvoir supprimer le contenu d'un widget il faut le remettre en "state" : "normal"
monthchoosen['state'] = 'normal'
monthchoosen.delete(0, tk.END)
elif event.widget.grid_info()['column'] == 1:
#Avant de pouvoir supprimer le contenu d'un widget il faut le remettre en "state" : "normal"
daychoosen['state'] = 'normal'
daychoosen.delete(0, tk.END)
elif event.widget.grid_info()['column'] == 2:
print('Date sélectionnée :', daychoosen.get(), monthchoosen.get(), yearchoosen.get())
#On fige la ligne
yearchoosen['state'] = 'disabled'
monthchoosen['state'] = 'disabled'
daychoosen['state'] = 'disabled'
row = event.widget.grid_info()['row']
nb_of_row = window.grid_size()[1]
#Si on a rempli la dernière ligne on crée 2 boutons (mise à jour, suppression) placés à droite de la ligne et une nouvelle est créée
if nb_of_row == row+1:
create_cbbx(r = row + 1)
create_button(r = row)
''' EN OPTION : ENLEVER LES # ET METTRE # DEVANT CETTE LIGNE '''
''' EN LIEN AVEC LA LIGNE 84 (METTRE # DEVANT CETTE LIGNE) '''
#else:
# #grid_slaves() énumère tous les widgets dans la grille en commençant par le dernier
# #Trouver les lignes incomplètes et mettre les cbbox à normal
# rows = []
# for widget in window.grid_slaves()[::-1]:
# if widget.widgetName == 'ttk::combobox':
# if not widget.get():
# rows.append(widget.grid_info()['row'])
#
# #set permet de supprimer les doublons cf. google ^^
# for row in set(rows):
# #L'attribut row de grid_slaves() permet de donner uniquement les widgets présents dans la ligne souhaitée
# for widget in window.grid_slaves(row = row)[::-1]:
# if widget.widgetName == 'ttk::combobox':
# if widget.grid_info()['column'] == 0:
# yearchoosen = widget
# elif widget.grid_info()['column'] == 1 :
# monthchoosen = widget
# elif widget.grid_info()['column'] == 2:
# daychoosen = widget
#
# yearchoosen['state'] = 'normal'
# if yearchoosen.get():
# monthchoosen['state'] = 'normal'
#
# if monthchoosen.get():
# daychoosen['state'] = 'normal'
def update_row(event):
global yearchoosen, monthchoosen, daychoosen
#grid_slaves() énumère tous les widgets dans la grille en commençant par le dernier
for widget in window.grid_slaves()[::-1]:
if widget.grid_info()['row'] == event.widget.row:
if widget.widgetName == 'ttk::combobox':
#Avant de pouvoir supprimer le contenu d'un widget il faut le remettre en "state" : "normal"
widget['state'] = 'normal'
widget.delete(0, tk.END)
if widget.grid_info()['column'] > 0:
widget['state'] = 'disabled'
if widget.grid_info()['column'] == 0:
yearchoosen = widget
elif widget.grid_info()['column'] == 1:
monthchoosen = widget
elif widget.grid_info()['column'] == 2:
daychoosen = widget
''' EN OPTION : ENLEVER LES # ET METTRE UN # DEVANT CETTE LIGNE '''
''' ASSEZ PEU UTILE (METTRE # DEVANT CETTE LIGNE) '''
##On désactive les cbbox qui ne sont pas sur la ligne
#elif widget.grid_info()['row'] != event.widget.row:
# if widget.widgetName == 'ttk::combobox':
# widget['state'] = 'disabled'
def delete_row(event):
global yearchoosen, monthchoosen, daychoosen
for widget in window.grid_slaves(row=event.widget.row):
widget.grid_remove()
def select_cbbox(event):
global yearchoosen, monthchoosen, daychoosen
row = event.widget.grid_info()['row']
for widget in window.grid_slaves(row = row)[::-1]:
if widget.widgetName == 'ttk::combobox':
if widget.grid_info()['column'] == 0:
yearchoosen = widget
elif widget.grid_info()['column'] == 1 :
monthchoosen = widget
elif widget.grid_info()['column'] == 2:
daychoosen = widget
def create_button(r):
global button, button_2, pixelVirtual
#Astuce pour avoir la taille du bouton en pixel
pixelVirtual = tk.PhotoImage(width=1, height=1)
#Créer le bouton ⭮ qui met à jour la ligne
button = tk.Button(window, text='⭮', width=15, height=15, bg='Green', fg='White', image=pixelVirtual, compound="c", font=('Helvetica', 12, 'bold'), activebackground='White', activeforeground='Green')
'''UNE AUTRE FACON DE MEMORISER L'EMPLACEMENT DES BOUTONS = RAJOUTER UN ATTRIBUT (row) SUR L'INSTANCE DE CLASSE (button)'''
button.row = r
button.bind('<ButtonRelease-1>', update_row)
button.grid(row=r, column=3)
#Créer le bouton ❌ qui supprime la ligne
button_2 = tk.Button(window, text='❌', width=15, height=15, bg='Red', fg='White', image=pixelVirtual, compound="c", font=('Helvetica', 12), activebackground='White', activeforeground='Red')
button_2.row = r
button_2.bind('<ButtonRelease-1>', delete_row)
button_2.grid(row=r, column=4, padx = 18)
def create_cbbx(r=1):
global yearchoosen, monthchoosen, daychoosen
#YEAR
y = tk.StringVar()
yearchoosen = ttk.Combobox(window, width = 27,
textvariable = y)
# Adding combobox drop down list
yearchoosen['values'] = [2022-i for i in range(0,125)]
#Binding & place widget with grid
yearchoosen.bind('<<ComboboxSelected>>', date_changed)
yearchoosen.bind('<Enter>', select_cbbox)
yearchoosen.grid(column = 0, row = r, padx = 10)
# Shows 2022 as a default value
#yearchoosen.current(0)
#MONTH
m = tk.StringVar()
monthchoosen = ttk.Combobox(window, width = 27,
textvariable = m)
# Adding combobox drop down list
monthchoosen['values'] = (' January',
' February',
' March',
' April',
' May',
' June',
' July',
' August',
' September',
' October',
' November',
' December')
#Set state to Disable
monthchoosen['state'] = 'disabled'
#Binding & place widget with grid
monthchoosen.bind('<<ComboboxSelected>>', date_changed)
monthchoosen.bind('<Enter>', select_cbbox)
monthchoosen.grid(column = 1, row = r, padx = 10)
# Shows January as a default value
#monthchoosen.current(0)
#DAY
d = tk.StringVar()
daychoosen = ttk.Combobox(window, width = 27,
textvariable = d)
# Adding combobox drop down list
daychoosen['values'] = [i for i in range(1,31)]
#Set state to Disable
daychoosen['state'] = 'disabled'
#Binding & place widget with grid
daychoosen.bind('<<ComboboxSelected>>', date_changed)
daychoosen.bind('<Enter>', select_cbbox)
daychoosen.grid(column = 2, row = r, padx = 10)
# Shows 1 as a default value
#daychoosen.current(1)
# Creating tkinter window
window = tk.Tk()
window.geometry('1200x350')
# Labels
ttk.Label(window, text = "Select the Year :",
font = ("Times New Roman", 10)).grid(column = 0,
row = 0, padx = 120, pady = 5)
ttk.Label(window, text = "Select the Month :",
font = ("Times New Roman", 10)).grid(column = 1,
row = 0, padx = 120, pady = 5)
ttk.Label(window, text = "Select the Day :",
font = ("Times New Roman", 10)).grid(column = 2,
row = 0, padx = 120, pady = 5)
#Comboboxs
create_cbbx()
window.mainloop() |
Partager