2016-05-06 8 views
2

[x、y(ダブルマウスクリックの座標)でエントリを表示しようとしています。Entry.place(X、Y)は機能しません

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) 

したがって、上記のコードで、私は実際に私は(X、Yのエントリポップアップ)たかったんするが、私は私の[ツリー]エントリの行をダブルクリックしたときにポップアップ表示されませんができますよ右の位置... は、しかし、私は右の位置でエントリポップアップ[ツリー]の行をクリックすると...

ので、私は(ツリーへのバインド)別の何かを試みたが、同じことが起こった:

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

答えて

2

イベント座標はイベントを取得したウィジェットに相対的です。

下部ウィジェットの左上隅をクリックすると、ウィジェットを基準としてをクリックしたため、x、yは0,0になります。 placeを使用すると、座標はウィジェットを配置しているウィジェットに相対的です。

あなたの場合、下部のウィンドウで20,20をクリックしたとします。これは、event.xevent.yが報告したものです。ただし、新しいエントリウィジェットの親をWindoに設定しているため、ウィジェットを20,20に配置すると、クリックしたウィジェットの20,20ではなく、Windoの20,20を調整することになります。そのため、ウィンドウの上部に表示されます。

実際にやりたいことに応じて、いくつか解決する方法があります。たとえば、マウスの下にウィジェットを作成しようとしている場合、単純な解決策は、ウィジェットを常にルートウィンドウにするのではなく、クリックしたウィジェットの子にすることです。例えば

def Click(event): 
    ... 
    En = Entry(event.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

私は今理解しています:)うまく働いた – Raskaya

関連する問題