2017-04-18 30 views
-1

在左側有一個tkinter框架用於標籤,checkbuttons等。右側是顯示地圖的畫布。我可以在地圖上滾動,它會給出當時有關鼠標指針在地圖上的位置的經度/緯度座標。我可以點擊地圖,它會放大地圖。問題是,當我在框架中顯示底層地圖數據時,即使我不在畫布上,但在經過/緯度變化的框架上滾動鼠標時。如果我點擊框架,還沒有在那裏放置任何檢查按鈕來測試它,它就像放在畫布上一樣放大。將tkinter畫布和框架分開

有沒有什麼辦法可以將框架和畫布的動作「感應」分開,以使它們分開。

我會張貼代碼,有點冗長,但我已經離開這裏,因爲我已經遲到了。

編輯:

我回來了,感謝布賴恩的答覆,我想我明白他在說什麼做的,只是不知道如何去做。在幾次嘗試中似乎沒有任何工作。當然,我仍然不完全確定下面代碼中的(自我,父母)「尋址」方法。

另外我看到在不遠的將來可能會出現很高的概率,需要能夠分別引用鼠標按鈕同時顯示畫布和框架,也可以根據所點擊的位置做不同的事情。幸運的是,由於不得不早早離開這裏,並且得到了Bryan的回答,我已經能夠更加縮短代碼,並且現在擁有的代碼正在執行我正在談論的內容。張貼代碼的延遲對我有利。

import tkinter as tk 
from tkinter import * 

class Example(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 

     self.frame = tk.Frame(self,bg='black', width=1366, height=714) 
     self.frame1 = tk.Frame(self,bg='gray', width=652, height=714) 
     self.frame.pack() 
     self.canvas = tk.Canvas(self, background="black", width=714, height=714) 
     self.canvas.pack_propagate(0) 
     self.canvas.place(x=652,y=0) 
     self.frame1.pack_propagate(0) 
     self.frame1.place(x=0,y=0) 

     self.longitudecenter = -95.9477127 
     self.latitudecenter = 36.989772 
     self.p = 57.935628 
     global v 
     s = Canvas(self, width=150, height=20) 
     s.pack_propagate(0) 
     s.place(x=0,y=695) 
     v = Label(s, bg='gray',fg='black',borderwidth=0,anchor='w') 
     v.pack() 

     parent.bind("<Motion>", self.on_motion) 
     self.canvas.focus_set() 

     self.canvas.configure(xscrollincrement=1, yscrollincrement=1) 

    def on_motion(self, event): 
     self.canvas.delete("sx") 
     self.startx, self.starty = self.canvas.canvasx(event.x),self.canvas.canvasy(event.y) 
     px = -(round((-self.longitudecenter + (self.p/2))- (self.startx * (self.p/714)),5)) 
     py = round((self.latitudecenter + (self.p/2))-(self.starty * (self.p /714)),5) 
     v.config(text = "Longitude: " + str(px)) 

if __name__ == "__main__": 
    root = tk.Tk() 
    Example(root).pack(fill="both", expand=True) 
    root.mainloop() 

這是我一直在使用的一部分。我如何改變它,以便我可以分別綁定到框架和畫布。現在我只需要鼠標位置就可以綁定到畫布,但是將來我需要能夠使用鼠標點擊,甚至可以在畫布和框架上單獨使用鼠標位置。誰知道自從我三週前開始這個項目以來,這個項目已經發生了多大變化/進步......天空是極限)。

+0

只是鼠標移動綁定到畫布上。這聽起來像你已經綁定到整個應用程序。請提供[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。我猜你只需要十幾行代碼來重現這種行爲。 –

+0

我更新了這個問題,並且包含了工作錯誤的代碼,不像今天早上我剛開始發佈的那些不工作的錯誤代碼。如何分別綁定到畫布和框架?我覺得需要在即將到來的時候需要綁定到兩者。 – confused

回答

0

如果您希望綁定僅針對特定窗口小部件觸發,但是該窗口小部件上的綁定而不是包含窗口小部件上的綁定。

更改此:

parent.bind("<Motion>", self.on_motion) 

要這樣:

self.canvas.bind("<Motion>", self.on_motion) 
+0

對於知識,我無法找到我認爲我看到它引用的位置,父母是否將綁定綁定到框架,在我上面發佈的代碼的情況下?我是否正確設置了這個設置,所以frame是包含frame1和self.canvas內容的包含小部件? – confused

+0

在你的代碼中,'p​​arent'是根窗口。在課堂內,「self」是包含畫布的框架。 –