{{tag> programmation python}}
----
====== Créer des interfaces graphiques avec Tkinter ======
===== Présentation =====
**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ût) mais ça reste tout de même une bonne base pour commencer dans le développement d'interface graphique (GUI).
===== Installation =====
[[:tutoriel:comment_installer_un_paquet|Installez les paquets]]:
  * **[[apt>python-tk]]**
  * **[[apt>python-imaging-tk]]** pour la gestion des images sous tkinter
  * **[[apt>python3-tk]]** pour la version 3.x de python. (La version 3.x comprend les widgets ttk)
===== Étude d'un programme simple =====
Pour commencer, regardez et essayez de comprendre la structure du code :
#!/usr/bin/env python
# -*- coding: Latin-1 -*-
#
#  Programme Tkinter.py
#  Démonstration du language
from Tkinter import * #Pour python3.x Tkinter devient tkinter
class ApplicationBasic():
	'''Application principale'''
	def __init__(self):
		'''constructeur'''
		self.fen = Tk()
		self.fen.title('Tkinter')
		
		self.bou_action = Button(self.fen)
		self.bou_action.config(text='Action', command=self.action)
		self.bou_action.pack()
		
		self.bou_quitter = Button(self.fen)
		self.bou_quitter.config(text='Quitter', command=self.fen.destroy)
		self.bou_quitter.pack()
  
	def run(self):
                self.fen.mainloop()
		
	def action(self):
		'''Action sur un bouton'''
		self.lab = Label(self.fen)
		self.lab.config(text='Bravo!!!')
		self.lab.pack()
      
      
if __name__ == '__main__':
	app = ApplicationBasic()
        app.run()
chaque partie correspond à :
  * importation de la librairie : from Tkinter import *
  * création d'une classe : class ApplicationBasic():
  * création d'une méthode constructrice : def __init__(self):
  * instancier une fenêtre Tk() : self.fen = Tk()
  * définition du titre de cette fenêtre : self.fen.title('Tkinter')
  * création d'un simple bouton action : self.bou_action = Button(self.fen)
     * configuration de ce bouton : self.bou_action.config(text='Action', command=self.action)
     * mise en place de celui-ci dans la fenêtre avec une méthode de placement : self.bou_action.pack()
     * définition de la fonction qui sera connectée au bouton //Action// : 
  def action(self) :
      '''Action sur un bouton'''
      self.lab = Label(self.fen)
      self.lab.config(text='Bravo!!!')
      self.lab.pack()
  * 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 : self.bou_quitter = Button(self.fen)
self.bou_quitter.config(text='Quitter', command=self.fen.destroy)
self.bou_quitter.pack()
  * lancement du gestionnaire d'événements : self.fen.mainloop()
  * assignation de la classe à une variable :app = ApplicationBasic()
Enregistrez votre fichier source avec une extension //.py// puis lancez-le depuis un [[:terminal]] en saisissant la [[:commande_shell|commande]] suivante:
python 'fichier.py'
 {{: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//}}
===== Exemple de programmes =====
==== PyConnect ====
La structure du code est un peu différente car j'utilise une classe.
#!/usr/bin/env python
# -*- 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()
{{:pyconnect.png?800|}}
===== Liens =====
  * [[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]]
  * [[:glade]] : pour créer des GUI facilement
----
//Contributeurs:Boileau jonathan -- Mail: [[couverture.jonathan.b@gmail.com]] //