3

我正在使用 Tkinter 来可视化我的数据点。我的问题是我不能让数据点出现在画布的中心,同时画布足够大。

为了使画布看起来不错,我希望将其固定在周围800*600(我认为单位是像素)。所以我做了以下事情:

class DisplayParticles(Canvas):
    def __init__(self):
        # Canvas
        Canvas.__init__(self)
        self.configure(width=800, height=600)
        # Particles
        self.particle_radius = 1
        self.particle_color = 'red'
        # User
        self.user_radius = 4
        self.user_color = 'blue'
        self.ghost_color = None

但是,我要绘制的数据以为单位。另外,它们以原点为中心,(0, 0)这意味着 和都有负坐标xy

然后当我在画布上绘制它们时,我会得到这样的东西

在此处输入图像描述

显然,数据点是以像素为单位绘制的!

我希望画布在屏幕上足够大,同时数据以画布为中心以适当的比例绘制。(将我的原点(0, 0)放在画布中心)

我该怎么做?

4

3 回答 3

6

可以通过设置 scrollregion 属性来更改画布的可见中心。例如,如果将滚动区域设置(-400,-400, 400, 400)为 800 像素宽的画布,坐标 0,0 将出现在屏幕中央。

这是一个在 0,0 处绘制一个正方形并出现在屏幕中央的示例:

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self,*args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)

        self.canvas = tk.Canvas(width=800, height=800)
        self.canvas.pack(side="top", fill="both", expand=True)
        self.canvas.configure(scrollregion=(-400, -400, 400, 400))

        self.canvas.create_rectangle(-10,-10,10,10, fill="red", outline="black")

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

您还可以使用xview_scrollyview_scroll方法将 0,0 移动到画布可见部分的中心。您可以在创建画布后执行此操作,而不是像上面示例中那样设置滚动区域:

self.canvas.xview_scroll(800, "units")
self.canvas.yview_scroll(800, "units")

这将以编程方式将画布上下滚动 800 像素,因此 0,0 位于屏幕中央。

于 2013-10-25T10:58:54.280 回答
0

使用xviewandyview方法滚动画布视图,使原点位于中心。

不支持缩放,因此如果需要,您需要转换源数据,就像 Brionius 建议的那样。

于 2013-10-25T10:03:23.157 回答
-1

您的 Canvas 不会自动缩放以适合您绘制的内容 - 您必须确定合适的尺寸并进行设置。

此外,Canvas 坐标始终以左上角的 (0, 0) 开头 - 无法更改。这意味着您必须翻译在画布上绘制的所有点。幸运的是,这很容易:

width = ...   # Determine the correct width
height = ...  # Determine the correct height
self.configure(width=width, height=height)

coords = (-20, -30, 10, 60)  # The coordinates of a shape you want to draw

# add width/2 and height/2 to x and y coordinates respectively so that the (0, 0) coordinate is shifted to the center of the canvas:
newCoords = (coords[0]+width/2, coords[1]+height/2, coords[2]+width/2, coords[3]+height/2)  

self.create_oval(*newCoords)  # Create the translated shape
于 2013-10-25T09:56:12.547 回答