我正在使用 Tkinter 来可视化我的数据点。我的问题是我不能让数据点出现在画布的中心,同时画布足够大。
为了使画布看起来不错,我希望将其固定在周围800*600(我认为单位是pixel)。所以我做了以下事情:
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
Run Code Online (Sandbox Code Playgroud)
但是,我要绘制的数据以meter为单位。此外,他们围绕着原点(0, 0),这就意味着有负坐标两个x和y。
然后当我在画布上绘制它们时,我会得到这样的东西

显然,数据点是以像素为单位绘制的!
我希望画布在屏幕上足够大,同时以画布为中心以适当的比例绘制数据。(将我的原点(0, 0)放在画布中心)
我该怎么做?
可以通过设置 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()
Run Code Online (Sandbox Code Playgroud)
您还可以使用xview_scroll和yview_scroll方法将 0,0 移动到画布可见部分的中心。您可以在创建画布后执行此操作,而不是像上面的示例那样设置滚动区域:
self.canvas.xview_scroll(800, "units")
self.canvas.yview_scroll(800, "units")
Run Code Online (Sandbox Code Playgroud)
这将以编程方式在画布上下滚动 800 像素,以便 0,0 位于屏幕中央。