[python] à quoi sert le focus ???

Résolu/Fermé
Todesfall Messages postés 70 Date d'inscription lundi 30 avril 2007 Statut Membre Dernière intervention 17 septembre 2014 - 24 mai 2007 à 14:30
 fazzer - 17 mai 2018 à 00:17
Bonjour,

J'aimerai savoir à quoi sert le focus dans python ainsi que cette commande focus_set()

merci, d'avance !!!

54 réponses

Todesfall Messages postés 70 Date d'inscription lundi 30 avril 2007 Statut Membre Dernière intervention 17 septembre 2014
29 mai 2007 à 08:31
class propos(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.initialize()

def initialize(self):
text1 = Tkinter.Label(self, text = "Dossier Machine 2007").grid(row = 0, sticky = W)
text2 = Tkinter.Label(self, text = "Part of *** Edition 2007").grid(row = 1, sticky = W)
text3 = Tkinter.Label(self, text = "Copyright (c) ***. Tous droits réservés.").grid(row = 2, sticky = W)
text4 = Tkinter.Label(self, text = "Version 1.01").grid(row = 3, sticky = W)
text5 = Tkinter.Label(self, text = "Licence d'utilisation accordée à :").grid(row = 4, sticky = W)
text6 = Tkinter.Label(self, text = " - ***").grid(row = 5, sticky = W)
button = Tkinter.Button(self, text = "OK", width = 15, command = self.destroy)
button.grid(row = 6, column = 0)
button.focus_set()

if __name__ == "__main__":
app = propos(None)
app.title('A propos de ...')
app.mainloop()

Est-ce que ça te parait bon pour la class à propos de ?

Si c'est bon comment l'appeler depuis l'application avec la commande ?
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
29 mai 2007 à 09:38
Il faudrait que tu mette ton code entre balises < code> sur ce forum, sinon on l'identation n'est pas conservée et on ne peut pas comprendre le code.
0
Todesfall Messages postés 70 Date d'inscription lundi 30 avril 2007 Statut Membre Dernière intervention 17 septembre 2014
29 mai 2007 à 09:46
Là par exemple j'utilise un seul mainloop() dans mon programme mais je n'obtiens pas ce que je veux :
# -*- coding: iso-8859-1 -*-

from Tkinter import *
import Tkinter


class propos(Tkinter.Tk):
	def __init__(self,parent):
		Tkinter.Tk.__init__(self,parent)
		self.parent = parent
		self.initialize()

	def initialize(self):
		text1 = Tkinter.Label(self, text = "Dossier Machine 2007").grid(row = 0, sticky = W)
		text2 = Tkinter.Label(self, text = "Part of *** Edition 2007").grid(row = 1, sticky = W)
		text3 = Tkinter.Label(self, text = "Copyright (c) ***. Tous droits réservés.").grid(row = 2, sticky = W)
		text4 = Tkinter.Label(self, text = "Version 1.01").grid(row = 3, sticky = W)
		text5 = Tkinter.Label(self, text = "Licence d'utilisation accordée à :").grid(row = 4, sticky = W)
		text6 = Tkinter.Label(self, text = "    - ***").grid(row = 5, sticky = W)
		button = Tkinter.Button(self, text = "OK", width = 15, command = self.destroy)
		button.grid(row = 6, column = 0)
		button.focus_set()


class MenuBar(Frame):
	def __init__(self, boss = None):
		Frame.__init__(self,borderwidth = 2)

		### Menu <Fichier> ###
		fileMenu = Menubutton(self, text = 'Fichier')
		fileMenu.pack(side = LEFT)
		# Partie déroulante :
		me1 = Menu(fileMenu)
		me1.add_command(label = 'Nouveau dossier machine', underline = 0)
		me1.add_command(label = 'Nouveau dossier machine avec aide', underline = 1)
		me1.add_separator()
		me1.add_command(label = 'Imprimer', underline = 0)
		me1.add_separator()
		me1.add_command(label = 'Quitter', underline = 0, command = boss.quit)
		# Intégration du menu :
		fileMenu.configure(menu = me1)

		### Menu <Edition> ###
		fileMenu = Menubutton(self, text = 'Edition')
		fileMenu.pack(side = LEFT)
		# Partie déroulante
		me2 = Menu(fileMenu)
		me2.add_command(label = 'Copier', underline = 4)
		me2.add_command(label = 'Coller', underline = 1)
		# Intégration du menu :
		fileMenu.configure(menu = me2)

		### Menu <Aide> ###
		fileMenu = Menubutton(self, text = 'Aide')
		fileMenu.pack(side = LEFT)
		# Partie déroulante
		me3 = Menu(fileMenu)
		me3.add_command(label = 'Aide', underline = 0)
		me3.add_separator()
		me3.add_command(label = 'A propos de...', underline = 7, command = boss.propos)
		# Intégration du menu :
		fileMenu.configure(menu = me3)

class Application(Frame):
	"""Application principale"""
	def __init__(self, boss = None):
		Frame.__init__(self)
		self.master.title('Dossier Machine')
		mBar = MenuBar(self)
		mBar.pack()
		self.can = Canvas(self,bg='light grey', height = 190, width=250, borderwidth = 2)
		self.can.pack()
		self.pack()

	def propos(self):
		propos(None)

if __name__ == '__main__':
	app = Application()
	app.mainloop()


Là ça fonctionne bien mais le probleme c'est que ma fenêtre à propos de n'est pas selectionne elle est grisé lorsque je l'appelle. Car pour fermer la fenetre je suis obligé de la selectionne puis d'appuyer sur espace pour la fermer.

Comment faire que je n'ai plus qu'à appuyer sur espace.
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
29 mai 2007 à 14:35
Premier problème: tu n'initialise pas correctement tk.
Ton main devrait être:
if __name__ == '__main__':
    root = Tk()
    app = Application(root)
    app.mainloop()



Ensuite je te propose d'ajouter Pmw à tes outils. Ce sont des dialogues tout prêts pour Tkinter bien pratiques.
http://pmw.sourceforge.net/

Par exemple, ils ont un dialogue "a propos" prêt à l'emploi.

Ton programme devient (en gras ce qui est modifié/ajouté):

# -*- coding: iso-8859-1 -*-

from Tkinter import *
import Tkinter
import Pmw

class apropos(Pmw.MessageDialog):
    def __init__(self,parent,**kwargs):
        kwargs['message_text']="""Dossier Machine 2007
Part of *** Edition 2007
Copyright (c) ***. Tous droits réservés.
Version 1.01
Licence d'utilisation accordée à :
    - ***
"""
        Pmw.MessageDialog.__init__(self,**kwargs)
        

class MenuBar(Frame):
    def __init__(self, boss = None):
        Frame.__init__(self,borderwidth = 2)

        ### Menu <Fichier> ###
        fileMenu = Menubutton(self, text = 'Fichier')
        fileMenu.pack(side = LEFT)
        # Partie déroulante :
        me1 = Menu(fileMenu)
        me1.add_command(label = 'Nouveau dossier machine', underline = 0)
        me1.add_command(label = 'Nouveau dossier machine avec aide', underline = 1)
        me1.add_separator()
        me1.add_command(label = 'Imprimer', underline = 0)
        me1.add_separator()
        me1.add_command(label = 'Quitter', underline = 0, command = boss.quit)
        # Intégration du menu :
        fileMenu.configure(menu = me1)

        ### Menu <Edition> ###
        fileMenu = Menubutton(self, text = 'Edition')
        fileMenu.pack(side = LEFT)
        # Partie déroulante
        me2 = Menu(fileMenu)
        me2.add_command(label = 'Copier', underline = 4)
        me2.add_command(label = 'Coller', underline = 1)
        # Intégration du menu :
        fileMenu.configure(menu = me2)

        ### Menu <Aide> ###
        fileMenu = Menubutton(self, text = 'Aide')
        fileMenu.pack(side = LEFT)
        # Partie déroulante
        me3 = Menu(fileMenu)
        me3.add_command(label = 'Aide', underline = 0)
        me3.add_separator()
        me3.add_command(label = 'A propos de...', underline = 7, command = self.propos)
        # Intégration du menu :
        fileMenu.configure(menu = me3)

    def propos(self):
        a = apropos(self)
        a.show()

class Application(Frame):
    """Application principale"""
    def __init__(self, boss = None):
        Frame.__init__(self)
        self.master.title('Dossier Machine')
        mBar = MenuBar(self)
        mBar.pack()
        self.can = Canvas(self,bg='light grey', height = 190, width=250, borderwidth = 2)
        self.can.pack()
        self.pack()

    def propos(self):
        propos(None)

if __name__ == '__main__':
    root = Tk()
    app = Application(root)
    app.mainloop()
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Todesfall Messages postés 70 Date d'inscription lundi 30 avril 2007 Statut Membre Dernière intervention 17 septembre 2014
30 mai 2007 à 13:00
ton root ne fonctionne pas il me met cette erreur :

Traceback (most recent call last):
File "D:\Data\test5.py", line 108, in <module>
root = Tk()
TypeError: 'module' object is not callable

Sinon pour autre chose j'ai un autre problème : dans la class Entry lorsque je veux récupérer ce qu'il y a dans le entry il me met rien pourquoi, voici le code :

# -*- coding: iso-8859-1 -*-

from Tkinter import *
import Tkinter
import Tkinter as Tk



class propos(Tkinter.Tk):
	def __init__(self,parent):
		Tkinter.Tk.__init__(self,parent)
		self.title('A propos de ...')
		self.parent = parent
		self.initialize()

	def initialize(self):
		test = 0
		champNum1 = Tkinter.IntVar()
		text1 = Tkinter.Label(self, text = "Dossier Machine 2007").grid(row = 0, sticky = W)
		text2 = Tkinter.Label(self, text = "Part of *** Edition 2007").grid(row = 1, sticky = W)
		text3 = Tkinter.Label(self, text = "Copyright (c) ***. Tous droits réservés.").grid(row = 2, sticky = W)
		text4 = Tkinter.Label(self, text = "Version 1.01").grid(row = 3, sticky = W)
		text5 = Tkinter.Label(self, text = "Licence d'utilisation accordée à :").grid(row = 4, sticky = W)
		text6 = Tkinter.Label(self, text = "    - ***").grid(row = 5, sticky = W)
		button = Tkinter.Button(self, text = "OK", width = 15, textvariable = champNum1, command = self.destroy)
		button.grid(row = 6, column = 0)
		button.focus_set()

class entry(Tkinter.Tk):
	def __init__(self,parent):
		Tkinter.Tk.__init__(self,parent)
		self.title('test_entry')
		self.parent = parent
		self.initialize()

	def initialize(self):
		global champText1
		champText1 = Tkinter.StringVar()
		text1 = Tkinter.Label(self, text = "reponse").grid(row = 0, sticky = W)
		entr1 = Tkinter.Entry(self, textvariable = champText1).grid(row = 0, column = 1)
		button = Tkinter.Button(self, text = "OK", width = 15, command = self.recup_donnee)
		button.grid(row = 6, column = 0)
		button.focus_set()
		
	def recup_donnee(self):
		print 'tata'
		test = champText1.get()
		print test	
	

class MenuBar(Frame):
	def __init__(self, boss = None):
		Frame.__init__(self,borderwidth = 2)

		### Menu <Fichier> ###
		fileMenu = Menubutton(self, text = 'Fichier')
		fileMenu.pack(side = LEFT)
		# Partie déroulante :
		me1 = Menu(fileMenu)
		me1.add_command(label = 'Nouveau dossier machine', underline = 0)
		me1.add_command(label = 'Nouveau dossier machine avec aide', underline = 1)
		me1.add_separator()
		me1.add_command(label = 'Imprimer', underline = 0)
		me1.add_separator()
		me1.add_command(label = 'Quitter', underline = 0, command = boss.quit)
		# Intégration du menu :
		fileMenu.configure(menu = me1)

		### Menu <Edition> ###
		fileMenu = Menubutton(self, text = 'Edition')
		fileMenu.pack(side = LEFT)
		# Partie déroulante
		me2 = Menu(fileMenu)
		me2.add_command(label = 'Copier', underline = 4)
		me2.add_command(label = 'Coller', underline = 1)
		# Intégration du menu :
		fileMenu.configure(menu = me2)

		### Menu <Aide> ###
		fileMenu = Menubutton(self, text = 'Aide')
		fileMenu.pack(side = LEFT)
		# Partie déroulante
		me3 = Menu(fileMenu)
		me3.add_command(label = 'Aide', underline = 0, command = boss.entry)
		me3.add_separator()
		me3.add_command(label = 'A propos de...', underline = 7, command = boss.propos)
		# Intégration du menu :
		fileMenu.configure(menu = me3)

class Application(Frame):
	"""Application principale"""
	def __init__(self, boss = None):
		Frame.__init__(self)
		self.master.title('Dossier Machine')
		mBar = MenuBar(self)
		mBar.pack()
		self.can = Canvas(self,bg='light grey', height = 190, width=250, borderwidth = 2)
		self.can.pack()
		self.pack()

	def propos(self):
		propos(None)

	def entry(self):
		entry(None)

if __name__ == '__main__':
	app = Application()
	app.mainloop()
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
30 mai 2007 à 14:05
Traceback (most recent call last):
File "D:\Data\test5.py", line 108, in <module>
root = Tk()
TypeError: 'module' object is not callable


Bizarre, je n'ai pas cette erreur chez moi.

Comment lances-tu ton programme ?
En ligne de commande ou dans un environnement graphique (IDLE, Eclipse...) ?



global champText1


Yurk !
Pitié, pas de global !

Par contre, ta classe entry n'est appellée nulle part.

Ah... et je te déconseille fortement de créer une classe qui porte un nom déjà utilisé par des classes de tkinter ('entry' est une classe qui existe déjà dans TKinter.) C'est une source de problèmes.
0
Todesfall Messages postés 70 Date d'inscription lundi 30 avril 2007 Statut Membre Dernière intervention 17 septembre 2014
30 mai 2007 à 14:18
si ma classe entry est appelé dans ma class application quand je fais aide/aide.

je lance mon prog avec IDLE.

et toujours la même question comment récupérer l'info qu'il y a dans l'entry ?
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
30 mai 2007 à 14:32
Voilà un exemple simple avec une entry:

Quand on clic sur le bouton "Cliquez moi", ça récupère la valeur et ça l'affiche dans la console.

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

import Tkinter

class simpleapp_tk(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.entryVariable = Tkinter.StringVar()
        Tkinter.Entry(self,textvariable=self.entryVariable).grid(column=0, row=0,sticky='EW')
        Tkinter.Button(self,text=u"Cliquez moi", command=self.OnButtonClick).grid(column=1,row=0)

    def OnButtonClick(self):
        print "La valeur est:", self.entryVariable.get()

if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.title('Mon programme')
    app.mainloop()
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
30 mai 2007 à 14:33
je lance mon prog avec IDLE.

Ah !

IDLE est lui-même fait en tkinter, et ça interfère sur le bon fonctionnement du programme.
Je te conseille de lancer ton programme à partir d'une fenêtre MS-Dos.
0
Todesfall Messages postés 70 Date d'inscription lundi 30 avril 2007 Statut Membre Dernière intervention 17 septembre 2014
30 mai 2007 à 14:47
Lorsque je met le root et que je lance à partir d'une fenetre dos celle ci s'affiche et se ferme aussitôt. Sinon je pense avoir fait comme toi mais je n'arrive toujours pas à avoir mon entry :

# -*- coding: iso-8859-1 -*-

from Tkinter import *
import Tkinter
import Tkinter as Tk


class propos(Tkinter.Tk):
	def __init__(self,parent):
		Tkinter.Tk.__init__(self,parent)
		self.title('A propos de ...')
		self.parent = parent
		self.initialize()

	def initialize(self):
		test = 0
		champNum1 = Tkinter.IntVar()
		text1 = Tkinter.Label(self, text = "Dossier Machine 2007").grid(row = 0, sticky = W)
		text2 = Tkinter.Label(self, text = "Part of *** Edition 2007").grid(row = 1, sticky = W)
		text3 = Tkinter.Label(self, text = "Copyright (c) ***. Tous droits réservés.").grid(row = 2, sticky = W)
		text4 = Tkinter.Label(self, text = "Version 1.01").grid(row = 3, sticky = W)
		text5 = Tkinter.Label(self, text = "Licence d'utilisation accordée à :").grid(row = 4, sticky = W)
		text6 = Tkinter.Label(self, text = "    - ***").grid(row = 5, sticky = W)
		button = Tkinter.Button(self, text = "OK", width = 15, textvariable = champNum1, command = self.destroy)
		button.grid(row = 6, column = 0)
		button.focus_set()

class essai(Tkinter.Tk):
	def __init__(self,parent):
		Tkinter.Tk.__init__(self,parent)
		self.title('test_entry')
		self.parent = parent
		self.initialize()

	def initialize(self):
		self.champText1 = Tkinter.StringVar()
		text1 = Tkinter.Label(self, text = "reponse").grid(row = 0, sticky = W)
		entr1 = Tkinter.Entry(self, textvariable = self.champText1).grid(row = 0, column = 1)
		button = Tkinter.Button(self, text = "OK", width = 15, command = self.recup_donnee)
		button.grid(row = 6, column = 0)
		button.focus_set()
		
	def recup_donnee(self):
		test = self.champText1.get()
		print test	
	

class MenuBar(Frame):
	def __init__(self, boss = None):
		Frame.__init__(self,borderwidth = 2)

		### Menu <Fichier> ###
		fileMenu = Menubutton(self, text = 'Fichier')
		fileMenu.pack(side = LEFT)
		# Partie déroulante :
		me1 = Menu(fileMenu)
		me1.add_command(label = 'Nouveau dossier machine', underline = 0)
		me1.add_command(label = 'Nouveau dossier machine avec aide', underline = 1)
		me1.add_separator()
		me1.add_command(label = 'Imprimer', underline = 0)
		me1.add_separator()
		me1.add_command(label = 'Quitter', underline = 0, command = boss.quit)
		# Intégration du menu :
		fileMenu.configure(menu = me1)

		### Menu <Edition> ###
		fileMenu = Menubutton(self, text = 'Edition')
		fileMenu.pack(side = LEFT)
		# Partie déroulante
		me2 = Menu(fileMenu)
		me2.add_command(label = 'Copier', underline = 4)
		me2.add_command(label = 'Coller', underline = 1)
		# Intégration du menu :
		fileMenu.configure(menu = me2)

		### Menu <Aide> ###
		fileMenu = Menubutton(self, text = 'Aide')
		fileMenu.pack(side = LEFT)
		# Partie déroulante
		me3 = Menu(fileMenu)
		me3.add_command(label = 'Aide', underline = 0, command = boss.essai)
		me3.add_separator()
		me3.add_command(label = 'A propos de...', underline = 7, command = boss.propos)
		# Intégration du menu :
		fileMenu.configure(menu = me3)

class Application(Frame):
	"""Application principale"""
	def __init__(self, boss = None):
		Frame.__init__(self)
		self.master.title('Dossier Machine')
		mBar = MenuBar(self)
		mBar.pack()
		self.can = Canvas(self,bg='light grey', height = 190, width=250, borderwidth = 2)
		self.can.pack()
		self.pack()

	def propos(self):
		propos(None)

	def essai(self):
		essai(None)

if __name__ == '__main__':
	app = Application()
	app.mainloop()
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
30 mai 2007 à 14:58
Lorsque je met le root et que je lance à partir d'une fenetre dos celle ci s'affiche et se ferme aussitôt.

Si tu es sous Linux/Unix, pas besoin d'être en root pour lancer ton programme.


Ouvre une fenêtre MS-Dos, places-toi dans le bon répertoire avec la commande cd, et lance ton programme en tapant:
python monprogramme.py


Ainsi la fenêtre ne se fermera pas.
0
Todesfall Messages postés 70 Date d'inscription lundi 30 avril 2007 Statut Membre Dernière intervention 17 septembre 2014
30 mai 2007 à 15:04
sinon pour mon entry
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
30 mai 2007 à 15:07
	def essai(self):
		essai(None)



D'après toi, ton essaie(None) désigne-t-il:
- la classe essai
ou
- la méthode essai de la classe Application ?


Tu viens de te heurter au problème du scope des variables.

Une variable n'existe que dans le bloc de programme où elle a été définie.
Si un sous-bloc de programme redéfinit ce nom, l'ancienne valeur n'est pas accessible.

Donc, quand tu fais def essai(self) dans ta classe Application, essai n'est plus la classe essai, mais la méthode essai(self).


Evite de prendre de noms qui existent déjà, ça prêt à confusion.
0
Todesfall Messages postés 70 Date d'inscription lundi 30 avril 2007 Statut Membre Dernière intervention 17 septembre 2014
30 mai 2007 à 15:15
j'ai changé pour qu'il n'est pas le même nom mais je n'arrive toujours à récupérer mon entry.
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
30 mai 2007 à 15:32
je n'arrive toujours à récupérer mon entry

C'est normal.
Encore un problème de scope:


entr1 est une variable qui a été créée dans la méthode initialize().
Donc à la sortie de cette méthode, entr1 est détruite.

Il faut en garder une référence, sinon Tkinter jette le widget et on ne peut plus récupérer sa valeur.

Il faut donc faire:

self.entr1 = Tkinter.Entry(self, textvariable = self.champText1)
self.entr1.grid(row = 0, column = 1)
0
Todesfall Messages postés 70 Date d'inscription lundi 30 avril 2007 Statut Membre Dernière intervention 17 septembre 2014
30 mai 2007 à 15:39
class essai(Tkinter.Tk):
	def __init__(self,parent):
		Tkinter.Tk.__init__(self,parent)
		self.title('test_entry')
		self.parent = parent
		self.initialize()

	def initialize(self):
		self.champText1 = Tkinter.StringVar()
		self.text1 = Tkinter.Label(self, text = "reponse").grid(row = 0, sticky = W)
		self.entr1 = Tkinter.Entry(self, textvariable = self.champText1)
		self.entr1.grid(row = 0, column = 1)
		self.button = Tkinter.Button(self, text = "OK", width = 15, command = self.recup_donnee)
		self.button.grid(row = 6, column = 0)
		self.button.focus_set()
		
	def recup_donnee(self):
		print self.champText1.get()


Comme ça c'est bon. Si ça l'est et bien je n'arrive toujours pas à récupérer l'entry.
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
30 mai 2007 à 15:46
Chez moi, le programme suivant fonctionne très bien et je récupère la valeur quand je clic sur le bouton "OK":

# -*- coding: iso-8859-1 -*-

from Tkinter import *
import Tkinter
import Tkinter as Tk

class essai(Tkinter.Tk):
	def __init__(self,parent):
		Tkinter.Tk.__init__(self,parent)
		self.title('test_entry')
		self.parent = parent
		self.initialize()

	def initialize(self):
		self.champText1 = Tkinter.StringVar()
		self.text1 = Tkinter.Label(self, text = "reponse").grid(row = 0, sticky = W)
		self.entr1 = Tkinter.Entry(self, textvariable = self.champText1)
		self.entr1.grid(row = 0, column = 1)
		self.button = Tkinter.Button(self, text = "OK", width = 15, command = self.recup_donnee)
		self.button.grid(row = 6, column = 0)
		self.button.focus_set()
		
	def recup_donnee(self):
		print self.champText1.get()
if __name__ == '__main__':
	app = essai(None)
	app.mainloop()



Copie d'écran: https://imageshack.com/
0
Todesfall Messages postés 70 Date d'inscription lundi 30 avril 2007 Statut Membre Dernière intervention 17 septembre 2014
30 mai 2007 à 16:05
Je suis d'accord avec toi, pour le code ci-dessus, chez moi aussi il fonctionne mais mais la classe dans le bout de programme au commentaire 30, et tu verras ke ça ne marche pas.
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
30 mai 2007 à 16:57
Plusieurs remarques:

---

arf... oui, excuses-moi, j'aurais dû tilter:
Tkinter.Tk est la fenêtre racine. Il ne doit y en avoir qu'une seule et ça doit être ta fenêtre principale.

Donc la classe essai (ou monessai) ne doit pas dériver de Tkinter.Tk mais d'autrechose, par exemple de Tkinter.Toplevel
(Toplevel est une fenêtre possédant des contrôles (agrandir, fermer, minimiser, etc.))
(voir source plus loin)

---
Quand tu créé tes objets propos() et monessai(), il est important de passer self en paramètre.
Sinon les fenêtres apropos et autres ne seront pas détruites quand ta fenêtre principale est fermée.
(voir source plus loin)

---

Note que si tu dois dériver d'une classe existante, évite d'utiliser des paramètres d'initialisation différent: N'utilise pas 'boss', mais parent.
(voir source plus loin)

---

Enfin, puisque ton menu est un widget contenu dans ta fenêtre principale, il n'y a pas vraiement d'intérêt à en faire une classe séparée.



Ce qui donne:
# -*- coding: iso-8859-1 -*-

from Tkinter import *
import Tkinter
import Tkinter as Tk


class propos(Tkinter.Toplevel):
    def __init__(self,parent):
        Tkinter.Toplevel.__init__(self,parent)
        #self.title('A propos de ...')
        self.parent = parent
        self.initialize()

    def initialize(self):
        test = 0
        champNum1 = Tkinter.IntVar()
        text1 = Tkinter.Label(self, text = "Dossier Machine 2007").grid(row = 0, sticky = W)
        text2 = Tkinter.Label(self, text = "Part of *** Edition 2007").grid(row = 1, sticky = W)
        text3 = Tkinter.Label(self, text = "Copyright (c) ***. Tous droits réservés.").grid(row = 2, sticky = W)
        text4 = Tkinter.Label(self, text = "Version 1.01").grid(row = 3, sticky = W)
        text5 = Tkinter.Label(self, text = "Licence d'utilisation accordée à :").grid(row = 4, sticky = W)
        text6 = Tkinter.Label(self, text = "    - ***").grid(row = 5, sticky = W)
        button = Tkinter.Button(self, text = "OK", width = 15, textvariable = champNum1, command = self.destroy)
        button.grid(row = 6, column = 0)
        button.focus_set()

class monessai(Tkinter.Toplevel):
    def __init__(self,parent):
        Tkinter.Toplevel.__init__(self,parent)
        self.title('test_entry')
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.champText1 = Tkinter.StringVar()
        text1 = Tkinter.Label(self, text = "reponse").grid(row = 0, sticky = W)
        entr1 = Tkinter.Entry(self, textvariable = self.champText1).grid(row = 0, column = 1)
        button = Tkinter.Button(self, text = "OK", width = 15, command = self.recup_donnee)
        button.grid(row = 6, column = 0)
        button.focus_set()
        
    def recup_donnee(self):
        test = self.champText1.get()
        print test  
    

class Application(Tkinter.Tk):
    """Application principale"""
    def __init__(self, parent = None):
        Tkinter.Tk.__init__(self)
        self.parent = parent
        self.title('Dossier Machine')
        self.configure(menu=self.createMenu())
        #self.can = Canvas(self,bg='light grey', height = 190, width=250, borderwidth = 2)
        #self.can.pack()

    def createMenu(self):

        mymenu = Tkinter.Menu(self)
        ### Menu <Fichier> ###
        fileMenu = Menubutton(self, text = 'Fichier')
        fileMenu.grid(column=0,row=0)
        # Partie déroulante :
        me1 = Menu(fileMenu)
        me1.add_command(label = 'Nouveau dossier machine', underline = 0)
        me1.add_command(label = 'Nouveau dossier machine avec aide', underline = 1)
        me1.add_separator()
        me1.add_command(label = 'Imprimer', underline = 0)
        me1.add_separator()
        me1.add_command(label = 'Quitter', underline = 0, command = self.quit)
        # Intégration du menu :
        fileMenu.configure(menu = me1)

        ### Menu <Edition> ###
        fileMenu = Menubutton(self, text = 'Edition')
        fileMenu.grid(column=1,row=0)
        # Partie déroulante
        me2 = Menu(fileMenu)
        me2.add_command(label = 'Copier', underline = 4)
        me2.add_command(label = 'Coller', underline = 1)
        # Intégration du menu :
        fileMenu.configure(menu = me2)

        ### Menu <Aide> ###
        fileMenu = Menubutton(self, text = 'Aide')
        fileMenu.grid(column=2,row=0)
        # Partie déroulante
        me3 = Menu(fileMenu)
        me3.add_command(label = 'Aide', underline = 0, command = self.essai)
        me3.add_separator()
        me3.add_command(label = 'A propos de...', underline = 7, command = self.propos)
        # Intégration du menu :
        fileMenu.configure(menu = me3)

        return mymenu        
        
    def propos(self):
        propos(self)

    def essai(self):
        monessai(self)

if __name__ == '__main__':
    app = Application()
    app.mainloop()


Et là on récupère bien les valeurs de l'entry.

(J'ai désactivé ton canvas pour des raisons d'alignement dont il faudra s'occuper après...)
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
30 mai 2007 à 17:00
Encore une remarque:
Si tu commences à créer des interfaces graphiques plus complexes, il peut être intéressant de laisser tomber tkinter et prendre wxPython (=wxWidgets).

tkinter a ses limites, et wxWidgets permet d'aller beaucoup plus loin.
https://www.wxpython.org/


tkinter n'est vraiment adapté qu'aux interfaces graphiques simples
(j'ai poussé le bouchon un peu loin en utilisant tkinter pour webGobbler, et je ne referai pas cette erreur.)
0