WxPython面板刷新

WxPython面板刷新,python,wxpython,Python,Wxpython,不幸的是,因为它庞大而且依赖于很多其他东西,我无法发布合适的代码供大家测试,所以提前表示歉意 因此,一般的想法是,我有一个显示日志信息的面板(称为CRDict)。此日志保存过去的修订,我希望用户能够选择他们查看的修订。因此,我将整个设置(根据self.CRDict中的内容创建和填充尺寸器)移动到一个名为Display()的函数中。此函数设置下拉列表并将其绑定到函数OnRevDrop(),该函数允许用户选择要显示的修订。函数OnRevDrop()决定将self.CRDict指定为保存所选修订信息的

不幸的是,因为它庞大而且依赖于很多其他东西,我无法发布合适的代码供大家测试,所以提前表示歉意

因此,一般的想法是,我有一个显示日志信息的面板(称为
CRDict
)。此日志保存过去的修订,我希望用户能够选择他们查看的修订。因此,我将整个设置(根据
self.CRDict
中的内容创建和填充尺寸器)移动到一个名为
Display()
的函数中。此函数设置下拉列表并将其绑定到函数
OnRevDrop()
,该函数允许用户选择要显示的修订。函数
OnRevDrop()
决定将
self.CRDict
指定为保存所选修订信息的
dict

问题是它只工作一次。用户打开面板,显示当前版本,用户选择不同的版本,面板刷新并显示所选版本的信息,然后用户选择另一个版本,并中断,给出一个
键错误
。错误是因为在下拉列表中调用
GetValue()
函数返回空字符串。这是我问题的根源,尽管我不知道如何解决它

有人知道为什么会发生这种情况吗

提前谢谢


好的,工作代码!
问题在于,您每次都在创建新的GUI元素,而不是简单地更新原始GUI元素

import wx
from wx.lib.scrolledpanel import ScrolledPanel 

rev1 = {"A": "a", "B": "b", "C": "c"}
rev2 = {"A": "d", "B": "e", "C": "f"}
rev3 = {"A": "g", "B": "h", "C": "i"}

RevHist = {"1":rev1, "2":rev2, "3":rev3}


