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)