Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
tkinter [Le 31/01/2013, 19:14] 88.172.93.113 [Etude d'un programme simple] |
tkinter [Le 25/11/2023, 14:36] (Version actuelle) Amiralgaby [PyConnect] ne pas utiliser la commande ifconfig mais ip addr show |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | {{tag> programmation BROUILLON}} | + | {{tag> programmation python}} |
---- | ---- | ||
====== Créer des interfaces graphiques avec Tkinter ====== | ====== Créer des interfaces graphiques avec Tkinter ====== | ||
Ligne 5: | Ligne 5: | ||
===== Présentation ===== | ===== Présentation ===== | ||
- | **Tkinter** est une librairie basique mais très simple d'utilisation pour construire rapidement des interfaces graphiques avec [[:python|Python]]. | + | **Tkinter** est une bibliothèque basique mais très simple d'utilisation pour construire rapidement des interfaces graphiques avec [[:python|Python]]. |
- | Le style de widgets n'est pas très esthétique (question de goûts) mais ça reste tout de même une bonne base pour commencer dans le développement d'interface graphique (GUI). | + | Le style de widgets n'est pas très esthétique (question de goût) mais ça reste tout de même une bonne base pour commencer dans le développement d'interface graphique (GUI). |
===== Installation ===== | ===== Installation ===== | ||
Ligne 13: | Ligne 13: | ||
[[:tutoriel:comment_installer_un_paquet|Installez les paquets]]: | [[:tutoriel:comment_installer_un_paquet|Installez les paquets]]: | ||
* **[[apt>python-tk]]** | * **[[apt>python-tk]]** | ||
- | * **[[apt>python-imaging-tk]]** pour la gestion des images sous tkinter | + | * **[[apt>python-imaging-tk]]** pour la gestion des images sous tkinter |
- | * **[[apt>python3-tk]]** pour la version 3.x de python. | + | * **[[apt>python3-tk]]** pour la version 3.x de python. (La version 3.x comprend les widgets ttk) |
- | Ceci peut se résumer avec l'outil [[:apt-get]] en saisissant dans un [[:terminal]] les [[:commande_shell|commandes]] suivantes: | + | |
- | <code>sudo apt-get install python-tk | + | |
- | sudo apt-get install python-imaging-tk | + | |
- | sudo apt-get install python3-tk | + | |
- | </code> | + | |
- | ===== Etude d'un programme simple ===== | + | ===== Étude d'un programme simple ===== |
- | Pour commencer regarder et essayé de comprendre la structure du code: | + | Pour commencer, regardez et essayez de comprendre la structure du code : |
<file python> | <file python> | ||
Ligne 29: | Ligne 24: | ||
# | # | ||
# Programme Tkinter.py | # Programme Tkinter.py | ||
- | # | + | # Démonstration du language |
- | from Tkinter import * #Pour python3.x Tkinter devient tkinter | + | from Tkinter import * #Pour python3.x Tkinter devient tkinter |
class ApplicationBasic(): | class ApplicationBasic(): | ||
Ligne 49: | Ligne 44: | ||
self.bou_quitter.pack() | self.bou_quitter.pack() | ||
| | ||
- | self.fen.mainloop() | + | def run(self): |
+ | self.fen.mainloop() | ||
def action(self): | def action(self): | ||
Ligne 60: | Ligne 56: | ||
if __name__ == '__main__': | if __name__ == '__main__': | ||
app = ApplicationBasic() | app = ApplicationBasic() | ||
+ | app.run() | ||
</file> | </file> | ||
- | chaque partie correspond à: | + | chaque partie correspond à : |
- | * importation de la librairie: <file python>from Tkinter import *</file> | + | * importation de la librairie : <file python>from Tkinter import *</file> |
- | * la création d'une classe: <file python>class ApplicationBasic():</file> | + | * création d'une classe : <file python>class ApplicationBasic():</file> |
- | * la création d'une méthode constructrice: <file python>def __init__(self):</file> | + | * création d'une méthode constructrice : <file python>def __init__(self):</file> |
- | * instancier une fenêtre Tk(): <file python>self.fen = Tk()</file> | + | * instancier une fenêtre Tk() : <file python>self.fen = Tk()</file> |
- | * définition du titre de cette fenêtre: <file python>self.fen.title('Tkinter')</file> | + | * définition du titre de cette fenêtre : <file python>self.fen.title('Tkinter')</file> |
- | * création d'un simple bouton action: <file python>self.bou_quitter = Button(self.fen)</file> | + | * création d'un simple bouton action : <file python>self.bou_action = Button(self.fen)</file> |
- | * configuration de ce bouton: <file python>self.bou_action.config(text='Action', command=self.action)</file> | + | * configuration de ce bouton : <file python>self.bou_action.config(text='Action', command=self.action)</file> |
- | * mise en place de celui-ci dans la fenêtre avec une méthode de placement: <file python>self.bou_action.pack()</file> | + | * mise en place de celui-ci dans la fenêtre avec une méthode de placement : <file python>self.bou_action.pack()</file> |
- | * définition de la fonction qui sera connecté au bouton //Action//: <file python> | + | * définition de la fonction qui sera connectée au bouton //Action// : <file python> |
- | ef action(self): | + | def action(self) : |
'''Action sur un bouton''' | '''Action sur un bouton''' | ||
self.lab = Label(self.fen) | self.lab = Label(self.fen) | ||
Ligne 79: | Ligne 76: | ||
</file> | </file> | ||
- | * même travail pour créer un bouton quitter. Ici vous constaterez qu'il n'est pas nécessaire de créer une fonction dédiée à ce bouton, la commande associée faisant le nécessaire: <file python>self.bou_quitter = Button(self.fen) | + | * même travail pour créer un bouton quitter. Ici vous constaterez qu'il n'est pas nécessaire de créer une fonction dédiée à ce bouton, la commande associée faisant le nécessaire : <file python>self.bou_quitter = Button(self.fen) |
self.bou_quitter.config(text='Quitter', command=self.fen.destroy) | self.bou_quitter.config(text='Quitter', command=self.fen.destroy) | ||
self.bou_quitter.pack()</file> | self.bou_quitter.pack()</file> | ||
- | * lancement du gestionnaire d'événements: <file python>self.fen.mainloop()</file> | + | * lancement du gestionnaire d'événements : <file python>self.fen.mainloop()</file> |
- | * assignation de la classe à une variable:<file python>app = ApplicationBasic()</file> | + | * assignation de la classe à une variable :<file python>app = ApplicationBasic()</file> |
- | Enregistrer votre fichier source avec une exrenstion .py | + | Enregistrez votre fichier source avec une extension //.py// puis lancez-le depuis un [[:terminal]] en saisissant la [[:commande_shell|commande]] suivante: |
- | Dans un terminal: | + | <code>python 'fichier.py'</code> |
- | </code>python 'fichier.py'</code> | + | |
{{:programmetkinter.png?direct&100|Fenêtre nommée Tkinter avec les deux boutons}} | {{:programmetkinter.png?direct&100|Fenêtre nommée Tkinter avec les deux boutons}} | ||
{{:terminal:programmetkinter01.png?direct&100|Fenêtre Tkinter après appui sur le bouton //Action//}} | {{:terminal:programmetkinter01.png?direct&100|Fenêtre Tkinter après appui sur le bouton //Action//}} | ||
- | ===== Configurer correctement sa fenêtre ===== | + | ===== Exemple de programmes ===== |
- | Nous allons voir dans cette section comment bien configurer sa fenêtre selon le but recherché. | + | ==== PyConnect ==== |
- | Nous prendront comme référence les variables du programme précédent. | + | La structure du code est un peu différente car j'utilise une classe. |
- | Voici les principales configurations les plus utilisées: | + | |
- | * Titre de la fenêtre | ||
- | La configuration du titre de la fenêtre s'effectue trés simplement: | ||
- | <file python>self.fen.title('Votre Titre')</file> | ||
- | |||
- | * Dimension de le fenêtre | ||
- | Pour configurer la taille: | ||
- | <file python>self.fen.geometry((400x400))</file> | ||
- | Le code peut varier selon la logique du développeur, nous pourions trés bien écrire: | ||
<file python> | <file python> | ||
- | self.taille = (400,400) | + | #!/usr/bin/env python |
- | self.fen.geometry(self.taille) | + | # -*- coding: utf-8 -*- |
+ | # | ||
+ | # PyConnect.py | ||
+ | # | ||
+ | # Vérification de la connexion internet avec interface et ping | ||
+ | # | ||
+ | |||
+ | #Importation des librairies nécéssaire au bon fonctionnement du programme. | ||
+ | #Tkinter pour l'interface graphique | ||
+ | #urllib pour les schémas internet | ||
+ | #os pour dialoguer avec le systeme | ||
+ | from tkinter import * | ||
+ | from urllib import request | ||
+ | import os | ||
+ | class Application(Frame): | ||
+ | def __init__(self,parent): | ||
+ | Frame.__init__(self) | ||
+ | self.parent = parent | ||
+ | self.etat = Label(self, text='',font='Times 28 italic bold') | ||
+ | self.etat.grid(row=0, column=0, columnspan=4, sticky=NSEW) | ||
+ | |||
+ | self.lab_iface = Label(self, text='Interfaces:',font='Times',underline=0) | ||
+ | self.lab_iface.grid(row=1,column=0,sticky=NSEW) | ||
+ | |||
+ | self.iface = Text(self, font='Times 10') | ||
+ | self.iface.grid(row=2, column=0, sticky=NSEW) | ||
+ | |||
+ | self.lab_ping = Label(self, text='Ping:',font='Times',underline=0) | ||
+ | self.lab_ping.grid(row=1,column=2,sticky=NSEW) | ||
+ | |||
+ | self.ping = Text(self, font='Times',state='disabled') | ||
+ | self.ping.grid(row=2, column=1, columnspan=3, sticky=NSEW) | ||
+ | |||
+ | self.recharger = Button(self, text='Recharger', font='Times', command=self.checkIface) | ||
+ | self.recharger.grid(row=3, column=0, sticky=NSEW) | ||
+ | |||
+ | self.quitter = Button(self, text='Quitter', font='Times', command=self.leave) | ||
+ | self.quitter.grid(row=3, column=1, columnspan=3,sticky=NSEW) | ||
+ | |||
+ | self.checkIface() | ||
+ | |||
+ | def checkIface(self): | ||
+ | self.iface.config(state='normal') | ||
+ | self.iface.delete(1.0,END) | ||
+ | self.listing = os.popen('ip addr show', 'r').read() | ||
+ | self.iface.insert(END, self.listing) | ||
+ | self.iface.config(state='disabled') | ||
+ | self.checkInternet() | ||
+ | |||
+ | def checkInternet(self): | ||
+ | try: | ||
+ | request.urlopen('http://www.google.com') | ||
+ | self.etat.config(text='Connexion internet active') | ||
+ | self.checkPing() | ||
+ | except Exception as e: | ||
+ | print(e) | ||
+ | self.etat.config(text='Connexion internet inactive') | ||
+ | self.ping.config(state='normal') | ||
+ | self.ping.delete(1.0,END) | ||
+ | self.ping.insert(END, 'Ping impossible...') | ||
+ | self.ping.config(state='disabled') | ||
+ | |||
+ | def checkPing(self): | ||
+ | self.ping.config(state='normal') | ||
+ | self.ping.delete(1.0,END) | ||
+ | c = 3 | ||
+ | while c != 0: | ||
+ | self.pingPacket = os.popen('ping -c 1 google.com').read() | ||
+ | self.ping.insert(END, self.pingPacket+'\n') | ||
+ | self.parent.after(1,self.parent.update()) | ||
+ | c = c-1 | ||
+ | |||
+ | self.ping.config(state='disabled') | ||
+ | |||
+ | def leave(self): | ||
+ | quit() | ||
+ | |||
+ | if __name__ == '__main__': | ||
+ | fen = Tk() | ||
+ | fen.title('Connexion Internet') | ||
+ | fen.resizable(False,False) | ||
+ | |||
+ | app = Application(fen) | ||
+ | app.grid(row=0, column=0, sticky=NSEW) | ||
+ | |||
+ | fen.mainloop() | ||
</file> | </file> | ||
- | ou encore pour un petit exemple: | + | {{:pyconnect.png?800|}} |
- | <file python> | + | |
- | self.fenwidth = 400 | + | |
- | self.fenheight = 400 | + | |
- | self.fen.geometry((self.fenwidth,self.fenheight)) | + | |
- | </file> | + | |
- | Noter que la configuration des dimensions se fait selon le shéma: 'largeur' x 'hauteur'. | + | |
- | + | ||
- | Pour configurer le placement sur l'écran: | + | |
- | Imaginer maintenant vouloir placer une fenêtre de (400x400) centré sur votre écran. | + | |
- | Pour ma part je créerais une fonction gérant cela: | + | |
- | <file python> | + | |
- | self.screenwidth = self.fen.winfo_screenwidth() #Récupération de la largeur de l'écran | + | |
- | self.screenheight = self.fen.winfo_screenheight() #Récupération de la hauteur de l'écran | + | |
- | + | ||
- | def geometry_fen(self): | + | |
- | '''Cette fonction est utilisé pour mettre à jour les éléments graphiques | + | |
- | et créer une géométrie pour la fenêtre.''' | + | |
- | self.fen.update_idletasks() #Recalcul des propriétés de la fenêtres en prenant en compte les widgets placé. | + | |
- | + | ||
- | self.fenwidth = 400 #Définition de la largeur de la fenêtre. | + | |
- | self.fenheight = 400 #Définition de la hauteur de la fenêtre. | + | |
- | + | ||
- | x = (self.screenwidth/2) - (self.fenwidth/2) #Division par 2 de la largeur de l'écran moins la largeur de la fenêtre par 2. | + | |
- | y = (self.screenheight/2) - (self.fenheight/2) #Division par 2 de la hauteur de l'écran moins la hauteur de la fenêtre par2 | + | |
- | + | ||
- | self.fen.geometry('%dx%d+%d+%d' % (self.fenwidth, self.fenheight, x, y)) #Définition de la géométrie de la fenêtre. | + | |
- | </file> | + | |
- | Pour appliquer la géométrie, il vous suffira de lancer cette fonction avant de lancer le gestionnaire d'événement. | + | |
- | + | ||
- | * Redimensionnement de la fenêtre | + | |
- | Le redimmensionnement de la fenêtre, par defaut est vrai autant pour x et y. Cela veut dire que l'utilisateur peut modifier autant qu'il le souhaite la largeur comme la hauteur de la fenêtre. | + | |
- | + | ||
- | Comment interdire le redimmensionnement de la fenêtre? | + | |
- | <file python> | + | |
- | self.fen.resizable(False,False) #Toujours suivant le même shéma: largeur, hauteur. | + | |
- | </file> | + | |
- | Est-il possible d'interdire de modifier seulement la hauteur ou la largeur? | + | |
- | <file python> | + | |
- | self.fen.resizable(True,False) #Pour autoriser seulement le changement en x. | + | |
- | self.fen.resizable(False,True) #Pour autoriser seulement le changement en y. | + | |
- | </file> | + | |
- | * Style de la fenêtre | + | |
- | + | ||
- | ===== Les 4 widgets de bases ===== | + | |
- | + | ||
- | * Label | + | |
- | Le Label est utilisé pour afficher du texte dans la fenêtre. | + | |
- | * Button | + | |
- | Un simple bouton cliquable. | + | |
- | * Canvas | + | |
- | Permet de faire pas mal de choses, nottamment dessiner. On y reviendra plus tard. | + | |
- | * Entry | + | |
- | Zone de récupération de saisies utilisateur. | + | |
- | + | ||
- | + | ||
===== Liens ===== | ===== Liens ===== | ||
- | * [[http://wiki.python.org/moin/TkInter|Tkinter]] (En) | + | * [[https://wiki.python.org/moin/TkInter|Tkinter]] (En) |
+ | * [[http://effbot.org/tkinterbook/|Tkinter]] (En) | ||
+ | * [[https://github.com/tarball69/tkRAD/wiki/Accueil|tkRAD: Tkinter XML widget builder]] (Fr) - génération facile de widgets Tkinter grâce à un fichier source XML. | ||
* [[:python]] | * [[:python]] | ||
+ | * [[:glade]] : pour créer des GUI facilement | ||
---- | ---- | ||
- | //Contributeurs:FIXME // | + | //Contributeurs:Boileau jonathan -- Mail: [[couverture.jonathan.b@gmail.com]] // |