je débute en Python et en Tkinter. Je dois créé une liste déroulante scrollante avec qui prend en entrée une liste de string et renvoie la selection de l'utilisateur. J'ai ce code:
import tkinter as tk
class DistCentreImagerie(tk.Frame):
"""Notre fenêtre principale.
Tous les widgets sont stockés comme attributs de cette fenêtre."""
def __init__(self, root, item_list):
tk.Frame.__init__(self, root)
root.geometry('350x450')
root.title('Veuillez sélectionner les repères')
self.selection = []
self.check_btn_vars = []
# widgets creation
self.scroll_bar = tk.Scrollbar(tk.Frame(root))
self.scroll_bar.pack(side=tk.RIGHT, fill=tk.Y)
self.text_area = tk.Text(tk.Frame(root), bg='SystemButtonFace')
self.text_area.pack()
self.text_area.configure(yscrollcommand=self.scroll_bar.set)
self.scroll_bar.configure(command=self.text_area.yview)
tk.Frame(root).pack()
#
self.output_lb = tk.Label(root, font=('Bold', 12))
self.output_lb.pack(pady=10, anchor=tk.W)
#
self.insert_check_btn(item_list)
# self.selection_get(item_list)
###########################################################################
# self.quit_button = tk.Button(self, text="OK", command=self.quit)
# self.quit_button.pack(side="bottom")
def insert_check_btn(self, item_list):
for r in item_list:
var = tk.IntVar()
self.check_btn_vars.append(var)
check_btn = tk.Checkbutton(self.text_area, text=f'{r}',
variable=var,
command=self.selection_get(item_list))
self.text_area.window_create('end', window=check_btn)
self.text_area.insert('end', '\n')
self.text_area.configure(state=tk.DISABLED, cursor='')
def selection_get(self, item_list):
# global selection
self.selection = []
for s in self.check_btn_vars:
if s.get() == 1:
item_ind = self.check_btn_vars.index(s)
self.selection.append(item_list[item_ind])
self.output_lb.config(text=self.selection)
def get_selected_roi(self):
return self.selection
Item_list = ['Orly', 'Dora', 'Sandra', 'Passy', 'Line', 'Anna', 'Kolor', 'Papson', 'Thierson']
root = tk.Tk()
interface = DistCentreImagerie(root, Item_list)
interface.mainloop()
Je suis censé obtenir quelque chose comme ça, mais en retour j'ai juste une fenêtre vide.
Quelqu'un pourrait-il m'aider à comprendre ou je me gourre ?
Il y a pas mal d'erreurs, je l'ai corrigé et te laisse observer
import tkinter as tk
class DistCentreImagerie(tk.Frame):
def __init__(self, root, item_list):
super().__init__(root)
self.pack()
root.geometry('350x450')
root.title('Veuillez sélectionner les repères')
self.selection = []
self.check_btn_vars = []
# Création des widgets
self.scroll_bar = tk.Scrollbar(self)
self.scroll_bar.pack(side=tk.RIGHT, fill=tk.Y)
self.text_area = tk.Text(self, yscrollcommand=self.scroll_bar.set)
self.text_area.pack()
self.scroll_bar.config(command=self.text_area.yview)
self.output_lb = tk.Label(self, font=('Bold', 12))
self.output_lb.pack(pady=10, anchor=tk.W)
self.insert_check_btn(item_list)
def insert_check_btn(self, item_list):
for r in item_list:
var = tk.IntVar()
self.check_btn_vars.append(var)
check_btn = tk.Checkbutton(self.text_area, text=f'{r}', variable=var, command=lambda: self.selection_get(item_list))
self.text_area.window_create('end', window=check_btn)
self.text_area.insert('end', '\n')
self.text_area.configure(state=tk.DISABLED, cursor='')
def selection_get(self, item_list):
self.selection = [item_list[i] for i, var in enumerate(self.check_btn_vars) if var.get() == 1]
self.output_lb.config(text=self.selection)
def get_selected_roi(self):
return self.selection
Item_list = ['Orly', 'Dora', 'Sandra', 'Passy', 'Line', 'Anna', 'Kolor', 'Papson', 'Thierson']
root = tk.Tk()
interface = DistCentreImagerie(root, Item_list)
interface.mainloop()
Une de tes problématiques est la POO et la confusion dans la création des widgets en fonction de leur parent.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Effectivement, il n' y a pas mal de chose de modifier. Le code fonctionne très bien. je n'arrive néamoins pas toujours à trouver ou était la principale erreur dans mon code (a l'exécution, une fenêtre vide s'ouvre).
Dans mon post précédent je te l'ai expliqué après avoir donné le code.
Regarde la manière dont on créé les widgets, les callback pour check_btn (utilisation de lambda), ...
Bref observe, compare et fait des petits tests sur ton interpréteur python.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)