Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

tkinter positionnement checkboxes et boutons

1 réponse
Avatar
Lulu
Salut,

Je suis en train d'écrire une interface graphique pour mon script en
python 3 qui trace des spectres lumineux.

J'ai mis tous les widgets dans des frames.

J'ai deux problèmes
1) j'ai onze checkbox qui permettent de sélectionner les éléments
chimiques (3 rows de 4 colonnes) mais la première colonne qui contient
des éléments chimiques au nom un peu long est un peu plus large que les
trois autres malgré un column.configure()
2) j'aurais voulu que le bouton "Quitter" soit complètement à gauche et
le bouton "Dessiner le spectre" soit complètement à droite mais mon
anchor='w' pour le premier et anchor='e' pour le second sont sans effet.

Merci de vos avis


PS : si un (ou des) prof(s) de physique/chimie traînent par ici, je peux
fournir le lien où télécharger mon code (quand l'interface graphique
sera terminée)



#!/usr/bin/python3
# -*- coding: utf-8 -*-

from tkinter import *
from tkinter import font
import math

fenetre = Tk()
# http://python.jpvweb.com/python/mesrecettespython/doku.php?id=geometrie_fenetre
#fenetre.geometry("%dx%d%+d%+d" % (700,400,50,50))
#fenetre.geometry('700x400')
fenetre.configure(background='#00b')
fenetre.title('Spectres lumineux')

ze_font = font.Font(family='Helvetica', size='12')

# code RGB classique, sur 4, 8 ou 12 bits
ze_bg='#a0a0ff' #bg = background = couleur du fond
ze_fg='#202060' #fg = foreground = couleur du texte
ze_abg='#ffff60' #active_foreground = couleur du fond survolé

# à choisir parmi 'flat', 'raised', 'sunken', 'groove', 'ridge'
# http://tkinter.fdex.eu/doc/sa.html#reliefs
ze_relief='groove'

# 'borderwidth' peut s'abréger en 'bd' : valeur en pixels
ze_bd=4

# frame pour choisir les éléments chimiques
cadre_choix_elements = Frame( fenetre, bg=ze_bg, relief=ze_relief, bd=ze_bd, cursor='pirate')
cadre_choix_elements.grid( row=4, column=0, padx=10, pady=5, ipadx=10, sticky='ew')
cadre_choix_elements.columnconfigure(0, weight=1)
cadre_choix_elements.columnconfigure(1, weight=1)
cadre_choix_elements.columnconfigure(2, weight=1)
cadre_choix_elements.columnconfigure(3, weight=1)

texte = Label( cadre_choix_elements, bg=ze_bg, fg=ze_fg, text = "Éléments chimiques :", font=ze_font)
texte.grid( row=0, column=0, sticky='w')

ze_sticky = 'ew'

var_Hydrogene = StringVar()
case = Checkbutton(cadre_choix_elements, bg=ze_bg, fg=ze_fg, activebackground=ze_abg, text="Hydrogène", anchor='w', variable=var_Hydrogene, font=ze_font)
# var_Hydrogene.get()
# Si la case est cochée, la valeur renvoyée par la variable sera 1. Si elle n'est pas cochée, ce sera0.
case.grid( row=1, column=0, sticky=ze_sticky)

var_Helium = StringVar()
case = Checkbutton(cadre_choix_elements, bg=ze_bg, fg=ze_fg, activebackground=ze_abg, text="Hélium", anchor='w', variable=var_Helium, font=ze_font)
case.grid( row=1, column=1, sticky=ze_sticky)

var_Lithium = StringVar()
case = Checkbutton(cadre_choix_elements, bg=ze_bg, fg=ze_fg, activebackground=ze_abg, text="Lithium", anchor='w', variable=var_Lithium, font=ze_font)
case.grid( row=1, column=2, sticky=ze_sticky)

var_Sodium = StringVar()
case = Checkbutton(cadre_choix_elements, bg=ze_bg, fg=ze_fg, activebackground=ze_abg, text="Sodium", anchor='w', variable=var_Sodium, font=ze_font)
case.grid( row=1, column=3, sticky=ze_sticky)

var_Magnesium = StringVar()
case = Checkbutton(cadre_choix_elements, bg=ze_bg, fg=ze_fg, activebackground=ze_abg, text="Magnésium", anchor='w', variable=var_Magnesium, font=ze_font)
case.grid( row=2, column=0, sticky=ze_sticky)

var_Argon = StringVar()
case = Checkbutton(cadre_choix_elements, bg=ze_bg, fg=ze_fg, activebackground=ze_abg, text="Argon", anchor='w', variable=var_Argon, font=ze_font)
case.grid( row=2, column=1, sticky=ze_sticky)

var_Calcium = StringVar()
var_Calcium.set("1")
case = Checkbutton(cadre_choix_elements, bg=ze_bg, fg=ze_fg, activebackground=ze_abg, text="Calcium", anchor='w', variable=var_Calcium, font=ze_font)
case.grid( row=2, column=2, sticky=ze_sticky)

var_Titane = StringVar()
case = Checkbutton(cadre_choix_elements, bg=ze_bg, fg=ze_fg, activebackground=ze_abg, text="Titane", anchor='w', variable=var_Titane, font=ze_font)
case.grid( row=2, column=3, sticky=ze_sticky)

var_Manganese = StringVar()
case = Checkbutton(cadre_choix_elements, bg=ze_bg, fg=ze_fg, activebackground=ze_abg, text="Manganèse", anchor='w', variable=var_Manganese, font=ze_font)
case.grid( row=3, column=0, sticky=ze_sticky)

var_Fer = StringVar()
case = Checkbutton(cadre_choix_elements, bg=ze_bg, fg=ze_fg, activebackground=ze_abg, text="Fer", anchor='w', variable=var_Titane, font=ze_font)
case.grid( row=3, column=1, sticky=ze_sticky)

var_Hydrargyrum = StringVar()
case = Checkbutton(cadre_choix_elements, bg=ze_bg, fg=ze_fg, activebackground=ze_abg, text="Hydrargyrum", anchor='w', variable=var_Hydrargyrum, font=ze_font)
case.grid( row=3, column=2, sticky=ze_sticky)


# frame pour les boutons 'Quitter' et 'Dessiner le spectre'
cadre_boutons = Frame( fenetre, bg=ze_bg, relief=ze_relief, bd=ze_bd)
cadre_boutons.grid( row=6, padx=10, pady=5, ipadx=10, sticky='ew')

button = Button( cadre_boutons, text = "Quitter", bg=ze_bg, fg=ze_fg, activebackground=ze_abg, command = fenetre.quit, font=ze_font, anchor='w')
button.grid( row=0, column=0, padx=10, pady=10, sticky='ew')

button = Button( cadre_boutons, text = "Dessiner le spectre", bg=ze_bg, fg=ze_fg, activebackground=ze_abg, command = callback, font=ze_font, anchor='e')
button.grid( row=0, column=3, padx=10, pady=10, sticky='ew')

1 réponse

Avatar
Lulu
Le 17-03-2020, Lulu a écrit :
Salut,
Je suis en train d'écrire une interface graphique pour mon script en
python 3 qui trace des spectres lumineux.
J'ai mis tous les widgets dans des frames.
J'ai deux problèmes
1) j'ai onze checkbox qui permettent de sélectionner les éléments
chimiques (3 rows de 4 colonnes) mais la première colonne qui contient
des éléments chimiques au nom un peu long est un peu plus large que les
trois autres malgré un column.configure()

Pas trouvé de solution pour ce point...
2) j'aurais voulu que le bouton "Quitter" soit complètement à gauche et
le bouton "Dessiner le spectre" soit complètement à droite mais mon
anchor='w' pour le premier et anchor='e' pour le second sont sans effet.

J'ai trouvé la solution au point 2)
cadre_choix_elements.grid( row=4, column=0, padx, pady=5, ipadx, sticky='ew')
[...]
# frame pour les boutons 'Quitter' et 'Dessiner le spectre'
cadre_boutons = Frame( fenetre, bg=ze_bg, relief=ze_relief, bd=ze_bd)
cadre_boutons.grid( row=6, padx, pady=5, ipadx, sticky='ew')

Il manquait column=0
cadre_boutons.grid( row=6, column = 0, padx, pady=5, ipadx, sticky='ew')
Il manquait aussi :
cadre_boutons.columnconfigure(0, weight=1)
cadre_boutons.columnconfigure(1, weight=1)
cadre_boutons.columnconfigure(2, weight=1)
cadre_boutons.columnconfigure(3, weight=1)
button = Button( cadre_boutons, text = "Quitter", bg=ze_bg, fg=ze_fg, activebackground=ze_abg, command = fenetre.quit, font=ze_font, anchor='w')
button.grid( row=0, column=0, padx, pady, sticky='ew')

J'ai changé le sticky='ew' par sticky='w'
button.grid( row=0, column=0, padx, pady, sticky='w')
J'avais rajouté un frame pour écrire mon nom et ma licence entre les
boutons "Quitter" et "Dessiner le spectre" :
cadre_notice = tk.Frame( cadre_boutons, bg=ze_bg, relier='flat', bd=ze_bd)
cadre_notice.grid( row=0, column=1, columnspan=2, sticky='ew')
ze_font = font.Font(family='Helvetica', size='9')
label = tk.label( cadre_notice, bg=ze_bg, fg=ze_fg, text = "Auteur : XXXXXX, ",
font=ze_font)
label.grid( row=0, column=0, columnspan=2, sticky='ew')
label = tk.Label( cadre_notice, bg=ze_bg, fg=ze_fg, text = "licence CC-BY-NC-SA : attribution,
non-commercial, share alike", font=ze_font)
label.grid( row=1, column=0, columnsân=2, sticky='ew')
ze_font = font.FOnt(family='Helvetica', size='12')
button = Button( cadre_boutons, text = "Dessiner le spectre", bg=ze_bg, fg=ze_fg, activebackground=ze_abg, command = callback, font=ze_font, anchor='e')

rien de changé ici, sauf l'appel à Button qui devient tk.Button car je suis passé
de "from tkinter import *" à "import tkinter as tk"
button = tk.Button( cadre_boutons, text = "Dessiner le spectre", bg=ze_bg, fg=ze_fg, activebackground=ze_abg, command = callback, font=ze_font, anchor='e')
button.grid( row=0, column=3, padx, pady, sticky='ew')

Par contre, de manière inexplicable, j'avais laissé trainer un sticky='ew'. En remplaçant par
sticky='e', j'obtiens ce que je voulais.
Conclusion, il fallait...
- indiquer "column=0" dans cadre_boutons.grid()
- préciser "cadre_boutons.columnconfigure(0, weight=1)" pour chacune des
quatres column du cadre.
- préciser sticky='e' plutôt que sticky='ew' sur le bouton de droite.