OVH Cloud OVH Cloud

Gérer plusieurs fenetres Toplevel sous Tkinter

23 réponses
Avatar
ylc
Bonjour,
J'ai ouvert une s=E9rie de fen=EAtres Toplevel avec le m=EAme nom, chacune
comportant un bouton de commande pour agir sur la fen=EAtre.
Le probl=E8me est que tous ces boutons pointent vers une seule proc=E9dure
qui n'agit que sur la derni=E8re fen=EAtre ouverte et non pas sur la
fen=EAtre du bouton cliqu=E9.
D'o=F9 ma question : quand on clique sur un bouton d'une fen=EAtre,
comment r=E9cup=E9rer le nom de cette fen=EAtre pour agir dessus ?
voici un petit prog d'exemple : tous les boutons agissent sur la
derni=E8re fen=EAtre !......
merci. YLC

# test multifen=EAtres
from Tkinter import *
def rouge() :
top.config(bg=3D'red')
def vert() :
top.config(bg=3D'green')
def fenetres() :
global top
i=3D0
while i < 5 :
i=3Di+1
top=3DToplevel()
top.title("toplevel"+str(i))
top.geometry("150x20+20+"+str(i*50))
broug =3D Button(top, text =3D 'rouge', command =3D rouge)
bvert =3D Button(top, text =3D 'vert', command =3D vert)
broug.pack(side=3DLEFT)
bvert.pack()
# main
fen =3D Tk(className=3D"Fenetre racine")
fenetres()
fen.mainloop()
# #############################################

10 réponses

1 2 3
Avatar
ylc
C'a y est j'ai enfin trouvé !........et la réponse est :
nomfenetre.focus_displayof()
J'ai relu toute la doc Tkinter de Shipman (New Mexico Tech)
et j'ai enfin trouvé la réponse à ma question.
Voilà ce que ça donne dans mon exemple de départ :

# test multifenêtres
from Tkinter import *
def rouge() :
tip=top.focus_displayof() # ce que je cherchais
tip.config(bg='red')
def vert() :
tip=top.focus_displayof()
tip.config(bg='green')
def fenetres() :
global top
i=0
while i < 5 :
i=i+1
top=Toplevel()
top.title("toplevel"+str(i))
top.geometry("150x50+20+"+str(i*50))
canaff = Canvas(top,widthP,heightP)
broug = Button(top, text = 'rouge', command = rouge)
bvert = Button(top, text = 'vert', command = vert)
broug.pack(side=LEFT)
bvert.pack(side=RIGHT)
# main
fen = Tk(className="Fenetre racine")
fenetres()
fen.mainloop()

Je suis bien content car je croyais ne jamais trouver !
....et c'est moins compliqué que de créer des classes, puis
d'instancier chaque widget. isn't it ?
PS : je suis breton (ceci explique peut-être cela) :-))
YLC
Avatar
Francois
ylc a écrit :

Disons que je fais un blocage sur le mot self ; ce n'est pas grave, ça
doit se soigner, et on peut vivre avec :-)



Oui mais c'est quand même dommage. Souhaitez vous une explication sur le
mot "self" ? Je ne suis pas un expert, loin de là, mais si vous le
souhaitez, je veux bien tenter une explication simple là dessus. :-)



--
François
Avatar
Pierre Maurette
Francois, le 26/11/2008 a écrit :
ylc a écrit :

Disons que je fais un blocage sur le mot self ; ce n'est pas grave, ça
doit se soigner, et on peut vivre avec :-)



Oui mais c'est quand même dommage. Souhaitez vous une explication sur le
mot "self" ? Je ne suis pas un expert, loin de là, mais si vous le
souhaitez, je veux bien tenter une explication simple là dessus. :-)



Je plussoie. Je suis assez buse en Python, mais parfois pas trop nul en
pédagogie des langages informatiques. Si le monsieur montre un embryon
de curiosité...

--
Pierre Maurette
Avatar
moky
Pierre Maurette a écrit :
Francois, le 26/11/2008 a écrit :
ylc a écrit :

Disons que je fais un blocage sur le mot self ; ce n'est pas grave, ça
doit se soigner, et on peut vivre avec :-)



Oui mais c'est quand même dommage. Souhaitez vous une explication sur le
mot "self" ? Je ne suis pas un expert, loin de là, mais si vous le
souhaitez, je veux bien tenter une explication simple là dessus. :-)



Je plussoie. Je suis assez buse en Python, mais parfois pas trop nul en
pédagogie des langages informatiques. Si le monsieur montre un embryon
de curiosité...




Je ne trouve pas qu'il faille commencer par expliquer le mot "self". À
titre personnel, j'avais tapé ce petit "hello word" bien avant de
commprendre "self", "object" et "__init__" ... et même avant de vraiment
comprendre ce qu'était un objet :

++++++++++++++++++++++

#! /usr/bin/python
# -*- coding: utf8 -*-

class vecteur(object):
def __init__(self,a,b):
self.x = a
self.y = b

def norme(self):
return (self.x)**2+(self.y)**2

v = vecteur(3,4)

print "Composante X : "+str(v.x)
print "Norme : "+str(v.norme() )

+++++++++++++++++++++++++++++

Je crois que tout le monde a écrit ce code au moins une fois dans sa vie
(c'est un passage obligé, un peu comme écrire un jeu de snake quand on
est ado)

Au début, on fait des petits trucs en prenant "self" pour de la syntaxe
un peu magique, et avec le temps, on comprend mieux à force d'utiliser.

