Bonjour à tous ! Je suis en train d'écrire un simple téléchargeur de playlist (avec pytube) et je veux m'améliorer sur Tkinter donc j'ai décidé de l'utiliser pour construire une interface. J'ai cependant quelques problèmes avec la gestion de la grid et comment gérer des tailles différentes sur la même colonne mais sur des lignes différentes.
Voici les parties intéressantes de mon code :
Fonctions pour placer un widget :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 def initial_configure_widgets(self, widget: Union[Entry, Label, Progressbar, Button], parameters: Dict[str, Any], use_place_method: bool = False) -> None: if (use_place_method): widget.place(**parameters) else: widget.grid(**parameters)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 def format_widget_parameters(row: int, column: int, padx: Tuple[int, int], pady: Tuple[int, int], sticky: str, columnspan: int = 1) -> Dict[str, Any]: parameters = { "row": row, "column": column, "padx": padx, "pady": pady, "sticky": sticky, "columnspan": columnspan } return parametersEt comment je les utilise
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 def configure_grid(self, is_row: List[bool] = [True], index: List[int] = [0], weight: List[int] = [0]) -> None: if len(is_row) != len(index) != len(weight): raise ValueError("All three lists must have the same length.") for i in range(len(is_row)): if is_row[i]: self.root.grid_rowconfigure(index[i], weight=weight[i]) else: self.root.grid_columnconfigure(index[i], weight=weight[i])
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 # **** GRID CONFIGURATION**** application.configure_grid([False, False, False, True, True, True, True, True, True, True, True], [0, 1, 2, 0, 1, 2, 3, 4, 5, 5, 6], # noqa [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]) application.initial_configure_widgets( download_label, format_widget_parameters(0, 2, (0, 0), (20, 10), "s")) application.initial_configure_widgets( download_entry, format_widget_parameters(1, 2, (0, 0), (10, 0), "new")) application.initial_configure_widgets( playlist_button, format_widget_parameters(1, 0, (10, 0), (5, 0), "ew")) application.initial_configure_widgets( audio_button, format_widget_parameters(1, 1, (0, 10), (5, 0), "ew")) application.initial_configure_widgets( download_button, format_widget_parameters(2, 2, (0, 0), (5, 0), "")) application.initial_configure_widgets( download_progressbar, format_widget_parameters(3, 2, (0, padx_west_init), (30, 0), "new")) application.initial_configure_widgets( folder_button, format_widget_parameters(4, 0, (10, 0), (40, 0), "ew")) application.initial_configure_widgets( error_canvas, format_widget_parameters(5, 0, (50, 50), (20, 0), "new", 3)) application.initial_configure_widgets( error_label, {'relx': 0, 'rely': 0.5, 'anchor': 'center'}, True) application.initial_configure_widgets( name_label, format_widget_parameters(6, 0, (0, 0), (0, 0), "nw", 3)) application.initial_configure_widgets( name_entry, format_widget_parameters(6, 1, (20, 0), (0, 0), "n", 3))
Cela fonctionnait correctement lorsque je n'avais pas placé name_label et name_entry, mais après les avoir placés, ça ne fonctionne plus. Mon texte dans name_label est large et j'ai donc besoin de mettre un columspan de 3 pour éviter de changer la taille du widget sur la ligne précédente. Pour éviter la superposition de name_entry sur name_label j'ai mis mon name_entry dans la colonne 3 mais il n'est pas directement collé au name_label (j'imagine que c'est parce qu'il est collé à la colonne 2 et que le name_label ne remplit pas entièrement les colonnes 0, 1 et 2), savez-vous s'il y a un moyen de coller l'élément sur la face est du texte et non de la colonne.
J'ai aussi cet élément qui a un comportement bizarre :
Comme vous pouvez le constater, il existe un padding à l'ouest de download_entry (alors qu'il n'y est pas sans name_label et name_entry) et je ne comprends pas pourquoi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 application.initial_configure_widgets( download_entry, format_widget_parameters(1, 2, (0, 0), (10, 0), "new", 3))
Merci d'avance pour toutes aides
Sans name_entry/name_label
Avec
![]()
Partager