2016-05-06 2 views
2

J'essaie d'afficher une entrée à [x, y (coordonnée d'un double clic de souris).Entrée.place (X, Y) ne fonctionnera pas

import tkinter 
from tkinter import * 
from tkinter import ttk 

def Click(event): 
    PX = event.x 
    PY = event.y 
    En = Entry(Windo) 
    En.place(x=PX ,y=PY) 

Windo = Tk() 
EList = ["A","B","C","D"] 
Windo.bind("<Double-Button-1>" ,Click) 
tree = ttk.Treeview(Windo) 
tree.pack() 
Tree = ttk.Treeview(Windo) 
Tree.pack() 
for element in EList: 
    Tree.insert('' ,'end' ,text=element) 

Donc, avec le code ci-dessus, je suis capable de faire en fait, je voulais (un pop-up d'entrée à X, Y), mais quand je double clic sur une ligne dans mon [arbre] l'entrée ne pas apparaitre la bonne position ... mais quand je clique sur une ligne dans [arbre] la fenêtre d'entrée à la bonne position ...

donc j'ai essayé quelque chose de différent (se lient à l'arbre), mais même chose:

Tree.bind("<Double-Button-1>" ,Click) 

Répondre

2

Les coordonnées d'événement sont relatives au widget qui a reçu l'événement.

Lorsque vous cliquez dans le coin supérieur gauche du widget inférieur, le x, y sera 0,0, car c'est là que vous avez cliqué sur par rapport au widget. Lorsque vous utilisez place, les coordonnées sont également relatives au widget dans lequel vous placez le widget.

Dans votre cas, disons que vous cliquez sur 20,20 dans la fenêtre du bas. C'est ce que event.x et event.y rapport. Cependant, vous définissez le parent du nouveau widget d'entrée sur Windo, donc placer un widget à 20,20 ira à la coordonnée 20,20 de Windo et non 20,20 du widget sur lequel vous avez cliqué. C'est pourquoi apparaît dans la partie supérieure de la fenêtre.

Il existe plusieurs façons de le réparer, en fonction de ce que vous voulez réellement faire. Par exemple, si vous essayez de créer un widget sous la souris, une solution simple consiste à faire du widget un enfant du widget sur lequel vous avez cliqué, plutôt que de toujours en faire la fenêtre racine.

Par exemple:

def Click(event): 
    ... 
    En = Entry(event.widget) 
    ... 

Cela a le problème si vous cliquez sur un bord d'un widget, le widget d'entrée peut être obscurci car il ne peut pas aller au-delà des bords de son parent. Si vous voulez que l'entrée soit toujours un widget de la racine (et donc, ne soit pas masquée par d'autres widgets), vous devez traduire les coordonnées de l'événement par rapport à la racine plutôt que par rapport au widget:

def Click(event): 
    PX = event.widget.winfo_x() + event.x 
    PY = event.widget.winfo_y() + event.y 
    En = Entry(Windo) 
    En.place(x=PX ,y=PY) 
+0

ty je comprends maintenant :) a bien fonctionné – Raskaya