Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/12/2018, à 21: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, à 22: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, à 22: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, à 22: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, à 19: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 wink

Hors ligne

#6 Le 07/12/2018, à 19: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, à 19:42

dje996

Re : python tkinter problème de fonction

merci kholo pour ton exemple, je vais regarder

Hors ligne