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
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))-
##########################################################################
########## 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
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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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:
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+-'])"
On Mon, 27 Feb 2006 20:35:37 +0100, airod <airod.23xqs7@no-mx.frbox.net>
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:
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+-'])"
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:
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+-'])"