#! /usr/bin/python3 import wx import time from math import pi, sin, cos class AClock(wx.Panel): def __init__(self, P): super().__init__(P) self.SetSize((300,300)) self .Bind(wx.EVT_SIZE, self.resize) self.timer=wx.Timer(self,-1) self.Bind(wx.EVT_TIMER, self.tick) self.Bind(wx.EVT_PAINT, self.repaint) self.Bind(wx.EVT_SIZE, self.resize) self.timer.Start(1000) def repaint(self,e): dc:wx.DC= wx.PaintDC(self) self.drawBG(dc) self.drawHands(dc) def resize(self, e): self.Refresh() def tick(self,e): self.Refresh() def drawBG(self,dc:wx.DC): dc.SetBrush(wx.BLACK_BRUSH) dc.DrawRectangle(self.GetRect()) def drawFace(self,dc:wx.DC): dc.SetBrush(wx.BLACK_BRUSH) P:wx.Pen=wx.BLUE_PEN P.SetWidth(5) dc.SetPen(P) cx,cy=self.Size() r=min(cx,cy)/2-4 dc.DrawCircle(cx/2,cy/2,r) def drawHands(self,dc:wx.DC, *hms): if not hms:hms=time.localtime()[3:6] H,M,S=hms if len(hms)==3 else [*hms,0] h,m,s =int(H),int(M),int(S) cx, cy = self.Size cx /= 2 cy /= 2 r = min(cx, cy) ts = s * pi / 30-pi/2 sx, sy = .9*r*cos(ts), .9*r*sin(ts) sxb, syb = .2 * r * cos(ts+pi), .2 * r * sin(ts+pi) sx1, sy1 = .04 * r * cos(ts+pi/2), .04 * r * sin(ts+pi/2) sx2, sy2 = .04 * r * cos(ts-pi/2), .04 * r * sin(ts-pi/2) tm = m * pi / 30+ ts/60 -pi/2 mx, my =.85*r* cos(tm), .85*r* sin(tm) mxb, myb = .15 * r * cos(tm+pi), .15 * r * sin(tm+pi) mx1, my1 = .05 * r * cos(tm+pi/2), .05 * r * sin(tm+pi/2) mx2, my2 = .05 * r * cos(tm-pi/2), .05 * r * sin(tm-pi/2) th = h * pi / 6 +tm/60 -pi/2 hx, hy =.75*r* cos(th), .75*r* sin(th) hxb, hyb = .15 * r * cos(th+pi), .15 * r * sin(th+pi) hx1, hy1 = .07 * r * cos(th+pi/2), .07 * r * sin(th+pi/2) hx2, hy2 = .07 * r * cos(th-pi/2), .07 * r * sin(th-pi/2) dc.SetBrush(wx.GREEN_BRUSH) P = wx.WHITE_PEN P.SetWidth(2) dc.SetPen(P) dc.DrawPolygon([(cx + hx, cy + hy), (cx + hx1, cy + hy1), (cx + hxb, cy + hyb), (cx + hx2, cy + hy2)]) dc.SetBrush(wx.BLUE_BRUSH) P=wx.WHITE_PEN P.SetWidth(2) dc.SetPen(P) dc.DrawPolygon([(cx + mx, cy + my), (cx + mx1, cy + my1), (cx + mxb, cy + myb), (cx + mx2, cy + my2)]) P=wx.CYAN_PEN P.SetWidth(2) dc.SetPen(P) dc.SetBrush(wx.RED_BRUSH) dc.DrawPolygon([(cx + sx, cy + sy), (cx + sx1, cy + sy1), (cx + sxb, cy + syb), (cx + sx2, cy + sy2)]) class App(wx.App): def __init__(self): super(App, self).__init__() frame = wx.Frame(None) pane=AClock(frame) z = wx.BoxSizer() z.Add(pane,1, wx.EXPAND|wx.ALL, 1) frame.SetSizer(z) frame.Show(True) if __name__=='__main__': App().MainLoop()