2011-09-29 57 views
3

可以說我在Tkinter應用程序中創建了一個畫布。如何在點擊時獲取形狀的標籤

在畫布上,我繪製了幾個矩形。

我想要的本質是要知道用戶點擊了哪個矩形,這是我主要關心的問題,但這是我嘗試過的,我認爲可能是解決方案。

這是我的佈局:

for x in range(1,6): 
     for y in range(1,7):  
      tableNumber = y + 6*(x-1) 
      w.create_rectangle((table.xSeparation + table.width) * y - table.width, 
           (table.ySeparation + table.height) * x - table.height, 
           (table.xSeparation + table.width)*y, 
           (table.ySeparation + table.height) * x, 

           fill="brown", tags="table" + str(tableNumber)) 

      w.tag_bind("table" + str(tableNumber), '<Button-1>', do) 

因此,這僅僅是創建一個行和列的佈局矩形。

每個矩形都有一個table1table2table30形式的特定標籤。

當我點擊矩形時,do函數執行。

比方說,你是這樣的:

def do(event): 
    print "click" 

沒有拿到在控制檯中的「點擊」在矩形的每一次點擊。

我希望能夠獲取單擊矩形的標籤,以便能夠做這樣的事情:

def do(event): 
    print str(theTagOfTheClickedRectangle) 

所以我什麼事件檢查我可以叫它們是:

  • 插件
  • 的x,y
  • x_root,y_root
  • 鍵符
  • 鍵碼
  • NUM
  • 寬度,高度

無的似乎針點我點擊了什麼矩形。

我考慮增加更多的參數給do功能在這裏:

w.tag_bind("table" + str(tableNumber), '<Button-1>', do(event, tag)) 

但是,這似乎並沒有很好地工作,但也許我不會做do權:

do(event, tag): #this doesn't work at all!! 
    print event.x 
    print tag 

我希望這個問題很明顯,如果我以同樣的方式獲得標籤,就可以獲得事件的'x'和'y',那樣會很舒服。

我現在想到的唯一的實際解決方案是計算'event.x'和'event.y'的數學,並根據點擊的座標計算用戶點擊了哪個矩形,這似乎過於複雜,我想要做的,雖然我已經做到了,它顯然工作。

我希望這個問題是清楚的,其他明智請向任何澄清。

請注意,我不依賴於任何這段代碼的,相反,我正在尋找這個問題的解決方案,最有效的將工作,即使不使用標籤的手段,或其他類型的控件或任何的是更容易。

回答

7

您可以使用這樣的引用被點擊的對象:

event.widget.find_withtag("current") 

標籤「當前」是特殊的,代表鼠標下的最頂層的對象。

+0

謝謝@Bryan!這是一個非常簡單和正確的解決方案!我檢查了你的個人資料,你似乎對tkinter有相當多的瞭解。我可以問你經常使用哪些文件嗎?我喜歡tkinter的簡單性,但我發現它的文檔非常不完整。例如,你所建議的答案在我使用過的任何文件中都沒有提及。非常感謝你! – Trufa

+1

@Trufa:對於相關的傳統知識工具包信息的權威網站是在http://tcl.tk/man/tcl8.5/TkCmd/contents.htm官方手冊頁。這些對於Tcl語言來說是特定的,但是將信息適配到tkinter是一個非常簡單的思維轉換。有關特定於tkinter的信息,請訪問http://effbot.org/tkinterbook/(以及該站點FWIW上提及的「當前」標籤)。最後一個帶有一些有用信息的網站是http://www.tkdocs.com,它覆蓋了python,perl,tcl和ruby。 –

+0

非常感謝!我不知道Tcl的一個,我會檢查出來,其他的是那些通常在谷歌搜索中出現的。我無法相信我錯過了列表框中的「當前」,可能是因爲我不知道我在找什麼。無論如何,再次感謝! – Trufa

2
w.tag_bind("table" + str(tableNumber), '<Button-1>', do(event, tag)) 

應改爲

tag = "table" + str(tableNumber) 
callback = lambda event, tag=tag: do(event, tag) 
w.tag_bind(tag, '<Button-1>', callback) 

拉姆達創建一個與標籤名作爲第二個參數的默認值的函數。 Tkinter只用一個參數調用該函數,事件,第二個參數使用默認值。

+0

這真是太真棒!它的作用就像一個魅力,它完全**我正在尋找!非常感謝!別的我唯一會問,如果你能解釋一下我,你在這行做了什麼有一點點'回調=拉姆達事件,標籤=標籤:DO(事件,標籤)',我由拉姆達弄得有點功能。非常感謝你! – Trufa

+0

它相當於'def callback(event,t = tag):return do(event,t)'。 –

+0

我改變了接受的答案布萊恩的簡單,主要是因爲因爲它是一個我會使用,即便如此,再次感謝您的答案,它的工作如預期。 – Trufa

相關問題