拆分tkinter画布和框架

时间:2017-04-18 14:56:10

标签: python-3.x tkinter

左边有一个tkinter框架用于标签,支票按钮等。右边是一个显示地图的画布。我可以滚动地图,它会给出当前鼠标指针在地图上的位置的经度/纬度坐标。我可以点击地图,它将放大地图。问题是,当我想要显示基础地图数据的框架上,当我在框架上滚动鼠标时,经度/纬度会发生变化,即使我不在画布上。如果我点击框架,不要在那里放任何支票按钮来测试它,它会像在画布上一样放大。

有没有办法将行动分开?感知'框架和画布使它们分开。

我会发布代码,有点冗长,但我已经离开这里,因为我已经迟到了。

编辑:

我回来了,感谢布莱恩的回复,我想我明白他在说什么,只是不知道怎么做。在几次尝试中似乎没有任何效果。虽然我仍然不完全确定(自我,父母)和#39;解决'下面代码中的方法。

此外,我发现在不遥远的未来需要能够将鼠标按钮分别引用到画布和框架上的概率很高,也就是根据我点击的位置做了不同的事情。幸运的是,由于不得不早点离开这里并且使用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()

这是我一直在使用的一部分。如何更改它,以便我可以分别绑定到框架和画布。现在我只需要在鼠标位置的情况下能够绑定到画布,但是将来我需要能够使用鼠标点击,甚至可以在画布和框架上单独使用鼠标位置。(谁知道这个项目自三周前开始以来已经改变/提升了多少......天空是极限。

1 个答案:

答案 0 :(得分:0)

如果您希望绑定仅针对特定窗口小部件触发,而是针对该窗口小部件上的绑定而不是针对包含窗口小部件的绑定。

改变这个:

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

对此:

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