等级:初级
我使用的是pythonv2.7和wxpythonv3.0,操作系统是windows7。在
我的GUI应用程序:在我的GUI应用程序中,我从服务器读取一些值,然后根据这些值的数量在GUI中创建面板。然后每个面板将以staticText
的形式表示值。例如:如果我从服务器接收到1,2,3值,那么我创建3面板,每个面板分别显示1,2和3。到这里为止还不错。在
问题:我想每5秒检查一次服务器以获取值并相应地更新我的GUI ie。我必须更新面板上的staticText
以显示更新的值。我不想添加新面板我只想更新旧面板中的值。在
例如:如果我检查服务器,如果服务器返回1,2,3作为值,那么我想创建3面板,分别显示1,2,3值。5秒钟后,当我再次检查服务器时,如果服务器给出4,5,6作为值,那么我只想更新旧面板上的这些值。这意味着现在面板将分别显示4,5,6,而不是1,2,3。我读了一些关于使用线程的教程和帖子,我也理解了一些基本的事实。不幸的是,我不知道如何把这个概念应用到我的问题上。 如果我能为我的这个特殊问题找到一个有效的例子,这样我就可以把同样的方法应用到我的应用程序的其余部分,那就太好了。在
代码:我为这个特定问题创建了一个简短的示例代码。class labelsA
中的getLabels()
和类labelsB
中的{class labelA
的getLabels()
返回的值列表和class labelsB
的{createPanels()A
和{panelA
,黄色背景的面板是panelB
。如果有人能教我如何使用线程来更新这两个面板的值而不冻结/阻塞我的GUI,那就太好了。在
下载:下面提供了示例代码,可以downloaded from here来避免标识问题。在
#!/usr/bin/env python
from random import randrange
import wx
import wx.lib.scrolledpanel
class GUI(wx.Frame):
def __init__(self, parent, id, title):
screenWidth = 800
screenHeight = 450
screenSize = (screenWidth, screenHeight)
wx.Frame.__init__(self, None, id, title, size=screenSize)
self.locationFont = locationFont = wx.Font(15, wx.MODERN, wx.NORMAL, wx.BOLD)
mainSizer = wx.BoxSizer(wx.HORIZONTAL)
panelSizer = wx.BoxSizer(wx.HORIZONTAL)
self.sizerA = sizerA = wx.BoxSizer(wx.VERTICAL)
self.panelA = panelA = wx.lib.scrolledpanel.ScrolledPanel(self, -1, style=wx.SIMPLE_BORDER)
panelA.SetupScrolling()
panelA.SetBackgroundColour('#FFFFFF')
self.sizerB = sizerB = wx.BoxSizer(wx.VERTICAL)
self.panelB = panelB = wx.lib.scrolledpanel.ScrolledPanel(self, -1, style=wx.SIMPLE_BORDER)
panelB.SetupScrolling()
panelB.SetBackgroundColour('#FFF000')
panelA.SetSizer(sizerA)
panelB.SetSizer(sizerB)
mainSizer.Add(panelA, 15, wx.EXPAND|wx.ALL)
mainSizer.Add(panelB, 15, wx.EXPAND|wx.ALL)
self.SetSizer(mainSizer)
self.createPanelsA()
self.createPanelsB()
def createPanelsA(self):
k = 0
labelObj = labelsA()
locations = labelObj.getLabel()
print locations
for i in locations:
sPanels = 'sPanel'+str(k)
sPanels = wx.Panel(self.panelA)
label = str(k+1)
text = wx.StaticText(sPanels, -1, label)
text.SetFont(self.locationFont)
text.SetForegroundColour('#0101DF')
self.sizerA.Add(sPanels, 0, wx.ALL, 5)
self.sizerA.Add(wx.StaticLine(self.panelA), 0, wx.ALL|wx.EXPAND, 0)
k += 1
def createPanelsB(self):
k = 0
labelObj = labelsB()
locations = labelObj.getLabel()
print locations
for i in locations:
sPanels = 'sPanel'+str(k)
sPanels = wx.Panel(self.panelB)
label = str(k+1)
text = wx.StaticText(sPanels, -1, label)
text.SetFont(self.locationFont)
text.SetForegroundColour('#0101DF')
self.sizerB.Add(sPanels, 0, wx.ALL, 5)
self.sizerB.Add(wx.StaticLine(self.panelB), 0, wx.ALL|wx.EXPAND, 0)
k += 1
################################################
class labelsA():
def getLabel(self):
mylist =[]
i = randrange(10)
for k in range(1,i+1):
mylist.append(k)
return mylist
###############################################
class labelsB():
def getLabel(self):
mylist =[]
i = randrange(10)
for k in range(1,i+1):
mylist.append(k)
return mylist
###############################################
if __name__=='__main__':
app = wx.App()
frame = GUI(parent=None, id=-1, title="Test")
frame.Show()
app.MainLoop()
非常感谢您抽出时间。任何帮助都将不胜感激。在
这里演示了如何创建一个线程来每隔5秒从某个地方获取信息,还演示了如何根据需要创建statictext,以及如何更新它们。在
据我所知,这个问题早就有人回答了,同样的结果也可以用简单的方法来实现wx定时器.
使用上面提供的代码:
相关问题 更多 >
编程相关推荐