2016-11-12 36 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

你不應該使用自己的循環和'sleep'做動畫。請參閱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() 

enter image description here

+0

謝謝!這正是我所需要的,這個中心線是從哪裏來的? –

+0

我不明白你的問題,請解釋請 – eyllanesc

+0

如果你願意的話,在半圓的中途,似乎有一條「半條線」。幾乎就像它將半圓劃分成一半。我不知道爲什麼那條線正在繪製 –