Спидометр Python WX работает как часыPython

Программы на Python
Anonymous
Спидометр Python WX работает как часы

Сообщение Anonymous »

Я хочу перемещать стрелку спидометра (в пакете «wx») в Python каждую секунду (так же, как часы) после нажатия кнопки. Последовательность действий будет такой:
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()


Подробнее здесь: https://stackoverflow.com/questions/426 ... g-as-clock

Вернуться в «Python»