如何在wxpython中更新wxStatic文本?

0 投票
1 回答
670 浏览
提问于 2025-04-18 14:08

我一直在尝试更新wxStaticText,但不想让已有的文本重叠。我想我遇到的问题是没有为每个StaticText设置变量名。完整代码在这里: http://pastebin.com/Y5k9qEa8

start=70
for i in newfp:
    #Gets info from website
    wx.StaticText(self.frame,-1,str(newname),pos=(50,start))
    self.static = wx.StaticText(self.frame,-1,price,pos=(250,start)) 
    start+=50

然后我有一个刷新按钮,可以再次运行相同的过程,但如果信息发生变化,就会出现重叠。我需要知道如何确保它不会重叠。提前谢谢大家!期待你们的回答!

1 个回答

2

你需要保存一个引用,然后使用 self.my_static_text.SetLabel("Some New Text!") 来更新文本。

也就是说,

import wx
messages = ["Hello","World","Python"]
a = wx.App(redirect=False)
f = wx.Dialog(None,-1,"Changing Text!")
te = wx.StaticText(f,-1,"Changes!")
btn = wx.Button(f,-1,"Change The Text",pos=(10,25))
btn.Bind(wx.EVT_BUTTON,lambda evt:te.SetLabel(messages.pop(0)) or messages.append(te.GetLabel()))
f.ShowModal()

在你的情况下,你可以保持一个列表。

self.my_items,self.my_prices = [],[]
items = [("item1",50),("item2",75),("item3",88)]
for i,(itemName,itemPrice) in enumerate(items):
    self.my_items.append(wx.StaticText(self.frame,-1,itemName,pos=(50,start+i*50)))
    self.my_prices.append(wx.StaticText(self.frame,-1,itemPrice,pos=(250,start+i*50))) 

这里有一个完整的例子,适合你的情况……这也可以作为你在未来提问时,我们希望看到的可运行示例的参考。

import wx
class MyFrame(wx.Frame):
    def __init__(self,items):
        wx.Frame.__init__(self,None,-1,"Demo")
        self.start_y = 25
        self.my_items,self.my_prices = [],[]
        for i,(iName,iPrice) in enumerate(items):
            self.my_items.append(wx.StaticText(self,-1,iName,pos=(50,self.start_y+50*i)))
            self.my_prices.append(wx.StaticText(self,-1,str(iPrice),pos=(90,self.start_y+50*i)))
        btn = wx.Button(self,-1,"Next Items")
        btn.Bind(wx.EVT_BUTTON,self.OnNext)

    def OnNext(self,evt):
        for t1,t2 in zip(self.my_items,self.my_prices):
            t1.Destroy()
            t2.Destroy()
        self.my_items,self.my_prices = [],[]
        items = itemSets.pop(0)
        for i,(iName,iPrice) in enumerate(items):
            self.my_items.append(wx.StaticText(self,-1,iName,pos=(50,self.start_y+50*i)))
            self.my_prices.append(wx.StaticText(self,-1,str(iPrice),pos=(90,self.start_y+50*i)))
        itemSets.append(items)


itemSets = [
    [("item1",25),("item2",35),("item3",55)],
    [("item3",44),("item4",65),("item5",75)],
    [("item5",66),("item6",78),("item7",93)],
]
a = wx.App(redirect=None)
f = MyFrame([("ItemA",33),("ItemB",44),("ItemC",66)])
f.Show()
a.MainLoop()

撰写回答