wxPython 持续更新面板

0 投票
1 回答
989 浏览
提问于 2025-04-16 23:19

我刚开始学习wxPython,遇到一个问题解决不了。我需要不断更新面板上的时钟值。我有一个解决办法,但这样的话我就无法正常关闭窗口(按Alt+F4没有反应)。

另外,我也不太明白.Update、.Refresh之间有什么区别,以及什么时候应该调用.Destroy?

有没有人能推荐一本关于wxPython编程的好书?谢谢大家的帮助。

class TimeDatePanel(wx.Panel):
def __init__(self, parent, ID=ID_TIMEDATE, pos=wx.DefaultPosition, size=(50, 50), controller=None):
    wx.Panel.__init__(self, parent, ID, pos, size, wx.RAISED_BORDER)
    self.controller = controller
    transCoded = controller.transCodes
    layout = wx.GridSizer(5,2,0,10)
    layout.Add(wx.StaticText(self, wx.ID_ANY, transCoded.get("Time & Date")))
    layout.Add(wx.StaticText(self, wx.ID_ANY, ""), 0,flag=wx.ALL)
    layout.Add(wx.StaticText(self, wx.ID_ANY, transCoded.get("Local time")), 0,flag=wx.ALL|wx.ALIGN_RIGHT)
    self.LT = wx.StaticText(self, wx.ID_ANY, "")
    layout.Add(self.LT)
    layout.Add(wx.StaticText(self, wx.ID_ANY, transCoded.get("UTC")), 0,flag=wx.ALL|wx.ALIGN_RIGHT)
    self.UTC = wx.StaticText(self, wx.ID_ANY, "")
    layout.Add(self.UTC)
    layout.Add(wx.StaticText(self, wx.ID_ANY, transCoded.get("Julian day")), 0,flag=wx.ALL|wx.ALIGN_RIGHT)
    self.JD = wx.StaticText(self, wx.ID_ANY, "")
    layout.Add(self.JD)
    layout.Add(wx.StaticText(self, wx.ID_ANY, transCoded.get("Local sidereal time")), 0,flag=wx.ALL|wx.ALIGN_RIGHT)
    self.LST = wx.StaticText(self, wx.ID_ANY, "")
    layout.Add(self.LST)
    self.SetSizer(layout)
    self.updateTimeDate()
    self.Fit()

    wx.EVT_PAINT(self, self.onPaint)

def onPaint(self, event=None):
    self.updateTimeDate()

def updateTimeDate(self):
    mechanics = self.controller.mechanics
    self.LT.SetLabel(str(mechanics.getLT()))
    self.UTC.SetLabel(str(mechanics.getUTC()))
    self.JD.SetLabel(str(mechanics.getYD()))
    self.LST.SetLabel(str(mechanics.getLST()))

1 个回答

2

如果你需要时钟定期更新,为什么不试试使用AnalogClock、LEDNumberCtrl或者用wx.Timer更新的TimeCtrl呢?下面这个教程会帮你了解如何使用定时器:http://www.blog.pythonlibrary.org/2009/08/25/wxpython-using-wx-timers/

前面提到的两个控件会自己更新。当你想要改变StaticText控件或其他普通控件的值时,通常需要调用Update、Refresh或Layout。但其实你只需要用SetValue或SetLabel就可以了。

Robin Dunn有一本旧书叫《wxPython in Action》,大部分内容还是很不错的。今年还出了Cody Precord的《wxPython Cookbook》,也值得一看。

撰写回答