#1 Le 06/12/2018, à 20:50
- dje996
python tkinter problème de fonction
bonsoir,
J'ai un problème avec tkinter pour appeler ma fonction par le bouton.
#!/usr/bin/env python3
# coding: utf-8
import tkinter as tk
def fonctionBouton():
print("entry =",reponse.get())
boutton["text"]='switch1'
var.set('pourquoi pas')
def maFenetre():
fenetre=tk.Tk()
var=tk.StringVar()
var.set('texte par défaut')
labelTexteFichierVideo = tk.Label(fenetre, text="nom:")
labelTexteFichierVideo.grid(row=0, column=0, padx=5, pady=5)
reponse=tk.Entry(fenetre, textvariable=var)
reponse.grid(row=0, column=1, padx=5, pady=5)
boutton=tk.Button(fenetre, text="bouton1", command = fonctionBouton)
boutton.grid(row=1, column=0, padx=5, pady=5)
maFenetre()
erreur :NameError: name 'reponse' is not defined
Je ne comprend pas pourquoi cela na fonctionne pas?
Hors ligne
#2 Le 06/12/2018, à 21:16
- pingouinux
Re : python tkinter problème de fonction
Bonsoir,
Déjà, pour voir la fenêtre apparaître, je dois ajouter cette ligne à la fin de la fonction maFenetre.
input("Tapez Entrée pour terminer")
Pour que les variables soient connues dans la fonction fonctionBouton, il faut ajouter cette ligne au début de la fonction maFenetre.
global reponse, boutton, var
Hors ligne
#3 Le 06/12/2018, à 21:26
- dje996
Re : python tkinter problème de fonction
merci beaucoup pour ta réponse.
Ok, donc si j'ai une gros fonction maFenêtre avec plein de variables je suis obligé de tous déclarer en variable global?
Hors ligne
#4 Le 06/12/2018, à 21:54
- pingouinux
Re : python tkinter problème de fonction
À la place du input, il vaut mieux lancer une boucle d'événements, et tu peux récupérer les variables ainsi :
#!/usr/bin/env python3
# coding: utf-8
import tkinter as tk
def fonctionBouton():
print("entry =",reponse.get())
boutton["text"]='switch1'
var.set('pourquoi pas')
def maFenetre():
fenetre=tk.Tk()
var=tk.StringVar()
var.set('texte par défaut')
labelTexteFichierVideo = tk.Label(fenetre, text="nom:")
labelTexteFichierVideo.grid(row=0, column=0, padx=5, pady=5)
reponse=tk.Entry(fenetre, textvariable=var)
reponse.grid(row=0, column=1, padx=5, pady=5)
boutton=tk.Button(fenetre, text="bouton1", command = fonctionBouton)
boutton.grid(row=1, column=0, padx=5, pady=5)
return fenetre, reponse, boutton, var
fenetre, reponse, boutton, var = maFenetre()
fenetre.mainloop()
Hors ligne
#5 Le 07/12/2018, à 18:13
- kholo
Re : python tkinter problème de fonction
salut,
histoire de voir avec une class (nb : c'est pas de moi !):
#!/usr/bin/env python
# -*- coding: UTF8 -*-
# print('Bonjour Monde')
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.create_widgets()
def create_widgets(self):
self.hi_there = tk.Button(self)
self.hi_there["text"] = "Hello World\n(click me)"
self.hi_there["command"] = self.say_hi
self.hi_there.pack(side="top")
self.quit = tk.Button(self, text="QUIT", fg="red",
command=self.master.destroy)
self.quit.pack(side="bottom")
def say_hi(self):
print("hi there, everyone!")
if __name__ == "__main__":
# execute only if run as a script
root = tk.Tk()
app = Application(master=root)
app.mainloop()
ça montre pas mal de bon comportement...
reste à faire ses class
Hors ligne
#6 Le 07/12/2018, à 18:36
- dje996
Re : python tkinter problème de fonction
bon, j'ai testé ta solution. Dans un autre programme avec une vingtaine de variable, c'est lourd à gérer et il y a des problèmes quand je les mets dans un autre fichier(modulation). Enfin bref, du coup j'ai regardé pour faire une classe. J'ai pas le niveau et l'utilité pour créer des méthodes mais il me semble que c’est pus facile comme ça.
class FenetreClass():
def fonctionBouton(self):
print("entry =",self.reponse.get())
self.boutton["text"]='switch1'
self.var.set('pourquoi pas')
def __init__(self,monTexte) :
self.fenetre=tk.Tk()
self.var=tk.StringVar()
self.var.set(monTexte)
self.labelTexte = tk.Label(self.fenetre, text="nom:")
self.labelTexte.grid(row=0, column=0, padx=5, pady=5)
self.reponse=tk.Entry(self.fenetre, textvariable=self.var)
self.reponse.grid(row=0, column=1, padx=5, pady=5)
self.boutton=tk.Button(self.fenetre, text="bouton1", command = self.fonctionBouton)
self.boutton.grid(row=1, column=0, padx=5, pady=5)
self.fenetre.mainloop()
fen=FenetreClass('fenêtre 1')
print("on continu")
fen=FenetreClass('fenêtre 2')
print("on continu encore")
fen=FenetreClass('fenêtre 3')
Par contre, quand la 1ère fenêtre est instancie, elle s'ouvre, une fois fini je là ferme. Mon objet "fen" existe toujours? Puis je ré-ouvrir la fenêtre ou il faut ré-instancier l'objet comme j'ai fait "fen=FenetreClass('fenêtre 2')" ou pas ??
Hors ligne
#7 Le 07/12/2018, à 18:42
- dje996
Re : python tkinter problème de fonction
merci kholo pour ton exemple, je vais regarder
Hors ligne