class TestGui(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Hey, a GUI!", size=(400,400)) 
        self.panel = ScrolledPanel(parent=self, id=-1) 

        self.revsList = sorted(RevHist.keys())
        self.CRDict = rev3 

        self.CreateGui()
        self.revDrop.SetValue("3")


    def CreateGui(self):
        crrev = wx.StaticText(self.panel, -1, "Revision:")
        self.revDrop = wx.ComboBox(self.panel, choices=self.revsList, style = wx.CB_READONLY)
        self.Bind(wx.EVT_COMBOBOX, self.OnRevDrop, self.revDrop)

        hboxRev = wx.BoxSizer(wx.HORIZONTAL)
        hboxRev.Add((20,20), 1)
        hboxRev.Add(crrev)
        hboxRev.Add((0,0), 1)
        hboxRev.Add(self.revDrop)
        hboxRev.Add((20,20), 1)

        sbox1 = wx.StaticBox(self.panel, wx.ID_ANY, u"Here's where the information goes")
        sbox1.SetFont(wx.Font(9, wx.SWISS, wx.NORMAL, wx.BOLD))
        self.staticbox1 = wx.StaticBoxSizer(sbox1, wx.VERTICAL)

        self.infoA = wx.StaticText(self.panel, -1, "A: {0}".format(self.CRDict["A"]))
        self.infoB = wx.StaticText(self.panel, -1, "B: {0}".format(self.CRDict["B"]))
        self.infoC = wx.StaticText(self.panel, -1, "C: {0}".format(self.CRDict["C"]))

        self.staticbox1.Add(self.infoA, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP|wx.BOTTOM, border=10)
        self.staticbox1.Add(self.infoB, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP|wx.BOTTOM, border=10)
        self.staticbox1.Add(self.infoC, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP|wx.BOTTOM, border=10)

        self.vbox = wx.BoxSizer(wx.VERTICAL)
        self.vbox.Add(hboxRev, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP|wx.BOTTOM, border=10)    
        self.vbox.Add(self.staticbox1, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP|wx.BOTTOM, border=10) 
        self.panel.SetSizer(self.vbox)
        self.panel.Layout()
    def UpdateValues(self,valueDict):
        for k,v in valueDict.items():
             if hasattr(self,"info{0}".format(k)):
                  getattr(self,"info{0}".format(k)).SetLabel(v)
    def OnRevDrop(self, event):
        event.Skip()
        rev = self.revDrop.GetValue()
        print rev
        self.CRDict = RevHist[rev]

        self.UpdateValues(self.CRDict )


app = wx.PySimpleApp()
gui = TestGui()
gui.Show()
app.MainLoop()
虽然对于像这样的东西,我喜欢创建一个混音

class EasyWidgetUpdater:
     widgets = {}
     def SetValue(self,valueDict):
         for k,v in valueDict.items():
             if k in self.widgets:
                   set_widget_value(self.widgets[k],v)
     def GetValue(self):
         result = {}
         for k,widget in self.widgets:
             result[k] = get_widget_value(widget)
         return result
你需要能手和二传手

def get_widget_value(widget):
    if isinstance(widget,wx.TextCtrl):
       return widget.GetLabel()
    if hasattr(widget,"GetValue"):
       return widget.GetValue()
    raise Exception,"Unknown Widget {0}".format(widget)

def set_widget_value(widget,value):
    if isinstance(widget,wx.TextCtrl):
       return widget.SetLabel(value)
    if hasattr(widget,"SetValue"):
       return widget.SetValue(value)
    raise Exception,"Unknown Widget {0}".format(widget)
然后你就可以做类似的事情了

class WidgetFrame(wx.Frame,EasyWidgetUpdater):
     def __init__(self,*args,**kwargs):
         wx.Frame.__init__(self,*args,**kwargs)
         sz = wx.BoxSizer()
         sz.Add(self.CreateGUI())
         self.SetSizer(sz)
         self.Layout()
         self.Fit()
      def CreateGUI(self):
         return wx.BoxSizer()

 class TestGui(WidgetFrame):
      def CreateGui(self):
          self.panel = ScrolledPanel(parent=self, id=-1) 
          self.widgets['revision'] = wx.ComboBox(self,-1,choices=[...])
          self.widgets['infoA'] = wx.Label(self,-1,"asdasd")
          ....
          return self.panel
      def OnRevDrop(self,evt):
          CRDict = RevHist[self.GetValue()['revision']]
          self.SetValue(CRDict)

我会检查“rev”中是否有任何内容。如果没有,那么就不要尝试加载dict。@MikeDriscoll这就是问题所在,
rev
在不应该为空时为空。我可以处理错误,这样它就不会破坏代码,但它仍然不会像我希望的那样工作,以显示问题的某种形式的功能示例。。。否则你将很难得到一份工作answer@wnnmaw-组合框中是否有空项?如果是这样,那么只需在rev=”时返回即可。否则,您需要创建一个小的、可运行的示例来演示这个问题()@MikeDriscoll我添加了一个工作测试用例
class WidgetFrame(wx.Frame,EasyWidgetUpdater):
     def __init__(self,*args,**kwargs):
         wx.Frame.__init__(self,*args,**kwargs)
         sz = wx.BoxSizer()
         sz.Add(self.CreateGUI())
         self.SetSizer(sz)
         self.Layout()
         self.Fit()
      def CreateGUI(self):
         return wx.BoxSizer()

 class TestGui(WidgetFrame):
      def CreateGui(self):
          self.panel = ScrolledPanel(parent=self, id=-1) 
          self.widgets['revision'] = wx.ComboBox(self,-1,choices=[...])
          self.widgets['infoA'] = wx.Label(self,-1,"asdasd")
          ....
          return self.panel
      def OnRevDrop(self,evt):
          CRDict = RevHist[self.GetValue()['revision']]
          self.SetValue(CRDict)