python wx speedmeter作为时钟工作

时间:2017-03-08 08:25:39

标签: python multithreading wxpython

我希望在点击一个按钮后,每秒钟(在时钟相同的时候)在Python中移动speedmeter(在'wx'包中)。动作序列如下: 1.单击按钮 2.速度计的手在每0.4秒后开始移动。 但是在点击按钮(开始测速仪的手)之后,框架的颜色变暗(似乎应用程序崩溃但实际上没有错误或异常)。我认为它正在发生,因为我正在编写一个无限循环(更新速度计的手),它阻止了APP.MainLoop()函数。我也认为线程编程可以帮助我,但我对线程编程知之甚少。所以,帮帮我吧。

以下是我的代码:

import threading
import os
import wx.lib.agw.speedmeter as SM
import wx.lib.agw.speedmeter as SM2
import sys
import wx
import math
from wx import animate
import time
from random import randint
import thread

class MyFrame(wx.Frame):

    def __init__(self,parent,id,title):
        # creation frame
        l, h = wx.GetDisplaySize()
        wx.Frame.__init__(self,parent,-1,title,size=(l, h))

        self.speed = SM.SpeedMeter(self,agwStyle=SM.SM_DRAW_HAND|SM.SM_DRAW_SECTORS|SM.SM_DRAW_MIDDLE_TEXT|SM.SM_DRAW_SECONDARY_TICKS,pos=(15,10),size=(l/2,h/2))

        # Set The Region Of Existence Of SpeedMeter 1
        #self.speed.SetAngleRange(*-math.pi/4, math.pi/1.75)
        #self.speed.SetAngleRange(-2*math.pi/4, 2.57*math.pi/1.75)
        self.speed.SetAngleRange(-2*math.pi/4, 2.57*math.pi/1.75)

        # SpeedMeter In Sectors
        intervals = range(0, 5100, 100)
        self.speed.SetIntervals(intervals)

        # Assign The Same Colours To All Sectors
        colours = [wx.WHITE]*50
        self.speed.SetIntervalColours(colours)

        # Assign The Ticks
        ticks = [str(interval) for interval in intervals]
        self.speed.SetTicks(ticks)

        # Set The Ticks/Tick Markers Colour
        self.speed.SetTicksColour(wx.RED)

        # We Want To Draw 5 Secondary Ticks Between The Principal Ticks
        self.speed.SetNumberOfSecondaryTicks(4)

        # Set The Font For The Ticks Markers
        self.speed.SetTicksFont(wx.Font(8.9, wx.SWISS, wx.NORMAL, wx.NORMAL))

        # Set The Text In The Center Of SpeedMeter
        self.speed.SetMiddleText("Actual")

        # Assign The Colour To The Center Text
        self.speed.SetMiddleTextColour(wx.BLACK)

        # Assign A Font To The Center Text
        self.speed.SetMiddleTextFont(wx.Font(22, wx.SWISS, wx.NORMAL, wx.BOLD))

        # Set The Colour For The Hand Indicator
        self.speed.SetHandColour(wx.BLUE)#wx.Colour(255, 250, 20))

        # Do Not Draw The External (CONTAINER) Arc
        self.speed.DrawExternalArc(True)

        # adding button
        self.btn = wx.Button(self,2,"OK", pos = (400, 820), size = (50, 30))
        self.btn.Bind(wx.EVT_BUTTON, self.OnClicked)

    def OnClicked(self, event):
        try:
            i = 0
            while(True):
                #r = randint(0, 5000)
                if(i >= 5000):
                    i = 0
                i += 50
                self.speed.SetSpeedValue(i)
                time.sleep(0.5)
        except Exception, err:
            print("Exception", Exception, err)

if __name__=='__main__' :
    APP=wx.App()
    frame=MyFrame(None,0,'Appsy')
    APP.SetTopWindow(frame)
    frame.Show()
    APP.MainLoop()

0 个答案:

没有答案