Table des matières
Les bases d039;un interface graphique avec Tkinter
Quelques références de base pour utiliser Tkinter
- Documentation officielle :
-
- tkinter — interface Python à Tcl/Tk, reprenant quelques références recommandées
-
-
- Tkinter reference: a GUI for Python (online or pdf) by John W. Shipman)
- An Introduction to Tkinter, de Fredrik Lundh (tutoriel Tk)
- Tkinter tutorial, sur python-course.eu
Vérifier le comportement en utilisant Idle et la version de base de Python !
Une étiquette (Label) affichant "Bonjour !"
- tk-00.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from tkinter import * root = Tk() w=Label(root, text="Bonjour !") w.pack() root.mainloop()
Un bouton (Button) avec une action pour écrire
L039;écriture va s039;effectuer sur la console !
- tk-01.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from tkinter import * def action(): print("Yes, we can !") root = Tk() #w = Label(root, text="Bonjour!") #w.pack() b = Button(root,text="Click here !",command=action) b.pack() root.mainloop()
Pour le placement des composants dans la fenêtre, Tkinter utilise 3 méthodes (pack, grid, place) décrites ici, ou sur eefbot (grid, pack, et place).
Champ d039;entrée (Entry)
On peut mettre un champ d039;entrée et y introduire du texte
- tk-02.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from tkinter import * def action(): print("Yes, we can !") root = Tk() #w = Label(root, text="Bonjour!") #w.grid(row=?) champ = Entry(root) champ.grid(row=0) b = Button(root,text="Click here !",command=action) b.grid(row=1) root.mainloop()
Utiliser le texte rentré
En cliquant, on quitte et on écrit le texte rentré (on n039;utilise pas la fonction “action”)
- tk-03.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from tkinter import * def action(): print("Yes, we can !") # impression de la valeur du champ abcdef = champ.get() print(abcdef) root = Tk() w = Label(root, text="Bonjour!") w.grid(row=0) champ = Entry(root) champ.grid(row=1) b = Button(root,text="Click here !",command=action) b.grid(row=2) c = Button(root,text="Quit",command=root.quit) c.grid(row=3) root.mainloop() # éliminer la fenêtre : root.destroy()
Valeurs numériques et calcul
On fait un calcul avec la valeur rentrée, on quitte et on écrit
- tk-04.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from tkinter import * def factorielle(argu): # calcul de la factorielle de argu a = 1 # a contient une valeur qui va être incrémentée d'une unité à la fois b = 1 # contient la factorielle de a-1 while a <= argu: # on arrêtera lorsque a sera > argu b = b * a a = a + 1 return b def action(): print("Yes, we can !") root=Tk() #w=Label(root, text="Bonjour!") champ = Entry(root) champ.grid(row=0) b = Button(root,text="Click here !",command=root.quit) b.grid(row=1) root.mainloop() # lecture de la valeur du champ texte_n=champ.get() n = int(texte_n) print(n, factorielle(n)) # éliminer la fenêtre : root.destroy()
Tout faire dans interface graphique
Ce programme utilise un Label pour afficher le résultat, on ne quitte plus et on peut recalculer sur d039;autres valeurs entrées. Il y a un bouton pour terminer.
- tk-05.py
#!/usr/bin/env python # -*- coding: utf-8 -*- from tkinter import * def factorielle(argu): # calcul de la factorielle de argu a = 1 # a contient une valeur qui va être incrémentée d'une unité à la fois b = 1 # contient la factorielle de a-1 while a<=argu: # on arrêtera lorsque a sera > argu b = b * a a = a + 1 return b def action(): texte_n = champ.get() n = int(texte_n) affichefacto.configure(text =str(factorielle(n))) root=Tk() champ = Entry(root) champ.grid(row=0) b = Button(root,text="Calcule la factorielle",command=action) b.grid(row=1) affichefacto = Label(root) affichefacto.grid(row=2) bfin = Button(root,text="Terminer",command=root.quit) bfin.grid(row=3) root.mainloop() # éliminer la fenêtre après avoir quitté : root.destroy()
Pour d039;autres exemples, voir par exemple :
Canvas : des rectangles et des mouvements
- tk_canvas_rectangles_move.py
#! /usr/bin/env python # -*- coding: utf-8 -*- # Exemple utilisation du Canvas Tk pour gérer une boite avec couvercle mobile from tkinter import * def move(): "déplacement du couvercle" global hauteur,v hauteur = hauteur + v if hauteur > 250 or hauteur < 130: v = -v can.coords(couvercle,100,hauteur-20, 300, hauteur) flag=1 root.after(1,move) # boucler après 50 millisecondes root = Tk() can = Canvas( root, width=500, height=400 ) can.pack() can.create_rectangle( 95,100, 100, 355,fill='blue') can.create_rectangle( 300,100, 305, 355,fill='green') can.create_rectangle( 100,350, 300, 355,fill='red') hauteur = 150 couvercle = can.create_rectangle( 100,hauteur-20, 300, hauteur,fill='black') # animation simple: v = 0.1 # incrément/vitesse verticale move() can.mainloop()
Pour d039;autres exemples, voir par exemple :
Une étiquette dynamique
- compteur-01.py
#! /usr/bin/env python # -*- coding: utf-8 -*- # Exemple d'une étiquette dynamique par récursion import tkinter as tk def compteur_label(lab): def compte(): global compteur compteur += 1 lab.config(text=str(compteur)) lab.after(1000, compte) compte() root = tk.Tk() root.title("Comptage en secondes") label = tk.Label(root, fg="dark green") label.pack() compteur = -1 compteur_label(label) button = tk.Button(root, text='Arrêtez !', width=25, command=root.destroy) button.pack() root.mainloop()
Créer des points avec la souris
- points_souris-02.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # créer des points à l'aide de la souris # refs : # http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm from tkinter import * def point(event): can.create_oval(event.x-4, event.y-4, event.x+4, event.y+4, outline="black", fill="red") points.append([event.x,event.y]) return root = Tk() root.title("Créer des points !") points = [] can = Canvas(root, bg="grey", width=640, height= 480) can.configure(cursor="crosshair") can.grid(row=0) can.bind("<Button-1>", point) b = Button(root,text="Quitter",command=root.destroy) b.grid(row=1) root.mainloop() print(points)
Pour la gestion des événements, leur déclenchement, voir par exemple cette page.
Utiliser des boutons radio (radiobuttons)
- radiobuttons.py
#! /usr/bin/env python # -*- coding: utf-8 -*- # Exemple d'utilisation des boutons radio import tkinter as tk def affiche_choix(): i = v.get() print(i, positions[i-1][0]) root = tk.Tk() v = tk.IntVar() v.set(1) # choix par défaut positions = [("ortho",1),("meta",2),("para",3)] lab = tk.Label(root, text="Choix de la position", fg="dark blue") lab.pack() for txt, val in positions: b = tk.Radiobutton(root, text=txt, padx = 10, variable=v, command=affiche_choix, value=val) b.pack() tk.mainloop()
Utiliser des cases à cocher (checkbuttons)
- checkbuttons-03.py
#! /usr/bin/env python # -*- coding: utf-8 -*- # Exemple d'utilisation des cases à cocher import tkinter as tk def affiche_choix(): print(zip(elements, [etats[i].get() for i in range(len(elements))])) print(elements, [etats[i].get() for i in range(len(elements))]) root = tk.Tk() lab = tk.Label(root, text="Cochez les éléments présents", bg="red", fg="dark blue") lab.grid(row = 0) elements = ['C','H','O','N','P','S',u'éléments métalliques',u'halogénures',u'autres'] etats = [] nelem = len(elements) for i in range(nelem): etat = tk.IntVar() caco = tk.Checkbutton(root, text=elements[i], variable=etat,width = 20,padx=50,anchor = tk.W) caco.grid(row = i+1) etats.append(etat) button = tk.Button(root, text='Affichez !', width=25, command=affiche_choix) button.grid(row = nelem+1) tk.mainloop()
Les listes de choix (spinbox, listbox)
(à écrire)
Insérer une image (photoimage)
Solution : choisir dans les préférences de spyder la partie “Console IPython” et l039;onglet “Graphiques”. Désactiver la “Prise en charge des graphes (Matplotlib)”. Redémarrer le noyau. Ne pas oublier de remettre ensuite les réglages d039;origine.
Autre solution : menu “exécution”, sous-menu “profiler” → explications ??
Télécharger l039;image exemple au format png dans le même répertoire que le programme python
- image_import-01.py
#!/usr/bin/env python # -*- coding: utf-8 -*- """ insert a PNG image into a python tkinter window image png : https://upload.wikimedia.org/wikipedia/commons/c/c0/Wikipedia-sipi-image-db-mandrill-4.2.03-quantize-only-CCC.png cf. https://commons.wikimedia.org/wiki/File:Wikipedia-sipi-image-db-mandrill-4.2.03-quantize-only-CCC.png """ import tkinter as tk root = tk.Tk() img = tk.PhotoImage(file = "mandrill.png") label = tk.Label(root, image = img) #label.pack() label.grid() root.mainloop()
- Image utilisée historiquement fréquemment en traitement d039;images : https://en.wikipedia.org/wiki/Lenna
- Base d039;images pour test : http://sipi.usc.edu/database/ - exemple :
Autres composants logiciels (widgets) de Tkinter
Voici une liste et des liens vers des exemples pour d039;autres widgets :
Widgets | Exemples |
---|---|
Sliders (curseur de défilement) | http://www.python-course.eu/tkinter_sliders.php |
Texte | http://www.python-course.eu/tkinter_text_widget.php |
Boites de dialogue | http://www.python-course.eu/tkinter_dialogs.php |
Menus | http://www.python-course.eu/tkinter_menus.php |
Barres de progression (progressbar) | |
Échelles (scale) |
Références et démonstrations :
Des exemples d039;application
CustomTkinter
-
- Developing a QR Code Generator App in Python Teoman Berkay Ayaz, Dec 2022, Better Programming
ttkbootstrap
- ttkbootstrap a supercharged theme extension for tkinter that enables on-demand modern flat style themes inspired by Bootstrap