Bonne journée
Laurent
Avatar
ylc
Merci à Pierre de vouloir me détailler une explication sur le self,
mais en fait j'ai compris comment ça marche et je sais faire une
classe et dériver des instanciations tant que c'est du code simple.
Quand cela se complique par moultes fonctions plus ou moins
imbriquées, je ne m'y retrouve pas et je trouve que la lisibilité du
prog en cas de maintenance est difficile. L'an dernier, un pythoniste
de cette liste m'avait très bien expliqué les bases de l'Oo et grâce à
lui j'avais progressé, mais je ne suis pas allé très loin.
Merci à tous pour votre aide, c'est sympa de ne pas se sentir seul
avec ses docs.....
YLC
Avatar
Eric Brunel
On Wed, 26 Nov 2008 13:11:24 +0100, ylc wrote:

C'a y est j'ai enfin trouvé !........et la réponse est :
nomfenetre.focus_displayof()
J'ai relu toute la doc Tkinter de Shipman (New Mexico Tech)
et j'ai enfin trouvé la réponse à ma question.
Voilà ce que ça donne dans mon exemple de départ :

# test multifenêtres
from Tkinter import *
def rouge() :
tip=top.focus_displayof() # ce que je cherchais
tip.config(bg='red')
def vert() :
tip=top.focus_displayof()
tip.config(bg='green')
def fenetres() :
global top
i=0
while i < 5 :
i=i+1
top=Toplevel()
top.title("toplevel"+str(i))
top.geometry("150x50+20+"+str(i*50))
canaff = Canvas(top,widthP,heightP)
broug = Button(top, text = 'rouge', command = rouge)
bvert = Button(top, text = 'vert', command = vert)
broug.pack(side=LEFT)
bvert.pack(side=RIGHT)
# main
fen = Tk(className="Fenetre racine")
fenetres()
fen.mainloop()



Mmmmouais.... AMHA, pas forcément très pertinent: si jamais on veut
utiliser les fonctions rouge et vert dans un autre cadre que celui des
boutons, on va avoir des surprises...

Bon, si tu ne veux pas utiliser les classes, partons dans le fonctionnel
alors. Voilà une autre solution, que je trouve moins lisible, mais qui
fonctionne aussi:
-------------------------------------
from Tkinter import *
def rouge(fenetre) :
fenetre.config(bg='red')
def vert(fenetre) :
fenetre.config(bg='green')
def fenetres() :
global top
i=0
while i < 5 :
i=i+1
top=Toplevel()
top.title("toplevel"+str(i))
top.geometry("150x50+20+"+str(i*50))
canaff = Canvas(top,widthP,heightP)
broug = Button(top, text = 'rouge', command = lambda top=top:
rouge(top))
bvert = Button(top, text = 'vert', command = lambda top=top:
vert(top))
broug.pack(side=LEFT)
bvert.pack(side=RIGHT)
# main
fen = Tk(className="Fenetre racine")
fenetres()
fen.mainloop()
-------------------------------------

/me s'attend maintenant à une allergie à lambda aussi....

Je suis bien content car je croyais ne jamais trouver !
....et c'est moins compliqué que de créer des classes, puis
d'instancier chaque widget. isn't it ?



Ben.... non en fait :-)

PS : je suis breton (ceci explique peut-être cela) :-))



Y'a pas de mal: moi aussi (enfin bientôt....)

HTH
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"
Avatar
ylc
Bonjour,
Et bien non, je ne suis pas allergique aux lambda (j'en utilise
déjà)...
Par contre, effectivement,il semble difficile de faire ce que je
voulais faire
sans passer par un code objet, car à chaque étape je repousse le
problème
d'identification de l'objet à traiter au niveau suivant. En effet,
après avoir identifié
la fenêtre ayant le focus, il faut que j'identifie le canvas, puis
ensuite l'image
affichée....etc.. Du coup je me contente d'afficher mes images sans
aucune
fontion associé en dehors de la fermeture de la fenêtre.
Mon code est visible à cette adresse :
http://www.pythonfrance.com/codes/COMPACTEUR-IMAGES-JPEG-LOT_45007.aspx
J'essaayerai de reprendre mon prog en décrivant des classes et en
dérivant mes objets, mais seulement si l'hiver est long et froid, car
j'ai plein
d'autres chose à faire.
En tout cas vous m'avez convaincu. ;-)
Cordialement
YLC
Avatar
Jean Louison
Bonjour,
Ma question est toute simple:
Dans un fichier texte, j'ai des chaines de caractères avec des coordonnées.
ex: "$$polygon( "SIGNAL_1", , [-0.7, -0.7, 0.7, -0.7, 0.7, 0.7, -0.7, 0.7] );"

Je cherche a obtenir deux listes x et y
(dans l'exemple la syntaxe est [x1, y1, x2, y2, ....])

Comme je suis débutant, j'y arrive, mais avec pleins de lignes...

maListe = lineExemple.split('[')[1].split(']')[0].split(',')
Et après, comment je partage maListe en deux liste x et y ???

Je suis sure que vous avez plus simple à me proposer.
Merci,
Jean.
Avatar
Méta-MCI \(MVP\)
Bonjour !

Un exemple valant mieux qu'un long message :

st='''$$polygon( "SIGNAL_1", , [-0.7, -0.7, 0.7, -0.7, 0.7, 0.7, -0.7,
0.7] );"
'''
pat=re.compile(r'[[+-. 0123456789]*]', re.MULTILINE)
lat=eval(pat.findall(st)[0])



@+
--
Michel Claveau
Avatar
Méta-MCI \(MVP\)
Re !


J'ai oublié, pour obtenir les éléments de rang pair (je suppose 0 comme
étant pair) :
print lat[::2]

Et, pour les éléments de rang impair :
print lat[1::2]


@+ (bis)
--
Michel Claveau
1 2 3