2017-04-18 159 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”是包含画布的框架。 –