Partage
  • Partager sur Facebook
  • Partager sur Twitter

[TKINTER] Placer des widgets avec pack()

Anonyme
16 avril 2015 à 17:42:21

Bonjour/bonsoir!

J'ai un projet à faire en python, et une partie interface graphique avec Tkinter. Le résultat attendu est le suivant: http://puu.sh/hg1HC/d6fde8c2b7.png. Mon problème réside dans le placement des widgets de la partie de droite. On m'a dit d'utiliser la méthode pack(), mais je ne vois clairement pas comment arriver au résultat final avec celui-ci. Même avec des side, ça va dans tous les sens et rien n'est aligné. J'ai réussi à mettre le 'votre score' devant son entry, avec des side=LEFT, mais alors tous le reste est désaxé...

Quelqu'un a une idée des attributs a utilisés ou de ce que je devrais faire?

Merci beaucoup

  • Partager sur Facebook
  • Partager sur Twitter
16 avril 2015 à 18:19:11

Salut,

Je ne pense pas que ce soit possible de faire ça avec la méthode pack(). Voici un lien pour mieux comprendre comment fonctionne cette méthode.  Une méthode plus puissante pour placer les objets est la méthode grid():

grid(row=1, column=2)
grid(row=1, column=2, rowspan=3, columnspan=4)

Pour avoir plus de détails sur cette méthode:

import tkinter as tk
help(tk.Button.grid)




  • Partager sur Facebook
  • Partager sur Twitter
Précepte: Le mieux est l'ennemi du bien
Anonyme
16 avril 2015 à 18:33:46

Oui je connais grid, mais le problème c'est qu'avec mon canvas a côté, si je met un bouton sur la même ligne, le résultat sera assez affreux (le bouton sera centré par rapport au canvas). Et on m'a bien dis que pack() était possible ici, en jouant sur les side.

EDIT: J'ai tout de même essayé grid, mais j'ai pas mal de mal a bien faire la croix avec les 4 boutons comme sur le screenshot, il y a un trop grand espace entre chaque boutons (sinon pour le reste ça fonctionne bien)

-
Edité par Anonyme 16 avril 2015 à 18:42:23

  • Partager sur Facebook
  • Partager sur Twitter
16 avril 2015 à 19:07:13

C'est là que l'option columnspan est intéressante. Elle permet de dire qu'un objet prend la taille de plusieurs colonnes (rowspan pour les lignes). Autrement dit, lors du placement de ton canvas tu vas renseigner l'option columnspan pour déterminer sur combien de colonnes ton canevas se place.

Edit: Pour diminuer l'écart, tu peux augmenter le nombre de colonnes sur lequel se répand ton canvas. Ainsi, toujours pour la même taille de canvas, tes colonnes seront plus petites si leurs nombres est plus grand.

Edit2: Tu peux aussi essayer de jouer avec les options padx, pady, ipadx et ipady pour modifier la largeur de tes lignes/colonnes.

-
Edité par Olygrim 16 avril 2015 à 19:14:58

  • Partager sur Facebook
  • Partager sur Twitter
Précepte: Le mieux est l'ennemi du bien
Anonyme
16 avril 2015 à 19:54:39

Oui je me doutais, j'obtiens: http://puu.sh/hg7Ca/166b614b2f.png

avec ce code: 

can = Canvas(fen,width="500",height="500")

depart = Button(fen,text='Depart',command=reset)
haut = Button(fen,text='H',command=H)
gauche = Button(fen,text='G',command=G)
droite = Button(fen,text='D',command=D)
bas = Button(fen,text='B',command=B)
points = Label(fen,text="Score:")
saisie = Entry(fen,)
saisie.config(width='5')

quitter = Button(fen,text='Quitter',command=fen.destroy)

############################################

can.grid(row=1,column=1,rowspan=10)

depart.grid(row=1,column=2)
haut.grid(row=3,column=2)
gauche.grid(row=4,column=2)
droite.grid(row=4,column=3)
bas.grid(row=5,column=2)
points.grid(row=7,column=2)
saisie.grid(row=7,column=3)
quitter.grid(row=10,column=2)

C'est justement parce qu'on croirait que l'écart est vraiment de 0 entre les boutons sur la première capture (et parce qu'un ami a apparemment réussi a le faire avec) que je pensais que pack() pouvait être utilisé. 

-
Edité par Anonyme 16 avril 2015 à 20:11:16

  • Partager sur Facebook
  • Partager sur Twitter
16 avril 2015 à 21:10:23

Il existe une dernière méthode pour placer les objets en tkinter: la méthode place(). C'est une méthode qui se sert des coordonnées pour placer les objets:

haut.place(x=120, y=30, width=50, height=25)
gauche.place(x=95, y=55, width=50, height=25)
droite.place(x=145, y=55, width=50, height=25)
bas.place(x=120, y=80, width=50, height=25)
  • Partager sur Facebook
  • Partager sur Twitter
Précepte: Le mieux est l'ennemi du bien
Anonyme
17 avril 2015 à 18:21:07

Finalement j'ai réussi avec pack() et le widget frame (je l'avais complètement oublié). Le résultat: http://puu.sh/hhdbw/28782c649d.png

Avec code: 

cadre1 = Frame(fen)
cadre = Frame(cadre1)
cadreScore = Frame(cadre1)

can = Canvas(fen,width="500",height="500")
depart = Button(cadre1,text='Depart',command=reset)
haut = Button(cadre1,text='H',command=H)
gauche = Button(cadre,text='G',command=G)
droite = Button(cadre,text='D',command=D)
bas = Button(cadre1,text='B',command=B)
points = Label(cadreScore,text="Score:")
saisie = Entry(cadreScore)
saisie.config(width='5')

quitter = Button(fen,text='Quitter',command=fen.destroy)

############################################

depart.pack()

gauche.pack(side=LEFT)
droite.pack(side=LEFT)
haut.pack()
cadre.pack()
bas.pack()
can.pack(side=LEFT)
points.pack(side=LEFT)
saisie.pack(side=LEFT)
cadreScore.pack()

cadre1.pack()

quitter.pack(side=BOTTOM)

Mais du coup, comment gérer la marge entre chaque widget afin que ça fasse plus espacé comme sur la première capture?

  • Partager sur Facebook
  • Partager sur Twitter
28 juin 2020 à 15:58:08

Si tu veux un espacement il faut faire ceci je l'ai trouvé sur un site :

ipady=10, padx=10,pady=10

site: https://infoforall.fr/python/python-act110.html

  • Partager sur Facebook
  • Partager sur Twitter
28 juin 2020 à 16:10:19

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter