Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[lambda] probleme d'initialisation de variable

1 réponse
Avatar
airod
j'ai ecris des fonctions pemettant de dessinner des rectangles dans un Canvas
Jusqu'ici ca roule
au début j'ai récupéré mes variables par la fonction 'gobal

mes fonction se comportent trés bien

Afin de pouvoir utiliser ces fonctions dans un autre programme, j'ai modifier ces derniéres pour passer les variables a l'aide de l'instruction Lambda. Et là, c'est incompréhensible. Mes fonctions ne fonctionnent plus comme prévues

en effet, le cadrage temporaire ne s'éfface plus, et la varaible 'rect_m' n'est pas initialisé a chaque appel de fonction
bref, je cherche d'ou ca peut venir depuis prés de 2 jours sans succés, alors si qqu'un peut m'aider

voici le code défectueux
# -*- coding: cp1252 -*
import Tkinter as t
import tkMessageBo

### VARIABLES ##########

coord_master,coord_cadre,coord_point='','',[
x,y,X,Y=0,0,0,
typer='
rect_m,rect_c='','coucou
ov_m,ov_c='','
blocker,blocker2=0,
canvas='

def rectf(rect_m):#bouton cadrag
canvas.bind('<Button-1>',lambda event,rect=rect_m:rect_f(event,rect)
canvas.bind('<ButtonRelease-1>',func=tk.NONE
canvas.bind('<B1-Motion>',func=tk.NONE

def masterf(rect_m,canvas):#bouton cadre de placemen
canvas.bind('<Button-1>',lambda event,rect=rect_m,can=canvas:master_rectf(event,rect,can)
canvas.bind('<ButtonRelease-1>',func=tk.NONE
canvas.bind('<B1-Motion>',func=tk.NONE

#########################
def rect_f(event)

if blocker==0
global x,
x,y=event.x,event.
canvas.bind('<ButtonRelease-1>',dess_rectf
canvas.bind('<B1-Motion>',rect_tempf

elif blocker==1
tkMessageBox.showinfo('Cadrage','Vous avez déjà mis en place\n le rectangle de cadrage'

def dess_rectf(event)
global x,y,X,Y,coord_cadre,blocker,coord_master,coord_point,rect_
lmaster,hmaster=float(coord_master[2]-coord_master[0]),float(coord_master[3]-coord_master[1]
x2,y2=0,

X,Y=event.x,event.
if X<x
if Y<y
Y=int(y-(((x-X)*hmaster)/lmaster)
x2,y2=X+((x-X)/2),(Y+((y-Y)/2))-
else
Y=int(y+(((x-X)*hmaster)/lmaster)
x2,y2=X+((x-X)/2),(Y-((Y-y)/2))-

else
if Y>y
Y=int(y-(((x-X)*hmaster)/lmaster)
x2,y2=X-((X-x)/2),(Y-((Y-y)/2))-

else
Y=int(y+(((x-X)*hmaster)/lmaster)
x2,y2=X-((X-x)/2),(Y+((y-Y)/2))-

canvas.delete(rect_c
canvas.delete(ov_c
rect_c=canvas.create_rectangle(x,y,X,Y,width=2,outline='green',dash=(4,6)
canvas.bind('<B1-Motion>',func=tk.NONE
canvas.bind('<ButtonRelease-1>',func=tk.NONE
coord_cadre=(x,y,X,Y,rect_c) #liste des coordonnées du rectangl

ID=canvas.create_oval(x2-5,y2-5,x2+5,y2+5,outline='yellow',width=2,fill='yellow'
coord_point.append((ID,x2,y2)
blocker=

def rect_tempf(event)
## dessin provisoire du cadrag
global x,y,X,Y,ov_c,coord_master,rect_
#
lmaster,hmaster=float(coord_master[2]-coord_master[0]),float(coord_master[3]-coord_master[1]
X2,Y2=event.x,event.
if X2<x
if Y2<y
Y2=y-(((x-X2)*hmaster)/lmaster
x2,y2=X2+((x-X2)/2),(Y2+((y-Y2)/2))-
else
Y2=y+(((x-X2)*hmaster)/lmaster
x2,y2=X2+((x-X2)/2),(Y2-((Y2-y)/2))-

else
if Y2<y
Y2=y-(((x-X2)*hmaster)/lmaster
x2,y2=X2-((X2-x)/2),(Y2+((y-Y2)/2))-
else
Y2=y+(((x-X2)*hmaster)/lmaster
x2,y2=X2-((X2-x)/2),(Y2-((Y2-y)/2))-

canvas.delete(rect_c
canvas.delete(ov_c
if X2<x
if Y2<y
Y2=y-(((x-X2)*hmaster)/lmaster
x2,y2=X2+((x-X2)/2),(Y2+((y-Y2)/2))-
else
Y2=y+(((x-X2)*hmaster)/lmaster
x2,y2=X2+((x-X2)/2),(Y2-((Y2-y)/2))-

else
if Y2<y
Y2=y-(((x-X2)*hmaster)/lmaster
x2,y2=X2-((X2-x)/2),(Y2+((y-Y2)/2))-
else
Y2=y+(((x-X2)*hmaster)/lmaster
x2,y2=X2-((X2-x)/2),(Y2-((Y2-y)/2))-


rect_c=canvas.create_rectangle(x,y,X2,Y2,width=1,outline='green',dash=(6,4))
ov_c=canvas.create_oval(x2-5,y2-5,x2+5,y2+5,fill='yellow',width=1)


##########################################################################
########## Dessin du rectangle de placement ##############################
def master_rectf(event,rect_m,canvas):

if blocker2==0:
global x,y
x,y=event.x,event.y
canvas.bind('<ButtonRelease-1>',lambda event,rect=rect_m,can=canvas:dess_master_rectf(event,rect,can))
canvas.bind('<B1-Motion>',lambda event,rect=rect_m,can=canvas:master_rect_tempf(event,rect,can))

elif blocker2==1:
tkMessageBox.showinfo('Cadrage','Vous avez déjà mis en place\n le rectangle de cadrage')


def master_rect_tempf(event,rect_m,canvas):
## dessin provisoire du cadrage
global x,y,ov_m

X2,Y2=event.x,event.y
x2,y2=X2-((X2-x)/2),(Y2-((Y2-y)/2))-2
canvas.delete(rect_m)
canvas.delete(ov_m)
X2,Y2=event.x,event.y
rect_m=canvas.create_rectangle(x,y,X2,Y2,width=1,outline='blue',dash=(6,4))
x2,y2=X2-((X2-x)/2),(Y2-((Y2-y)/2))-2
ov_m=canvas.create_oval(x2-5,y2-5,x2+5,y2+5,fill='blue',width=1)
print rect_m

def dess_master_rectf(event,rect_m,canvas):
##def dessin rectangle#######################
global x,y,X,Y,blocker2,coord_master

canvas.delete(rect_m)
canvas.delete(ov_m)
X,Y=event.x,event.y
rect_m=canvas.create_rectangle(x,y,X,Y,width=2,outline='blue',dash=(4,6))
canvas.bind('<B1-Motion>',func=tk.NONE)
canvas.bind('<ButtonRelease-1>',func=tk.NONE)
coord_master=(x,y,X,Y,rect_m) #liste des coordonnées du rectangle
x2,y2=X-((X-x)/2),(Y-((Y-y)/2))-2
blocker2=1
print rect_m


###########################
###################
###################
if __name__ == '__main__':

root=tk.Tk()
canvas=tk.Canvas(root,height=400,width=400,bg='black')
canvas.grid()
tk.Button(root,text='master',command=lambda rect=rect_m,can=canvas:masterf(rect,can)).grid()
tk.Button(root,text='Cadre',command=rectf).grid()
tk.Button(root,text='Quit',command=root.quit).grid()

root.mainloop()
root.destroy()
print rect_m
utiliser uniquement le bouton master, si vous testez, le bouton cadre est dependant de la bonne exe des fonctions master.

HELP ME, je suis a l'arret total sur le projet si je ne résoud pas le soucis


--
airod

------------------------------------------------------------------------
Voir theme: http://www.frbox.net/viewtopic-543150.html

Envoyé de http://www.frbox.net

1 réponse

Avatar
Eric Brunel
On Mon, 27 Feb 2006 20:35:37 +0100, airod
wrote:


j'ai ecris des fonctions pemettant de dessinner des rectangles dans un
Canvas.
Jusqu'ici ca roule.
au début j'ai récupéré mes variables par la fonction 'gobal'
mes fonction se comportent trés bien.
Afin de pouvoir utiliser ces fonctions dans un autre programme, j'ai
modifier ces derniéres pour passer les variables a l'aide de
l'instruction Lambda. Et là, c'est incompréhensible. Mes fonctions ne
fonctionnent plus comme prévues.
en effet, le cadrage temporaire ne s'éfface plus, et la varaible
'rect_m' n'est pas initialisé a chaque appel de fonction.
bref, je cherche d'ou ca peut venir depuis prés de 2 jours sans succés,
alors si qqu'un peut m'aider!
voici le code défectueux:


[snip]
if __name__ == '__main__':

root=tk.Tk()
canvas=tk.Canvas(root,,,bg='black')
canvas.grid()
tk.Button(root,text='master',command=lambda
rect=rect_m,canÊnvas:masterf(rect,can)).grid()


Le problème est que les valeurs par défaut des paramètres rect et can du
lambda sont évaluées *ici*, c'est à dire à la création de ton bouton. Or,
plus haut, nous avons:

def master_rect_tempf(event,rect_m,canvas):
## dessin provisoire du cadrage
global x,y,ov_m
X2,Y2=event.x,event.y
x2,y2=X2-((X2-x)/2),(Y2-((Y2-y)/2))-2
canvas.delete(rect_m)
canvas.delete(ov_m)
X2,Y2=event.x,event.y
rect_mÊnvas.create_rectangle(x,y,X2,Y2,width=1,outline='blue',dash=(6,4))


La valeur de rect_m est donc modifée par un de tes callbacks. Cette
modification ne sera pas reportée dans le lambda et le bouton continuera à
agir sur le rectangle précédent (qui n'existe plus d'ailleurs...).

Je vois deux solutions:
- soit tu changes le comportement de tes méthodes en leur faisant modifier
le rectangle existant, et surtout pas en le détruisant et en le re-créant.
Ca se fait via les méthodes Canvas.item_coords (pour le bouger ou le
redimensionner) et Canvas.item_configure (pour changer les autres
paramètres genre largeur de trait, couleur, etc...).
- soit tu passes à l'objet et tu transformes ton paquet de fonction en
classe et tes variables en attributs. Tu pourras alors définir des
méthodes pour les callbacks plutôt que des lambda et ça sera beaucoup plus
simple.

HTH
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17;8(%,5.Z65'*9--56l7+-'])"