【发布时间】:2014-03-03 11:43:16
【问题描述】:
级别:初学者
我已经使用 wxPython 一个月了。我几乎完全使用了我的 GUI 应用程序,但是在线程方面我被卡住了。我正在使用 python v2.7 和 wxPython v3.0,操作系统是 windows 7。
我的 GUI 应用程序:在我的 GUI 应用程序中,我从服务器读取一些值,然后根据这些值的数量在我的 GUI 中创建面板。然后这些面板中的每一个都将以staticText 的形式表示值。例如:如果我从服务器接收 1,2,3 值,那么我创建 3 面板,每个面板显示 1、2 和 3 分别。到这里一切正常。
问题:我想每 5 秒检查一次服务器以获取值并相应地更新我的 GUI,即。我必须添加新面板来显示新值。我在 SC 上阅读了一些关于使用线程的教程和帖子,我也了解了一些基本事实。不幸的是,我不明白如何将这个概念应用于我的问题。我想我必须将检查来自服务器的值的代码放在线程循环中。但我不明白还能做什么。我想我可能必须更改代码的逻辑(创建面板部分)才能使用线程。 如果我能为我的这个特定问题找到一个工作示例,这样我就可以将其应用于我的其余应用程序,那将是非常棒的。
代码:我为这个特定问题创建了一个简短的示例代码。 class labels 中的 getLabels() 通过生成一些随机值并将它们返回到列表中来模仿服务器。然后createPanels() 使用这些值来创建面板并显示这些值。如果有人能教我如何使用线程将新面板添加到我的 GUI 而不会冻结/阻塞我的 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.VERTICAL)
self.sizer = sizer = wx.BoxSizer(wx.VERTICAL)
self.panel = panel = wx.lib.scrolledpanel.ScrolledPanel(self, -1, style=wx.SIMPLE_BORDER)
panel.SetupScrolling()
panel.SetBackgroundColour('#FFFFFF')
self.createPanels()
panel.SetSizer(sizer)
mainSizer.Add(panel, 15, wx.EXPAND|wx.ALL)
self.SetSizer(mainSizer)
def createPanels(self):
k = 0
labelObj = labels()
locations = labelObj.getLabel()
print locations
for i in locations:
sPanels = 'sPanel'+str(k)
sPanels = wx.Panel(self.panel)
label = str(k+1)
text = wx.StaticText(sPanels, -1, label)
text.SetFont(self.locationFont)
text.SetForegroundColour('#0101DF')
self.sizer.Add(sPanels, 0, wx.ALL, 5)
self.sizer.Add(wx.StaticLine(self.panel), 0, wx.ALL|wx.EXPAND, 0)
k += 1
################################################
class labels():
def getLabel(self):
mylist =[]
i = randrange(10)
for k in range(1,i+1):
list.append(k)
return mylist
###############################################
if __name__=='__main__':
app = wx.App()
frame = GUI(parent=None, id=-1, title="Test")
frame.Show()
app.MainLoop()
如果执行代码后没有看到任何面板,请重新执行代码。
感谢您的宝贵时间。
【问题讨论】:
标签: python multithreading python-2.7 user-interface wxpython