2016-11-12 3 views
1

타키 미터를 만드는 개념의 증명으로 파이썬 스크립트를 작성하고 있습니다.Python TachoMeter, 각 create_line 이후에 표시하는 방법

tkinter로 바늘이 타코미터에있을 줄을 그립니다. 그러나, 내가 그릴 때 즉시 표시되지 않습니다,하지만 그것을 필요합니다.

또한 센터 코드가 내 코드에서 오는 위치를 찾을 수 없기 때문에 내 마음을 잃을 수도 있습니다. 내 TachoMeter 클래스의 어딘가에 있지만 그냥 찾을 수없는 것 같습니다. 어떤 도움을 크게 감상 할 수

import Tkinter as tk 
import math 
import time 


class Point: 
    def __init__(self,x=0,y=0): 
     self.x = x 
     self.y = y 

class TachoMeter(tk.Tk): 
    def __init__(self, CenterPoint = Point(), LeftPoint=Point(), Radius=0, LeftBuffer=0, BottomBuffer=0, MIN_RPM=0, MAX_RPM=0, canvas_height=0, canvas_width=0, *arg, **kwargs): 
     tk.Tk.__init__(self, *arg, **kwargs) 
     self.canvas = tk.Canvas(width=canvas_width, height=canvas_height) 
     self.canvas.pack(fill="both", expand=True) 
     self.CenterPoint = CenterPoint 
     self.MAX_RPM = MAX_RPM 
     self.MIN_RPM = MIN_RPM 
     self.LeftBuffer = LeftBuffer 
     self.BottomBuffer = BottomBuffer 
     self.Radius = Radius 
     self.Point_0 = LeftPoint 
     self._create_arc((LeftPoint.x,LeftPoint.y), (LeftPoint.x + 2*Radius,LeftPoint.y)) 




    def _create_arc(self, p0, p1): 
     extend_x = (self._distance(p0,p1) -(p1[0]-p0[0]))/2 
     extend_y = (self._distance(p0,p1) -(p1[1]-p0[1]))/2 
     startAngle = math.atan2(p0[0] - p1[0], p0[1] - p1[1]) *180/math.pi 
     self.canvas.create_arc(p0[0]-extend_x, p0[1]-extend_y , p1[0]+extend_x, p1[1]+extend_y, extent=180, start=90+startAngle) 
     self.canvas.create_arc(LeftPoint.x+Radius,LeftPoint.y,LeftPoint.x+Radius,LeftPoint.y-Radius) 

    def _distance(self, p0, p1): 
     return math.sqrt((p0[0] - p1[0])**2 + (p0[1] - p1[1])**2) 


def _rpmGauge(): 


       for x in range(180,0,-1): 
        curTheta = float((math.pi*x)/180) 
        #print(int(curTheta)) 
        curX = TACH.CenterPoint.x +(TACH.Radius*math.cos(curTheta)) 
        #print(int(curX)) 
        curY = TACH.CenterPoint.y - (TACH.Radius*math.sin(curTheta)) 
        #print(int(curY)) 
        TACH.canvas.create_line(TACH.CenterPoint.x,TACH.CenterPoint.y,int(curX),int(curY)) 
        TACH.canvas.pack() 
        time.sleep(0.025) 






Radius = 400 
acanvas_width = 500 
acanvas_height = 600 
LeftBuffer = 100 
BottomBuffer = 100 
CenterPoint = Point(LeftBuffer+Radius,acanvas_height - BottomBuffer) 
LeftPoint = Point(LeftBuffer,acanvas_height-BottomBuffer) 
MAX_RPM = 8000 
MIN_RPM = 0 


TACH = TachoMeter(CenterPoint,LeftPoint,Radius,LeftBuffer,BottomBuffer, MIN_RPM, MAX_RPM, acanvas_height, acanvas_width) 

TACH.after(2000, _rpmGauge) 
TACH.mainloop() 

:

