【问题标题】:Splitting tkinter canvas and frame apart将 tkinter 画布和框架分开
【发布时间】:2017-04-18 14:56:09
【问题描述】:

左侧有一个 tkinter 框架,用于标签、检查按钮等。右侧是显示地图的画布。我可以滚动地图,它会给出鼠标指针在相关时间点在地图上所在位置的经度/纬度坐标。我可以点击地图,它会放大地图。问题是当我在想要显示底层地图数据的框架上时,当我在框架上滚动鼠标时,经度/纬度会发生变化,即使我不在画布上。如果我单击框架,但尚未在其中放置任何复选按钮以进行测试,它会像在画布上一样放大。

有什么方法可以将框架和画布的动作“感应”分开以保持它们分开。

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

编辑:

我回来了,感谢 Bryan 的回复,我想我明白他要做什么,只是不知道该怎么做。在几次尝试中,似乎没有任何效果。当然,我仍然不能完全确定下面代码中的 (self,parent) 'addressing' 方法。

我还看到在不久的将来需要能够将鼠标按钮分别引用到画布和框架的可能性很大,也就是根据我点击的位置让它做不同的事情。幸运的是,由于不得不早点离开这里,加上 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()

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

【问题讨论】:

  • 只需将鼠标移动绑定到画布上。听起来您已将其绑定到整个应用程序。请提供Minimal, Complete, and Verifiable example。我猜你只需要十几行代码就可以重现这种行为。
  • 我更新了问题并包含了有效的错误代码,这与我今天早上最初发布时遇到的无效错误代码不同。如何分别绑定到画布和框架?当我需要同时绑定两者时,我觉得这种需求指日可待。

标签: python-3.x tkinter


【解决方案1】:

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

改变这个:

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

到这里:

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

【讨论】:

  • 对于知识,我找不到我认为我看到它引用的地方,在我上面发布的代码的情况下,父母是否将绑定绑定到框架?我是否正确设置了此设置,因此 frame 是包含 frame1 和 self.canvas 的包含小部件?
  • 在您的代码中,parent 是根窗口。在类中,self 是包含画布的框架。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多