2013-10-25 5 views
2

Tkinter를 사용하여 데이터 포인트를 시각화했습니다. 내 문제는 캔버스의 중심에 데이터 포인트를 표시 할 수 없으며 캔버스가 충분히 크다는 것입니다.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)이며, 은 및 y에 대해 음수 좌표가임을 나타냅니다.

는 그럼 난 캔버스를 그릴 때 나는 분명히이

enter image description here

같은, 데이터 포인트가 픽셀 꾸몄다했다 얻을!

나는 캔버스가 화면에서 충분히 커지고 데이터가 캔버스를 중심으로 적절한 크기로 플롯되기를 바랍니다. (내 원산지는 캔버스 중심에 (0, 0))

어떻게하면됩니까?

답변

-1

캔버스가 자동으로 그려진 크기에 맞게 조정되지는 않습니다. 적절한 크기가 무엇인지 파악하고 설정해야합니다.

또한 캔버스 좌표는 항상 왼쪽 위 모서리에서 (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 
+0

당신이 말하는 것은 사실이 아닙니다. ** scrollregion 속성을 변경하거나'xview'와'yview' 메소드를 호출하여 0,0을 왼쪽 위 모서리에서 멀리 이동할 수 있습니다. 좌표계에서 수학을 수행 할 필요는 없습니다. –

0

원점이 중심에 있도록 캔버스보기를 스크롤 할 xviewyview 방법을 사용합니다.

스케일링이 지원되지 않으므로 필요하다면 Brionius에서 제안한 것처럼 소스 데이터를 변환해야합니다.

2

캔버스의 가시 ​​중심은 scrollregion 속성을 설정하여 변경할 수 있습니다. 예를 들어, 너비가 800 픽셀 인 캔버스에서 스크롤 영역을 (-400,-400, 400, 400)으로 설정하면 좌표 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() 

당신은 또한 센터로 0,0 이동 xview_scrollyview_scroll 방법을 사용할 수 있습니다 캔버스의 보이는 부분의 0,0의 중심에 있도록,이 프로그램을 통해 아래로 800 개 픽셀 캔버스를 스크롤

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

대신 위의 예에서와 같이 scrollregion을 설정, 당신은 당신의 캔버스를 만든 후이 작업을 수행 할 수 있습니다 화면.

+0

감사! 나는 원점을 중심에 성공적으로 위치시킨다. 그러나 내 질문에, 나는 또한 픽셀 대신 데이터 단위 (m)로 내 창 크기를 정의 할 수 있도록 노력하겠습니다. 이렇게하면 점이 더 크게 보이게 할 수 있습니다. 내가 지금 가지고있는 것은 다음과 같습니다 : http://imgur.com/xqANQ1L –

관련 문제