11
votes

Comment emballer un widget Tkinter sous un widget existant qui a été emballé sur le côté gauche?

Je tente d'écrire une interface graphique à tkinter de base qui possède un widget de texte en haut, puis une touche widget est alignée en dessous, puis un autre Texte widget sous le bouton. Le problème que je vais avoir est, après avoir emballé le widget sur le widget sur la gauche, lorsque j'allume ensuite le second widget , il le pose à côté du bouton de le droit plutôt que sous le bouton. Cela se produit indépendamment de ce que je définis l'argument sur pour le deuxième texte widget Voici une simple pièce de code qui démontre ce comportement: xxx < p> Alors, comment allez-y configurer le deuxième texte widget de texte de sorte qu'il apparaît sous le bouton, plutôt qu'à la droite de celui-ci?


1 commentaires

Le avant argument de mots-clés de la méthode pack () pourrait aider.


4 Réponses :


3
votes

Emballage se produit dans l'ordre que les méthodes .Pack sont appelées, une fois X a «réclamé» le côté gauche, c'est tout - cela prendra la partie gauche de son parent et tout le reste au sein de son parent sera à son droit. Vous avez besoin d'un cadre pour "médiatiser", par exemple ...: xxx

(changements de textes sur des boutons pour une visibilité plus immédiate de la mise en page seulement - le tkinter sur ce Mac ne montre pas clairement les textes jusqu'à ce qu'ils se concentrent, mais les boutons sont assez clairs; -).


0 commentaires

9
votes

J'étais initialement mal compris la façon dont l'emballage a fonctionné et n'a pas compris que tout le côté gauche était "réclamé" quand j'ai fait x.pack (côté = gauche) . Ce que j'ai trouvé après avoir lu Ceci et la réponse de Alex ici est que je n'étais pas vraiment après avoir x emballé sur le côté gauche du tout, mais plutôt l'avoir ancrad à gauche, en utilisant anchor = w (W pour l'ouest) au lieu de côté = gauche . Mon extrait de code révisé qui fait ce que j'avais après ressemble à ceci: xxx

de cette façon x ne "réclamer" pas le côté gauche, il vient d'alignement sur le gauche (ou ouest) dans son bloc d'espace.


0 commentaires

17
votes

Il y a généralement deux solutions aux problèmes de mise en page:

  1. Basculez à l'aide de la grille. Cela devient vraiment facile de faire des mises en page comme ce que vous essayez d'accomplir. La grille peut résoudre probablement 95% de toutes les problèmes de mise en page (c'est incroyable lorsque vous y réfléchissez - TK, avec un gestionnaire, ce que la plupart des outils ont besoin d'une demi-douzaine pour accomplir!)

  2. Utilisez plusieurs cadres. Si certains widgets doivent être empilés de haut en bas et de gauche à droite, vous ne pouvez pas toujours obtenir ce que vous voulez tout emballer dans une seule image. Utilisez une image pour les parties de haut à bas de la disposition et des cadres supplémentaires pour le contenu de gauche à droite.

    Réalisez également que les widgets ne doivent pas nécessairement être des enfants du widget dans lequel ils sont emballés / grillés. Vous pouvez utiliser le paramètre "dans" pour mettre les widgets dans un autre conteneur que leur parent.

    Par exemple, dans votre exemple spécifique, vous pouvez créer trois cadres, dessus, milieu, fond. Packez ce haut de haut dans votre fenêtre de toplevel. Ensuite, vous pouvez emballer le premier widget de texte en haut, le bouton ou les boutons horizontalement au milieu et l'autre widget de texte en bas.

    L'avantage d'une telle approche est qu'il est beaucoup plus facile de changer la mise en page à l'avenir (qui dans mon expérience toujours arrive à un moment donné). Vous n'avez pas besoin de la ré-mère de vos widgets, il suffit d'emballer / de placer / les griller dans un autre conteneur.

    Dans votre court exemple, cela ne fait pas beaucoup de différence, mais pour les applications complexes, cette stratégie peut être un économiseur de vie.

    Mon meilleur conseil est ceci: la mise en page n'est pas une réflexion après coup. Faites un peu de planification, peut-être même passer cinq minutes à dessiner sur du papier graphique. Commencez par décider des principales régions de votre application et utilisez un cadre ou un autre conteneur pour chacune (fenêtre vitrée, ordinateur portable, etc.). Une fois que vous avez celles-ci, faites la même approche de division et de conquérir pour chaque section. Cela vous permet d'utiliser différents types de mise en page pour différentes sections de votre application. Barres d'outils Obtenez une disposition horizontale, les formulaires peuvent obtenir une disposition verticale, etc.


0 commentaires

3
votes

Faites-le de la même manière que WebView utilise le widget de toile de mosaïque définit des internes (qui sont très similaires à TK). L'astuce est que le deuxième objet de cadre nommé identique fonctionne comme un niveau de niveau de bloc (Inline: Bloc;) Pour tout ce qui est placé après cela et tout ce qui appelle «FR» commencera automatiquement à l'intérieur de celui-ci.

Vous pouvez avoir beaucoup à faire cela des plus grands widgets alignés et simplement ajouter un autre cadre nommé identique où vous souhaitez casser entre le côté = gauche. Fonctionne après le bas aussi. xxx


0 commentaires