Tkinter: grille ou pack intérieur d'une grille?
Je fais construire une interface graphique pour un logiciel et que vous voulez obtenir ceci:
######################################
# | some title #
# menu upper |----------------------#
# | #
# | CANVAS #
# menu lower | #
# | #
#------------------------------------#
# statusbar #
######################################
Menu supérieur a certains de haut niveau des fonctionnalités, menu inférieur est en train de changer dans la dépendance de la saisie de l'utilisateur. La barre d'état de l'évolution de ses contenus souvent.
Malheureusement, Tkinter, refuse de travailler.
À l'aide de la de la grille de mise en page du gestionnaire de j'ai été incapable de créer une conception stable et l'ajout de contenu comme les étiquettes et les boutons pour le menu sur le côté gauche:
self.root = tk.Tk()
self.root.resizable(width=0, height=0)
self.root.title("some application")
# menu left
self.menu_left = tk.Frame(self.root, width=150, bg="#ababab")
self.menu_left.grid(row=0, column=0, rowspan=2, sticky="ns")
self.menu_left_upper = tk.Frame(self.menu_left, width=150, height=150, bg="red")
self.menu_left_upper.grid(row=0, column=0)
# this label breaks the design
#self.test = tk.Label(self.menu_left_upper, text="test")
#self.test.pack()
self.menu_left_lower = tk.Frame(self.menu_left, width=150, bg="blue")
self.menu_left_lower.grid(row=1, column=0)
# right area
self.some_title_frame = tk.Frame(self.root, bg="#dfdfdf")
self.some_title_frame.grid(row=0, column=1, sticky="we")
self.some_title = tk.Label(self.some_title_frame, text="some title", bg="#dfdfdf")
self.some_title.pack()
self.canvas_area = tk.Canvas(self.root, width=500, height=400, background="#ffffff")
self.canvas_area.grid(row=1, column=1)
self.root.mainloop()
Cette conception travaillé sans contenu dans le menu sur le côté gauche. Chaque fois que j'ai ajouté quelque chose dans self.menu_left_upper
ou self.menu_left_lower
, comme le test
étiquette, ma conception ai cassé: le menu images ont disparu.
En outre, même avec columnspan, j'ai dû enlever la barre d'état, parce que quand il a été ajouté au menu sur la gauche a disparu, encore une fois.
À l'aide de pack layout manager j'ai obtenu ceci:
######################################
# | some title #
# |----------------------#
# menu upper | #
# | CANVAS #
# | #
# menu lower | #
# |----------------------#
# | statusbar #
######################################
Car je voulais le menu image sur la gauche de consommer le plein y de l'espace je l'ai fait grandir avec pack(side="left", expand=True, fill="both")
, mais cette configuration refuse toujours la barre de statut d'aller pour la totalité de la largeur.
En outre, la pure pack gestionnaire de code est "moche". Je pense que la conception avec un gestionnaire de réseau est "claire". Donc je pensais une grille ou d'un pack de mise en page à l'intérieur d'une grille de mise en page serait bien?
Peut aider quelqu'un? Je suis coincé dans l'interface graphique de l'enfer :/
- Êtes-vous de demander de l'aide à l'aide de la grille, ou pour aider à l'aide de pack, ou vous n'avez pas de soins, ce qui est utilisé tant qu'il donne l'apparence voulue? Comment
pack
code moche? C'est juste le code. - Je n'aime pas ce qui est utilisé, tant qu'il fonctionne. Cependant, je préfère le gestionnaire du réseau, depuis une grille de mise en page plus de sens pour moi. Il est facile à comprendre et à se développer, tout en utilisant beaucoup de
pack()
's avec différentsside=...
attributs ressemble un peu confus pour moi. - Voulez-vous "menu supérieur" et "menu" en bas" à chaque action de 50% de la surface?
- De préférence oui. J'ai essayé de jouer avec le
weight=...
attribut, mais dans mes tentatives, cela ne fonctionne pas, trop.
Vous devez vous connecter pour publier un commentaire.
La clé pour faire la mise en page est d'être méthodique, et d'utiliser le bon outil
pour l'emploi. Cela signifie aussi que, parfois, vous devez faire preuve de créativité.
Cela signifie que l'aide
grid
lors de la pose de choses dans ungrid
, et à l'aide depack
lors de la pose les choses de haut en bas ou dede gauche à droite.
L'autre clé est de groupe de votre mise en page de code ensemble. C'est beaucoup, beaucoup
plus facile de visualiser et de modifier la mise en page, quand tout est en un seul bloc
de code.
Dans votre cas, vous semblez avoir trois ou quatre zones distinctes, en fonction
sur la façon de compter. Si vous souhaitez utiliser
grid
, il sera plus facile àcombiner "menu supérieur" et "menu" en bas" dans un cadre, et la traiter
ensemble de cadre comme une cellule de tableau. On dirait que vous êtes déjà ce que,
ce qui est bon.
Donc, nous allons commencer avec ces principaux domaines:
Tout moment vous utilisez
grid
, vous devez donner au moins une rangée, et uncolonne positive de poids, de sorte que tkinter sait où à l'utiliser tout
l'espace non alloué. Habituellement, il est un widget qui est le "principal"
widget de. Dans ce cas, c'est la toile. Vous voulez vous assurer que le
de ligne et de colonne pour la toile a un poids de 1 (un):
remarque: l'utilisation de
pack
au lieu degrid
serait vous faire économiser de deux lignes de code, depuispack
ne nécessite pas le jeu de poids la façongrid
n'.Ensuite, nous devons résoudre le problème de l'menus. Par défaut,
images ajuster leur contenu, c'est pourquoi l'ajout de l'étiquette
cassé votre disposition. Vous n'étiez pas dire tkinter quoi faire avec de l'espace supplémentaire, de sorte que les cadres réduit pour s'adapter, et de l'espace supplémentaire, n'étaient pas utilisés.
Puisque vous voulez "menu_upper" et "menu_lower" à
chaque action de 50% de l'espace,
pack
est la solution la plus simple. Vous pouvezutilisation
grid
, mais il nécessite plus de lignes de code à ajouter la ligne et de la colonne de poids.Ici est une version fonctionnement, avec la barre d'état. Remarquez comment il se comporte exactement comme il se doit lorsque vous redimensionnez la fenêtre:
Sur une autre note: je vous encourage fortement à pas supprimer la possibilité pour l'utilisateur de redimensionner la fenêtre. Ils savent mieux que vous ce que leurs exigences sont. Si vous utilisez
grid
etpack
correctement, le GUI redimensionner parfaitement.Ajoutant le code suivant juste avant
self.root.mainloop()
réaliser ce que vous êtes à la recherche pourself.test = tk.Label(self.menu_left_upper, text="test")
etself.test.pack()
ouself.test.grid()
le menu en haut / en bas à gauche disparaît.self.test
du rembourrage (padx
etpady
)?Par la mise en au ligne:
Entre vos
menu_left_upper
Cadre etmenu_left_upper.mainloop()
Cela fonctionne:
Voir le lien à la question de savoir d'où cela provient
Pour obtenir votre barre d'état, juste de mettre en œuvre un autre cadre et de la grille de la méthode:
Ensuite votre plan de travaille.
Espérons que cela aide 🙂
PS. Aussi pourquoi tous les
self
attributs?EDIT:
POUR le travail que vous devez faire:
Mon résultat
.grid_propagate(False)
: l'affectation de cette àmenu_left
seulement, àmenu_left_upper
seulement, àmenu_left_lower
seulement ou des combinaisons de ceux-ci. Aucun n'a fonctionné. Le menu et les sous-images s'affichent correctement sans contenu, mais dès que par exemple latest
étiquette est ajoutéemenu_left_upper
le cadre disparaît.menu_left_upper.grid
méthodepack
quandpack
sens, l'utilisationgrid
quandgrid
de sens. La seule clé est que vous ne pouvez pas les utiliser ensemble pour les widgets qui part d'un parent commun.grid_propagate
est rarement la bonne réponse, et n'est pas nécessaire pour résoudre ce problème.