WxPython面板刷新

2024-10-01 07:45:49 发布

您现在位置:Python中文网/ 问答频道 /正文

不幸的是,由于其庞大且依赖于许多其他东西,我无法发布适当的代码供大家测试,因此提前向您道歉

因此,总体思路是我有一个面板,它显示来自日志的信息(一个名为dictCRDict)。这个日志保存了过去的修订,我希望用户能够选择他们查看的版本。所以我将整个设置(基于self.CRDict中的内容创建和填充sizer)移动到一个名为Display()的函数中。此函数设置一个下拉列表并将其绑定到一个函数OnRevDrop(),该函数允许用户选择要显示的修订。函数OnRevDrop()决定由哪个函数将self.CRDict分配给dict,它保存所选修订的信息。在

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

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

提前谢谢


好吧,工作代码!在

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.Display()
        self.revDrop.SetValue("3")


    def Display(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)

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

        self.staticbox1.Add(infoA, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP|wx.BOTTOM, border=10)
        self.staticbox1.Add(infoB, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.TOP|wx.BOTTOM, border=10)
        self.staticbox1.Add(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 OnRevDrop(self, event):
        rev = self.revDrop.GetValue()
        print rev
        self.CRDict = RevHist[rev]

        self.Display()


app = wx.PySimpleApp()
gui = TestGui()
gui.Show()
app.MainLoop()

Tags: 函数用户selfrightaddtopleftflag
1条回答
网友
1楼 · 发布于 2024-10-01 07:45:49

问题是每次都要创建新的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()

虽然我喜欢创造一个混合体

^{pr2}$

你需要吸气剂

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)

相关问题 更多 >