Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| tkinter [Le 11/02/2013, 05:50] – [Etude d'un programme simple] FIXME ce serait pas self.bou_action au lieu de self.bou_quitter pour le premier bouton? + erreur syntaxe balise code fabux | tkinter [Le 25/11/2023, 14:36] (Version actuelle) – [PyConnect] ne pas utiliser la commande ifconfig mais ip addr show Amiralgaby | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | {{tag> programmation | + | {{tag> programmation |
| ---- | ---- | ||
| ====== 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 | + | **Tkinter** est une bibliothèque |
| - | 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' | + | 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' |
| ===== Installation ===== | ===== Installation ===== | ||
| Ligne 13: | Ligne 13: | ||
| [[: | [[: | ||
| * **[[apt> | * **[[apt> | ||
| - | * **[[apt> | + | * **[[apt> |
| - | * **[[apt> | + | * **[[apt> |
| - | Ceci peut se résumer avec l' | + | |
| - | < | + | |
| - | sudo apt-get install python-imaging-tk | + | |
| - | sudo apt-get install python3-tk | + | |
| - | </ | + | |
| - | ===== Etude d'un programme simple ===== | + | ===== Étude |
| - | Pour commencer, regardez et essayer | + | Pour commencer, regardez et essayez |
| <file python> | <file python> | ||
| Ligne 29: | Ligne 24: | ||
| # | # | ||
| # Programme Tkinter.py | # Programme Tkinter.py | ||
| - | # | + | # |
| - | 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): |
| + | | ||
| def action(self): | def action(self): | ||
| Ligne 60: | Ligne 56: | ||
| if __name__ == ' | if __name__ == ' | ||
| app = ApplicationBasic() | app = ApplicationBasic() | ||
| + | app.run() | ||
| </ | </ | ||
| chaque partie correspond à : | chaque partie correspond à : | ||
| * importation de la librairie : <file python> | * importation de la librairie : <file python> | ||
| - | * la création d'une classe : <file python> | + | * création d'une classe : <file python> |
| - | * la création d'une méthode constructrice : <file python> | + | * création d'une méthode constructrice : <file python> |
| * instancier une fenêtre Tk() : <file python> | * instancier une fenêtre Tk() : <file python> | ||
| * définition du titre de cette fenêtre : <file python> | * définition du titre de cette fenêtre : <file python> | ||
| - | * création d'un simple bouton action : <file python> | + | * création d'un simple bouton action : <file python> |
| * configuration de ce bouton : <file python> | * configuration de ce bouton : <file python> | ||
| * mise en place de celui-ci dans la fenêtre avec une méthode de placement : <file python> | * mise en place de celui-ci dans la fenêtre avec une méthode de placement : <file python> | ||
| - | * définition de la fonction qui sera connecté | + | * définition de la fonction qui sera connectée |
| - | | + | |
| ''' | ''' | ||
| self.lab = Label(self.fen) | self.lab = Label(self.fen) | ||
| Ligne 87: | Ligne 84: | ||
| * assignation de la classe à une variable :<file python> | * assignation de la classe à une variable :<file python> | ||
| - | Enregistrer | + | Enregistrez |
| < | < | ||
| Ligne 93: | Ligne 90: | ||
| {{: | {{: | ||
| - | ===== 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 prendrons comme référence les variables du programme précédent. | + | La structure |
| - | Voici les principales configurations les plus utilisées : | + | |
| - | ==== Titre ==== | + | |
| - | + | ||
| - | La configuration | + | |
| - | <file python> | + | |
| - | + | ||
| - | ==== Dimensions ==== | + | |
| - | + | ||
| - | Pour configurer la taille : | + | |
| - | <file python> | + | |
| - | Le code peut varier selon la logique du développeur, | + | |
| - | <file python> | + | |
| - | self.taille = (400,400) | + | |
| - | self.fen.geometry(self.taille) | + | |
| - | </ | + | |
| - | ou encore pour un petit exemple : | + | |
| - | <file python> | + | |
| - | self.fenwidth = 400 | + | |
| - | self.fenheight = 400 | + | |
| - | self.fen.geometry((self.fenwidth, | + | |
| - | </ | + | |
| - | Noter que la configuration des dimensions se fait selon le shéma: | + | |
| - | ==== Placement sur l' | + | |
| - | + | ||
| - | Imaginer maintenant vouloir placer | + | |
| - | Pour ma part je créerais une fonction gérant cela : | + | |
| - | <file python> | + | |
| - | self.screenwidth = self.fen.winfo_screenwidth() | + | |
| - | self.screenheight = self.fen.winfo_screenheight() | + | |
| - | + | ||
| - | def geometry_fen(self) : | + | |
| - | ''' | + | |
| - | et créer une géométrie pour la fenêtre.''' | + | |
| - | self.fen.update_idletasks() #Recalcul des propriétés de la fenêtre en prenant en compte les widgets placés. | + | |
| - | + | ||
| - | self.fenwidth = 400 # | + | |
| - | self.fenheight = 400 # | + | |
| - | + | ||
| - | x = (self.screenwidth/ | + | |
| - | y = (self.screenheight/ | + | |
| - | + | ||
| - | self.fen.geometry(' | + | |
| - | </ | + | |
| - | Pour appliquer la géométrie, | + | |
| - | ==== Redimmensionnement ==== | + | |
| - | + | ||
| - | Le redimensionnement de la fenêtre, par défaut est vrai autant pour x et y. Cela veut dire que l' | + | |
| - | + | ||
| - | Comment interdire le redimmensionnement de la fenêtre ? | + | |
| - | <file python> | + | |
| - | self.fen.resizable(False, | + | |
| - | </ | + | |
| - | Est-il possible d' | + | |
| - | <file python> | + | |
| - | self.fen.resizable(True, | + | |
| - | self.fen.resizable(False, | + | |
| - | </ | + | |
| - | ==== Style de fenêtre ==== | + | |
| - | Il es tout à fait possible de créer une fenêtre sans bordures. Cette configuration sera parfaitement adapter pour un SplashScreen par exemple. | ||
| - | Regardons un exemple de code: | ||
| <file python> | <file python> | ||
| # | # | ||
| - | # -*- coding: | + | # -*- coding: |
| # | # | ||
| - | # | + | # |
| - | # | + | |
| # | # | ||
| - | # [[[ Splash Screen | + | # Vérification |
| # | # | ||
| - | # | + | |
| - | + | #Importation des librairies nécéssaire au bon fonctionnement du programme. | |
| - | from Tkinter | + | #Tkinter pour l' |
| + | #urllib pour les schémas internet | ||
| + | #os pour dialoguer avec le systeme | ||
| + | from tkinter | ||
| + | from urllib import request | ||
| import os | import os | ||
| - | + | class Application(Frame): | |
| - | class SplashScreen(): | + | def __init__(self,parent): |
| - | ''' | + | Frame.__init__(self) |
| - | def __init__(self): | + | self.parent |
| - | ''' | + | self.etat = Label(self, |
| - | self.fen = Tk() | + | self.etat.grid(row=0, column=0, columnspan=4, sticky=NSEW) |
| - | self.fen.resizable(False, | + | |
| - | self.fen.overrideredirect(1) | + | self.lab_iface = Label(self, text='Interfaces:',font='Times',underline=0) |
| - | + | self.lab_iface.grid(row=1,column=0,sticky=NSEW) | |
| - | self.screenwidth | + | |
| - | self.screenheight | + | self.iface = Text(self, font='Times 10') |
| - | + | self.iface.grid(row=2, column=0, sticky=NSEW) | |
| - | self.surface = Canvas(self.fen, bg='light blue', | + | |
| - | self.surface.pack(fill=BOTH, expand=1) | + | self.lab_ping = Label(self, text='Ping:',font='Times',underline=0) |
| - | + | self.lab_ping.grid(row=1,column=2,sticky=NSEW) | |
| - | self.surface.create_line(0,0,600,400, fill=' | + | |
| - | self.surface.create_line(0,10,600,400, fill='yellow', | + | self.ping = Text(self, font='Times',state='disabled') |
| - | self.surface.create_line(0, | + | self.ping.grid(row=2, column=1, columnspan=3, sticky=NSEW) |
| - | self.surface.create_line(0, | + | |
| - | self.surface.create_line(0,40,600,400, fill=' | + | self.recharger = Button(self, |
| - | self.surface.create_line(0,50,600,400, fill='yellow', width=4) | + | self.recharger.grid(row=3, column=0, sticky=NSEW) |
| - | self.surface.create_line(0, | + | |
| - | self.surface.create_line(0,110, | + | self.quitter = Button(self, text='Quitter', |
| - | self.surface.create_line(0,120, | + | self.quitter.grid(row=3, column=1, columnspan=3,sticky=NSEW) |
| - | self.surface.create_line(0, | + | |
| - | self.surface.create_line(0,140, | + | self.checkIface() |
| - | self.surface.create_line(0,150, | + | |
| - | self.surface.create_line(0, | + | def checkIface(self): |
| - | self.surface.create_line(0, | + | self.iface.config(state='normal') |
| - | self.surface.create_line(0,220, | + | self.iface.delete(1.0,END) |
| - | self.surface.create_line(0, | + | self.listing = os.popen('ip addr show', 'r').read() |
| - | self.surface.create_line(0,240, | + | self.iface.insert(END, self.listing) |
| - | self.surface.create_line(0, | + | self.iface.config(state='disabled') |
| - | self.surface.create_line(0, | + | self.checkInternet() |
| - | self.surface.create_line(0, | + | |
| - | self.surface.create_line(0,320, | + | def checkInternet(self): |
| - | + | try: | |
| - | self.surface.create_line(10,0,600,400, fill='yellow', | + | request.urlopen('http://www.google.com') |
| - | self.surface.create_line(20, | + | self.etat.config(text='Connexion internet active') |
| - | self.surface.create_line(30, | + | self.checkPing() |
| - | self.surface.create_line(40, | + | except Exception as e: |
| - | self.surface.create_line(50,0,600,400, fill=' | + | print(e) |
| - | self.surface.create_line(100, | + | self.etat.config(text='Connexion internet inactive') |
| - | self.surface.create_line(110, | + | self.ping.config(state='normal') |
| - | self.surface.create_line(120, | + | self.ping.delete(1.0,END) |
| - | self.surface.create_line(130,0,600,400, fill=' | + | self.ping.insert(END, 'Ping impossible...') |
| - | self.surface.create_line(140, | + | self.ping.config(state='disabled') |
| - | self.surface.create_line(150, | + | |
| - | self.surface.create_line(200, | + | def checkPing(self): |
| - | self.surface.create_line(210,0,600,400, fill=' | + | self.ping.config(state='normal') |
| - | self.surface.create_line(220, | + | self.ping.delete(1.0,END) |
| - | self.surface.create_line(230, | + | c = 3 |
| - | self.surface.create_line(240, | + | while c != 0: |
| - | self.surface.create_line(250, | + | self.pingPacket |
| - | self.surface.create_line(300, | + | self.ping.insert(END, self.pingPacket+'\n') |
| - | self.surface.create_line(310, | + | self.parent.after(1,self.parent.update()) |
| - | self.surface.create_line(320, | + | c = c-1 |
| - | self.surface.create_line(330, | + | |
| - | self.surface.create_line(340, | + | self.ping.config(state='disabled') |
| - | self.surface.create_line(350, | + | |
| - | self.surface.create_line(400, | + | def leave(self): |
| - | self.surface.create_line(410,0,600,400, fill=' | + | quit() |
| - | self.surface.create_line(420,0,600,400, fill='red', width=4) | + | |
| - | self.surface.create_line(430, | + | |
| - | self.surface.create_line(440, | + | |
| - | self.surface.create_line(450, | + | |
| - | self.surface.create_line(500, | + | |
| - | + | ||
| - | self.surface.create_oval(500,300, | + | |
| - | + | ||
| - | self.titre | + | |
| - | fill=' | + | |
| - | self.version | + | |
| - | fill=' | + | |
| - | + | ||
| - | self.versionSplash = self.surface.create_text(10,390, anchor=SW, text=' | + | |
| - | + | ||
| - | def run(self): | + | |
| - | ''' | + | |
| - | self.fen.after(20000, self.start_tkinterEditor) | + | |
| - | self.geometry_fen() | + | |
| - | + | ||
| - | self.fen.mainloop() | + | |
| - | + | ||
| - | def start_tkinterEditor(self): | + | |
| - | ''' | + | |
| - | self.fen.destroy() | + | |
| - | os.system('python tkinterEditor.py') | + | |
| - | + | ||
| - | def geometry_fen(self): | + | |
| - | ''' | + | |
| - | et créer une géométrie pour la fenêtre.''' | + | |
| - | self.fen.update_idletasks() | + | |
| - | + | ||
| - | self.fenwidth = 600 | + | |
| - | self.fenheight = 400 | + | |
| - | + | ||
| - | x = (self.screenwidth/ | + | |
| - | y = (self.screenheight/ | + | |
| - | + | ||
| - | self.fen.geometry(' | + | |
| - | + | ||
| if __name__ == ' | if __name__ == ' | ||
| - | splashscreen | + | fen = Tk() |
| - | splashscreen.run() | + | fen.title(' |
| - | + | fen.resizable(False, | |
| + | |||
| + | app = Application(fen) | ||
| + | app.grid(row=0, | ||
| + | |||
| + | fen.mainloop() | ||
| </ | </ | ||
| - | Et voilà le résultat: | + | {{:pyconnect.png?800|}} |
| - | + | ||
| - | {{: | + | |
| - | + | ||
| - | Si vous avez bien observé le code, vous aurez remarqué cette ligne: | + | |
| - | <file python> | + | |
| - | C'est cette ligne qui indique que la fenêtre ne possédera pas de bordures. Un petit conseil concernant cette ligne de code, dans mon cas j'ai créer un SplashScreen qui reste (n) secondes à l' | + | |
| - | ===== Les 4 widgets de base ===== | + | |
| - | ==== Label ==== | + | |
| - | + | ||
| - | Le Label est utilisé pour afficher du texte dans la fenêtre. | + | |
| - | ==== Button ==== | + | |
| - | + | ||
| - | Un simple bouton cliquable. | + | |
| - | ==== Canvas ==== | + | |
| - | + | ||
| - | Le widget Canvas est le plus intéressant de tous les widgets présents dans la librairie. | + | |
| - | Pourquoi? Tout simplement parce que vous pouvez pousser vos interfaces graphiques au maximum autant dans le style que dans les fonctionnalités.... | + | |
| - | Pour une construction simple et rapide d' | + | |
| - | Vous pourrez vous apercevoir que ces trois méthodes sont limitées et particulièrement linéaires. | + | |
| - | + | ||
| - | === Un peu de géométrie === | + | |
| - | + | ||
| - | === Dessiner === | + | |
| - | + | ||
| - | === Positionner des éléments === | + | |
| - | + | ||
| - | === Déplacements d' | + | |
| - | + | ||
| - | + | ||
| - | ==== Entry ==== | + | |
| - | + | ||
| - | Zone de récupération de saisies utilisateur. | + | |
| - | + | ||
| - | ===== Les autres widgets ===== | + | |
| - | En construction | + | |
| - | + | ||
| - | ===== La configuration des widgets ===== | + | |
| - | Chaque widgets et configurable dans la limite du raisonnable :-). Nous allons voir dans cette partie comment configurer vos widgets pour s' | + | |
| - | + | ||
| - | ==== Les couleurs ==== | + | |
| - | En construction | + | |
| - | ==== La police ==== | + | |
| - | En construction | + | |
| - | ==== Les dimensions ==== | + | |
| - | En construction | + | |
| - | ==== Reliefs et bordures ==== | + | |
| - | + | ||
| - | Pour la configuration des reliefs, vous utiliserez une variable de configuration nommé **relief**. | + | |
| - | Il existe actuellement 5 reliefs diffèrents les voici: | + | |
| - | <file python> | + | |
| - | + | ||
| - | from Tkinter import * | + | |
| - | + | ||
| - | class ButtonReliefs(): | + | |
| - | ''' | + | |
| - | def __init__(self): | + | |
| - | ''' | + | |
| - | self.fen = Tk() | + | |
| - | self.fen.title(' | + | |
| - | self.fen.resizable(False, | + | |
| - | + | ||
| - | # | + | |
| - | self.lab_reliefs = Label(self.fen, | + | |
| - | + | ||
| - | self.bou_flat = Button(self.fen) | + | |
| - | self.bou_raised = Button(self.fen) | + | |
| - | self.bou_sunken = Button(self.fen) | + | |
| - | self.bou_groove = Button(self.fen) | + | |
| - | self.bou_ridge = Button(self.fen) | + | |
| - | + | ||
| - | # | + | |
| - | self.lab_reliefs.config(text=' | + | |
| - | + | ||
| - | self.bou_flat.config(text=' | + | |
| - | self.bou_raised.config(text=' | + | |
| - | self.bou_sunken.config(text=' | + | |
| - | self.bou_groove.config(text=' | + | |
| - | self.bou_ridge.config(text=' | + | |
| - | + | ||
| - | # | + | |
| - | self.lab_reliefs.pack() | + | |
| - | self.bou_flat.pack() | + | |
| - | self.bou_raised.pack() | + | |
| - | self.bou_sunken.pack() | + | |
| - | self.bou_groove.pack() | + | |
| - | self.bou_ridge.pack() | + | |
| - | + | ||
| - | self.fen.mainloop() | + | |
| - | + | ||
| - | + | ||
| - | if __name__ == ' | + | |
| - | app = ButtonReliefs() | + | |
| - | </ | + | |
| - | En image: | + | |
| - | + | ||
| - | {{: | + | |
| - | ==== Autre ==== | + | |
| - | En construction | + | |
| - | + | ||
| - | ===== Relation Fonctions/ | + | |
| - | En construction | + | |
| - | + | ||
| - | ===== Les diffèrentes méthodes de placements ===== | + | |
| - | Il existe trois méthodes de placements dans la librairie Tkinter. L' | + | |
| - | ==== Pack() ==== | + | |
| - | En construction | + | |
| - | + | ||
| - | ==== Grid() ==== | + | |
| - | En construction | + | |
| - | + | ||
| - | ==== Place() ==== | + | |
| - | En construction | + | |
| - | + | ||
| - | ===== Les évènements ===== | + | |
| - | Nous allons maintenant étudier les évènements, | + | |
| - | Tout programme possède un gestionnaire d' | + | |
| - | <file python> | + | |
| - | du programme ci-dessus. | + | |
| - | ==== Souris ==== | + | |
| - | En construction | + | |
| - | ==== Clavier ==== | + | |
| - | En construction | + | |
| - | ==== Autres ==== | + | |
| - | En construction | + | |
| - | + | ||
| - | ===== Le Canvas, un widget intéressant ===== | + | |
| - | En construction | + | |
| - | + | ||
| - | ===== Un peu de multimédia ===== | + | |
| - | En construction | + | |
| - | ==== Gérer des images ==== | + | |
| - | En construction | + | |
| - | ==== Gérer de la musique ==== | + | |
| - | En construction | + | |
| - | + | ||
| - | ===== Qu' | + | |
| - | En construction | + | |
| - | + | ||
| - | ===== Exemple de programmes ===== | + | |
| - | + | ||
| - | ==== PyQuizzz version 0.1 -- GUI - Tkinter (en cours de construction) ==== | + | |
| - | + | ||
| - | {{:capture_du_2013-02-04_00_02_19.png?direct& | + | |
| - | + | ||
| - | === L' | + | |
| - | En construction | + | |
| - | + | ||
| - | === Le code === | + | |
| - | En construction | + | |
| - | ===== Pour aller plus loin ===== | + | |
| - | En construction | + | |
| ===== Liens ===== | ===== Liens ===== | ||
| - | * [[http:// | + | * [[https:// |
| + | * [[http:// | ||
| + | * [[https:// | ||
| * [[:python]] | * [[:python]] | ||
| * [[:glade]] : pour créer des GUI facilement | * [[:glade]] : pour créer des GUI facilement | ||
| ---- | ---- | ||
| - | // | + | // |
