[instruction lambda] variable non initialisée

variable non initialisée [instruction lambda] - Python - Programmation

Marsh Posté le 27-02-2006 à 19:28:06    

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:

Code :
  1. # -*- coding: cp1252 -*-
  2. import Tkinter as tk
  3. import tkMessageBox
  4. ### VARIABLES  ###########
  5. coord_master,coord_cadre,coord_point='','',[]
  6. x,y,X,Y=0,0,0,0
  7. typer=''
  8. rect_m,rect_c='','coucou'
  9. ov_m,ov_c='',''
  10. blocker,blocker2=0,0
  11. canvas=''
  12. def rectf(rect_m):#bouton cadrage
  13.     canvas.bind('<Button-1>',lambda event,rect=rect_m:rect_f(event,rect))
  14.     canvas.bind('<ButtonRelease-1>',func=tk.NONE)
  15.     canvas.bind('<B1-Motion>',func=tk.NONE)
  16. def masterf(rect_m,canvas):#bouton cadre de placement
  17.     canvas.bind('<Button-1>',lambda event,rect=rect_m,can=canvas:master_rectf(event,rect,can))
  18.     canvas.bind('<ButtonRelease-1>',func=tk.NONE)
  19.     canvas.bind('<B1-Motion>',func=tk.NONE)
  20. ##########################
  21. def rect_f(event):
  22.        
  23.     if blocker==0:
  24.         global x,y
  25.         x,y=event.x,event.y
  26.         canvas.bind('<ButtonRelease-1>',dess_rectf)
  27.         canvas.bind('<B1-Motion>',rect_tempf)
  28.     elif blocker==1:
  29.         tkMessageBox.showinfo('Cadrage','Vous avez déjà mis en place\n le rectangle de cadrage')
  30. def dess_rectf(event):
  31.     global x,y,X,Y,coord_cadre,blocker,coord_master,coord_point,rect_c
  32.     lmaster,hmaster=float(coord_master[2]-coord_master[0]),float(coord_master[3]-coord_master[1])
  33.     x2,y2=0,0
  34.     X,Y=event.x,event.y
  35.     if X<x:
  36.         if Y<y:
  37.             Y=int(y-(((x-X)*hmaster)/lmaster))
  38.             x2,y2=X+((x-X)/2),(Y+((y-Y)/2))-2
  39.         else:
  40.             Y=int(y+(((x-X)*hmaster)/lmaster))
  41.             x2,y2=X+((x-X)/2),(Y-((Y-y)/2))-2
  42.     else:
  43.         if Y>y:
  44.             Y=int(y-(((x-X)*hmaster)/lmaster))
  45.             x2,y2=X-((X-x)/2),(Y-((Y-y)/2))-2
  46.         else:
  47.             Y=int(y+(((x-X)*hmaster)/lmaster))
  48.             x2,y2=X-((X-x)/2),(Y+((y-Y)/2))-2
  49.            
  50.     canvas.delete(rect_c)
  51.     canvas.delete(ov_c)
  52.     rect_c=canvas.create_rectangle(x,y,X,Y,width=2,outline='green',dash=(4,6))
  53.     canvas.bind('<B1-Motion>',func=tk.NONE)
  54.     canvas.bind('<ButtonRelease-1>',func=tk.NONE)
  55.     coord_cadre=(x,y,X,Y,rect_c) #liste des coordonnées du rectangle
  56.            
  57.     ID=canvas.create_oval(x2-5,y2-5,x2+5,y2+5,outline='yellow',width=2,fill='yellow')
  58.     coord_point.append((ID,x2,y2))
  59.     blocker=1
  60. def rect_tempf(event):
  61.     ## dessin provisoire du cadrage
  62.     global x,y,X,Y,ov_c,coord_master,rect_c
  63.     ##
  64.     lmaster,hmaster=float(coord_master[2]-coord_master[0]),float(coord_master[3]-coord_master[1])
  65.     X2,Y2=event.x,event.y
  66.     if X2<x:
  67.         if Y2<y:
  68.             Y2=y-(((x-X2)*hmaster)/lmaster)
  69.             x2,y2=X2+((x-X2)/2),(Y2+((y-Y2)/2))-2
  70.         else:
  71.             Y2=y+(((x-X2)*hmaster)/lmaster)
  72.             x2,y2=X2+((x-X2)/2),(Y2-((Y2-y)/2))-2
  73.     else:
  74.         if Y2<y:
  75.             Y2=y-(((x-X2)*hmaster)/lmaster)
  76.             x2,y2=X2-((X2-x)/2),(Y2+((y-Y2)/2))-2
  77.         else:
  78.             Y2=y+(((x-X2)*hmaster)/lmaster)
  79.             x2,y2=X2-((X2-x)/2),(Y2-((Y2-y)/2))-2
  80.    
  81.     canvas.delete(rect_c)
  82.     canvas.delete(ov_c)
  83.     if X2<x:
  84.         if Y2<y:
  85.             Y2=y-(((x-X2)*hmaster)/lmaster)
  86.             x2,y2=X2+((x-X2)/2),(Y2+((y-Y2)/2))-2
  87.         else:
  88.             Y2=y+(((x-X2)*hmaster)/lmaster)
  89.             x2,y2=X2+((x-X2)/2),(Y2-((Y2-y)/2))-2
  90.     else:
  91.         if Y2<y:
  92.             Y2=y-(((x-X2)*hmaster)/lmaster)
  93.             x2,y2=X2-((X2-x)/2),(Y2+((y-Y2)/2))-2
  94.         else:
  95.             Y2=y+(((x-X2)*hmaster)/lmaster)
  96.             x2,y2=X2-((X2-x)/2),(Y2-((Y2-y)/2))-2
  97.            
  98.            
  99.     rect_c=canvas.create_rectangle(x,y,X2,Y2,width=1,outline='green',dash=(6,4))
  100.     ov_c=canvas.create_oval(x2-5,y2-5,x2+5,y2+5,fill='yellow',width=1)
  101.    
  102. ##########################################################################   
  103. ########## Dessin du rectangle de placement ##############################
  104. def master_rectf(event,rect_m,canvas):
  105.     if blocker2==0:
  106.         global x,y
  107.         x,y=event.x,event.y
  108.         canvas.bind('<ButtonRelease-1>',lambda event,rect=rect_m,can=canvas:dess_master_rectf(event,rect,can))
  109.         canvas.bind('<B1-Motion>',lambda event,rect=rect_m,can=canvas:master_rect_tempf(event,rect,can))
  110.     elif blocker2==1:
  111.         tkMessageBox.showinfo('Cadrage','Vous avez déjà mis en place\n le rectangle de cadrage')
  112. def master_rect_tempf(event,rect_m,canvas):
  113.     ## dessin provisoire du cadrage
  114.     global x,y,ov_m
  115.    
  116.     X2,Y2=event.x,event.y
  117.     x2,y2=X2-((X2-x)/2),(Y2-((Y2-y)/2))-2
  118.     canvas.delete(rect_m)
  119.     canvas.delete(ov_m)
  120.     X2,Y2=event.x,event.y
  121.     rect_m=canvas.create_rectangle(x,y,X2,Y2,width=1,outline='blue',dash=(6,4))
  122.     x2,y2=X2-((X2-x)/2),(Y2-((Y2-y)/2))-2
  123.     ov_m=canvas.create_oval(x2-5,y2-5,x2+5,y2+5,fill='blue',width=1)
  124.     print rect_m
  125. def dess_master_rectf(event,rect_m,canvas):
  126.     ##def dessin rectangle#######################
  127.     global x,y,X,Y,blocker2,coord_master
  128.    
  129.     canvas.delete(rect_m)
  130.     canvas.delete(ov_m)
  131.     X,Y=event.x,event.y
  132.     rect_m=canvas.create_rectangle(x,y,X,Y,width=2,outline='blue',dash=(4,6))
  133.     canvas.bind('<B1-Motion>',func=tk.NONE)
  134.     canvas.bind('<ButtonRelease-1>',func=tk.NONE)
  135.     coord_master=(x,y,X,Y,rect_m) #liste des coordonnées du rectangle
  136.     x2,y2=X-((X-x)/2),(Y-((Y-y)/2))-2
  137.     blocker2=1
  138.     print rect_m
  139. ###########################
  140.         ###################
  141.         ###################
  142. if __name__ == '__main__':
  143.     root=tk.Tk()
  144.     canvas=tk.Canvas(root,height=400,width=400,bg='black')
  145.     canvas.grid()
  146.     tk.Button(root,text='master',command=lambda rect=rect_m,can=canvas:masterf(rect,can)).grid()
  147.     tk.Button(root,text='Cadre',command=rectf).grid()
  148.     tk.Button(root,text='Quit',command=root.quit).grid()
  149.    
  150.     root.mainloop()
  151.     root.destroy()
  152.     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
 

Reply

Marsh Posté le 27-02-2006 à 19:28:06   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed