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: Code :
- # -*- coding: cp1252 -*-
- import Tkinter as tk
- import tkMessageBox
- ### VARIABLES ###########
- coord_master,coord_cadre,coord_point='','',[]
- x,y,X,Y=0,0,0,0
- typer=''
- rect_m,rect_c='','coucou'
- ov_m,ov_c='',''
- blocker,blocker2=0,0
- canvas=''
- def rectf(rect_m):#bouton cadrage
- 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 placement
- 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,y
- x,y=event.x,event.y
- 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_c
- lmaster,hmaster=float(coord_master[2]-coord_master[0]),float(coord_master[3]-coord_master[1])
- x2,y2=0,0
- X,Y=event.x,event.y
- if X<x:
- if Y<y:
- Y=int(y-(((x-X)*hmaster)/lmaster))
- x2,y2=X+((x-X)/2),(Y+((y-Y)/2))-2
- else:
- Y=int(y+(((x-X)*hmaster)/lmaster))
- x2,y2=X+((x-X)/2),(Y-((Y-y)/2))-2
- else:
- if Y>y:
- Y=int(y-(((x-X)*hmaster)/lmaster))
- x2,y2=X-((X-x)/2),(Y-((Y-y)/2))-2
- else:
- Y=int(y+(((x-X)*hmaster)/lmaster))
- x2,y2=X-((X-x)/2),(Y+((y-Y)/2))-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 rectangle
-
- 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=1
- def rect_tempf(event):
- ## dessin provisoire du cadrage
- global x,y,X,Y,ov_c,coord_master,rect_c
- ##
- lmaster,hmaster=float(coord_master[2]-coord_master[0]),float(coord_master[3]-coord_master[1])
- X2,Y2=event.x,event.y
- if X2<x:
- if Y2<y:
- Y2=y-(((x-X2)*hmaster)/lmaster)
- x2,y2=X2+((x-X2)/2),(Y2+((y-Y2)/2))-2
- else:
- Y2=y+(((x-X2)*hmaster)/lmaster)
- x2,y2=X2+((x-X2)/2),(Y2-((Y2-y)/2))-2
- else:
- if Y2<y:
- Y2=y-(((x-X2)*hmaster)/lmaster)
- x2,y2=X2-((X2-x)/2),(Y2+((y-Y2)/2))-2
- else:
- Y2=y+(((x-X2)*hmaster)/lmaster)
- x2,y2=X2-((X2-x)/2),(Y2-((Y2-y)/2))-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))-2
- else:
- Y2=y+(((x-X2)*hmaster)/lmaster)
- x2,y2=X2+((x-X2)/2),(Y2-((Y2-y)/2))-2
- else:
- if Y2<y:
- Y2=y-(((x-X2)*hmaster)/lmaster)
- x2,y2=X2-((X2-x)/2),(Y2+((y-Y2)/2))-2
- else:
- Y2=y+(((x-X2)*hmaster)/lmaster)
- x2,y2=X2-((X2-x)/2),(Y2-((Y2-y)/2))-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
|