gpt4 book ai didi

python - 使用 wxPython 中的线程更新 GUI 中面板的标签

转载 作者:行者123 更新时间:2023-12-01 05:21:45 25 4
gpt4 key购买 nike

级别:初级

我使用的是 python v2.7 和 wxPython v3.0,操作系统是 windows 7。

我的 GUI 应用程序:在我的 GUI 应用程序中,我正在从服务器读取一些值,然后根据这些值的数量在 GUI 中创建面板。然后每个面板都将以 staticText 的形式表示值。 。例如:如果我从服务器收到 1,2,3 值,那么我将创建 3 面板,每个面板显示 12分别为3。到这里为止一切正常。

问题:我想每 5 秒检查一次服务器以获取值并相应地更新我的 GUI。我必须更新staticText面板上显示更新的值。我不想添加新面板,我只想更新旧面板中的值。

例如:如果我检查服务器并且服务器返回 123 作为值,然后我想创建分别显示 123 值的 3 面板。然后 5 秒后,当我再次检查服务器时,如果服务器给出 456 作为值,那么我只想更新这些值在旧面板上。这意味着现在面板将显示 456 而不是 12 3。我在 SC 上阅读了一些关于使用线程的教程和帖子,我也了解了一些基本事实。不幸的是,我不明白如何将这个概念应用于我的问题。如果我能为我的这个特定问题找到一个有效的示例,以便我可以将其应用到应用程序的其余部分,那就太好了。

代码:我为这个特定问题创建了一个简短的示例代码。 getLabels()class labelsAgetLabels()在类里面labelsB通过生成一些随机值并将它们返回到列表中来模仿服务器。然后 getLabels() 返回的值列表class labelA的以及 getLabels() 返回的值列表class labelsB的由 createPanels()A 使用和createPanelsB()分别创建面板并显示这些值。白色背景的面板是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 秒从某处获取信息,还展示了如何根据需要创建静态文本以及如何更新它们。

#!/usr/bin/env python

from random import randrange
import wx
import wx.lib.scrolledpanel

import time
import threading
from wx.lib.pubsub import setupkwargs
from wx.lib.pubsub import pub

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')
panel.SetSizer(sizer)
mainSizer.Add(panel, 15, wx.EXPAND|wx.ALL)
self.SetSizer(mainSizer)

self.text_labels = [] # Stores the labels where server data is displayed

pub.subscribe(self.OnNewLabels, "NEW_LABELS")


def OnNewLabels(self, labels):
locations = labels
print locations
if len(self.text_labels) < len(labels):
new_labels_needed = len(labels) - len(self.text_labels)
label = "(no data)"
for i in range(new_labels_needed):
sPanels = wx.Panel(self.panel)
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)
self.text_labels.append(text)
self.sizer.Layout()
k = 0
for label in locations:
self.text_labels[k].SetLabel(str(label))
k=k+1


###############################
#
#

def InterfaceThread():
while True:
# get the info from the server
mylist =[]
i = randrange(10)
for k in range(1,i+1):
mylist.append(randrange(10))

# Tell the GUI about them
wx.CallAfter(pub.sendMessage, "NEW_LABELS", labels = mylist)
time.sleep(5)


class ServerInterface():

def __init__(self):
interface_thread = threading.Thread(target = InterfaceThread, args = ())
interface_thread.start()



#############
#

if __name__=='__main__':
app = wx.App()
frame = GUI(parent=None, id=-1, title="Test")
frame.Show()
server_interface = ServerInterface()
app.MainLoop()

关于python - 使用 wxPython 中的线程更新 GUI 中面板的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22176863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com