2016-11-12 7 views
1

Я пишу скрипт python как доказательство концепции создания тахометра.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, но, хотя это был бы забавный проект, чтобы взять на себя.

Спасибо, Brett

+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

, кажется, есть «половина линии», если хотите, на полпути через полукруг. Почти как его разделение полукруга пополам. Я не знаю, почему эта линия рисуется –