2017-03-01 77 views
1

我想更新面板“标签”,但我认为我错了刷新/更新/删除方法。wxPython:使用GridBagSizer更新面板上的标签和定时器

我写了2个python文件,“WriteData.py”会自动更新一个txt文件,而“Main.py”想要显示wx.panel上的txt值。

我同时运行2个python文件,使用Timer每3秒自动更新一次数据。

我使用GridBagSizer希望安排这些面板位置。

但我不知道该如何安排新的更新面板位置,也不知道如何删除以前的面板

希望你给我一些建议,甚至指出我的错误。 我也很感激这个代码!

这里是 “Main.py”

import wx 
import time 

def ReadData(): 
    with open('RealTime.txt') as f: 
     for line in f: 
      data = line.split() 
    results = map(float, data) 
    return results 

class BlockWindow(wx.Panel): 
    # code on book "wxPython in action" Listing 11.1 
    def __init__(self, parent, ID=-1, label="", 
       pos = wx.DefaultPosition, size = (100, 25)): 
     wx.Panel.__init__(self, parent, ID, pos, size, 
          wx.RAISED_BORDER, label) 
     self.label = label 

     self.SetMinSize(size) 
     self.Bind(wx.EVT_PAINT, self.OnPaint) 
    def OnPaint(self, evt): 
     sz = self.GetClientSize() 
     dc = wx.PaintDC(self) 
     w,h = dc.GetTextExtent(self.label) 
     dc.SetFont(self.GetFont()) 
     dc.DrawText(self.label, (sz.width-w)/2, (sz.height-h)/2) 


class MyPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent, size=(0,0)) 

     self.timer = wx.Timer(self) 
     self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer) 
     self.timer.Start(3000) 

    def OnTimer(self, evt): 
     Data = ReadData() 
     sizer = wx.GridBagSizer(hgap=5, vgap=-1) 

     bw = BlockWindow(self, label="Item 1") 
     sizer.Add(bw, pos=(4, 2)) 
     #bw.Refresh() 

     bw = BlockWindow(self, label="Updated : %.3f" % Data[0]) 
     sizer.Add(bw, pos=(5, 2)) 
     bw.Refresh()   
     #bw.Update(self, label ="Updated : %.3f" % Data[0]) 

     mainSizer = wx.BoxSizer(wx.VERTICAL) 
     mainSizer.Add(sizer, 0, wx.EXPAND|wx.ALL, 10) 

     self.SetSizer(mainSizer) 
     self.Fit() 

class MyFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, title=' Frame Title') 
     mypanel = MyPanel(self) 
     self.SetSize(wx.Size(800,600)) 
     self.Centre() 

app = wx.App(False) 
MyFrame().Show() 
app.MainLoop() 

这里是 'WriteData.py',

import sched, time 
from datetime import datetime as dt 

data = ['5.564', '3.4', '2.176', '7.3', '4.4', '5.5', '2.3', '4.4', '5.1'] 

index = 0 

while True: 
    start = dt.now().hour 
    stop = dt.now().hour + 1 
    if index >7 : index=1 
    if dt.now().hour in range(start, stop): # start, stop are integers (eg: 6, 9) 
     # call to your scheduled task goes here 
     f2 = open('RealTime.txt', 'w') 
     f2.write("%s " % data[index]) 
     index = index + 1 
     f2.close() 

     time.sleep(3) 
    else: 
     time.sleep(3) 

当我运行2 .py文件,我得到了这个情况运行例子

希望大家帮我解决这个问题。 我在win10上使用python2.7。 此致敬礼Tang Tangod

回答

0

每次需要更新时,您都不需要重新创建从头开始的所有内容。你只需要移动初始化代码(创建BlockWindow和sizer到MyPanel的构造函数就可以了。看起来你想要做的就是更新第二个面板的标签,为了达到这个目的,你可以在BlockWindow中编写一个方法来更新标签和呼叫Refresh使OnPaint将被触发,将完成剩余的工作。

class BlockWindow(wx.Panel): 
    # code on book "wxPython in action" Listing 11.1 
    def __init__(self, parent, ID=-1, label="", 
       pos = wx.DefaultPosition, size = (100, 25)): 
     wx.Panel.__init__(self, parent, ID, pos, size, 
          wx.RAISED_BORDER, label) 
     self.label = label 

     self.SetMinSize(size) 
     self.Bind(wx.EVT_PAINT, self.OnPaint) 
    def OnPaint(self, evt): 
     sz = self.GetClientSize() 
     dc = wx.PaintDC(self) 
     w,h = dc.GetTextExtent(self.label) 
     dc.SetFont(self.GetFont()) 
     dc.DrawText(self.label, (sz.width-w)/2, (sz.height-h)/2) 

    def UpdateLabel(self, label): 
     self.label = label 
     self.Refresh() 

class MyPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent, size=(0,0)) 

     sizer = wx.GridBagSizer(hgap=5, vgap=-1) 
     bw = BlockWindow(self, label="Item 1") 
     sizer.Add(bw, pos=(4, 2)) 

     self.block = BlockWindow(self, label="") 
     sizer.Add(self.block, pos=(5, 2)) 

     mainSizer = wx.BoxSizer(wx.VERTICAL) 
     mainSizer.Add(sizer, 0, wx.EXPAND|wx.ALL, 10) 

     self.SetSizer(mainSizer) 
     self.Fit() 

     self.timer = wx.Timer(self) 
     self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer) 
     self.timer.Start(3000) 

    def OnTimer(self, evt): 
     Data = ReadData() 
     self.block.UpdateLabel("Updated : %.3f" % Data[0]) 
+0

非常感谢你! 你的答案真的教我如何正确使用刷新()和定时器,甚至教我改善我的BlockWindow的方法。 你的代码很干净而且很有帮助! –