어쨌든, 여기에 코드입니다. 필자는 여전히 Python에서 매우 새롭지 만 계속해서 재미있는 프로젝트가 될 것입니다.

감사합니다, 브렛

+1

. 예를 들어보십시오 http://stackoverflow.com/a/32457372/7432 및 http://stackoverflow.com/a/25431690/7432 –

답변

2

내 솔루션 :

import Tkinter as tk 
import math 
import time 


class Point: 
    def __init__(self, x=0, y=0): 
     self.x = x 
     self.y = y 


class TachoMeter(tk.Tk): 
    def __init__(self, CenterPoint=Point(), LeftPoint=Point(), Radius=0, LeftBuffer=0, BottomBuffer=0, MIN_RPM=0, 
       MAX_RPM=0, canvas_height=0, canvas_width=0, *arg, **kwargs): 
     tk.Tk.__init__(self, *arg, **kwargs) 
     self.canvas = tk.Canvas(width=canvas_width, height=canvas_height) 
     self.canvas.pack(fill="both", expand=True) 
     self.CenterPoint = CenterPoint 
     self.MAX_RPM = MAX_RPM 
     self.MIN_RPM = MIN_RPM 
     self.LeftBuffer = LeftBuffer 
     self.BottomBuffer = BottomBuffer 
     self.Radius = Radius 
     self.Point_0 = LeftPoint 
     self._create_arc((LeftPoint.x, LeftPoint.y), (LeftPoint.x + 2 * Radius, LeftPoint.y)) 
     self._rpmGauge() 

    def _create_arc(self, p0, p1): 
     extend_x = (self._distance(p0, p1) - (p1[0] - p0[0]))/2 
     extend_y = (self._distance(p0, p1) - (p1[1] - p0[1]))/2 
     startAngle = math.atan2(p0[0] - p1[0], p0[1] - p1[1]) * 180/math.pi 
     self.canvas.create_arc(p0[0] - extend_x, p0[1] - extend_y, p1[0] + extend_x, p1[1] + extend_y, extent=180, 
           start=90 + startAngle) 
     self.canvas.create_arc(LeftPoint.x + Radius, LeftPoint.y, LeftPoint.x + Radius, LeftPoint.y - Radius) 

    def _distance(self, p0, p1): 
     return math.sqrt((p0[0] - p1[0]) ** 2 + (p0[1] - p1[1]) ** 2) 

    def _rpmGauge(self): 
     for x in range(180, 0, -1): 
      curTheta = float((math.pi * x)/180) 
      curX = self.CenterPoint.x + (self.Radius * math.cos(curTheta)) 
      curY = self.CenterPoint.y - (self.Radius * math.sin(curTheta)) 
      self.line = self.canvas.create_line(self.CenterPoint.x, self.CenterPoint.y, int(curX), int(curY)) 
      self.canvas.pack() 


Radius = 400 
acanvas_width = 500 
acanvas_height = 600 
LeftBuffer = 100 
BottomBuffer = 100 
CenterPoint = Point(LeftBuffer + Radius, acanvas_height - BottomBuffer) 
LeftPoint = Point(LeftBuffer, acanvas_height - BottomBuffer) 
MAX_RPM = 8000 
MIN_RPM = 0 

TACH = TachoMeter(CenterPoint, LeftPoint, Radius, LeftBuffer, BottomBuffer, MIN_RPM, MAX_RPM, acanvas_height, 
        acanvas_width) 

TACH.mainloop() 
당신은 애니메이션을 위해 자신의 루프와`sleep`를 사용해서는 안

enter image description here

+0

감사합니다! 이것은 정확히 내가 필요로했던 것인데, 그 중심선이 어디서 오는 것인지 생각할 수 있습니까? –

+0

귀하의 질문을 이해할 수 없으므로 – eyllanesc

+0

반원의 중간에 "반 줄"이있는 것으로 보입니다. 거의 반원으로 반원을 나누는 것과 같습니다. 나는 그 라인이 그려진 이유를 모른다. –

관련 문제