我被要求为夏令课制作一个子网扫描仪应用程序。该应用程序是完整的,但它的丑陋,因为代码非常冗长。
这很长,因为应用程序要求要求gui上有8个ip地址,以及是否在该IP上有返回。
由于需要GUI,我创建了一系列静态文本字段来表示它正在扫描的各个IP。
该应用程序有一个扫描仪按钮,一旦按下该按钮并且扫描结算,它将使用适当的值更新电路板。
为了方便起见,我设置了一个全局占位符值,每次需要查看新集时,只增加8。
所以我想做什么
我想创建一个for循环来更新八个字段中每个字段的静态文本,而不必单独编写每个字段。
我的工作如下:
self.XValue0.SetLabel(str(placeholder))
self.XValue1.SetLabel(str(placeholder1))
self.XValue2.SetLabel(str(placeholder2))
self.XValue3.SetLabel(str(placeholder3))
self.XValue4.SetLabel(str(placeholder4))
self.XValue5.SetLabel(str(placeholder5))
self.XValue6.SetLabel(str(placeholder6))
self.XValue7.SetLabel(str(placeholder7))
XValue是指192.168.1.X,其中X是要改变的值,因为无论如何,子网的第一部分保持不变。
带有数字的占位符引用一个全局值,该值将数字(1-7)添加到占位符以填充该字段。
例如,如果GUI从192.168.1.0开始,它将填充到192.168.1.7并显示该范围内所有位置的是或否。
我想做的是与此类似的事情:
for x in range(0,7):
PlaceholderValue = str(placeholder + x)
XValue = 'XValue' + PlaceholderValue
self.XValue.setLabel(PlaceholderValue)
然而,当我这样做时,控制台给我一个错误,说它找不到“XValue”。
我的问题是这个。有没有办法按照我想要的方式使循环工作,或者是否必须根据我的编写方式使用更长的代码。谢谢大家。对不起,很长的帖子,这是我潜伏多年后的第一个问题。如果您需要更多信息,请告诉我。
答案 0 :(得分:0)
创建静态文本对象时,将引用保存在列表中以及(或代替)XValue属性。
self.XValues = []
for x in range(8):
self.XValues.append(wx.StaticText(...))
然后它可以更容易循环并稍后更新
for i, xvalue in enumerate(self.XValues):
xvalue.SetLabel(placeholder + i)
您仍然可以单独访问标签,例如访问之前的XValue4
,您可以self.XValues[4]
。
此外,您可以像尝试一样完成此操作,但您需要使用getattr
动态获取对象的属性,但最好不要将标签存储在列表中。
for x in range(8):
PlaceholderValue = str(placeholder + x)
XValue = 'XValue' + PlaceholderValue
getattr(self, XValue).setLabel(PlaceholderValue)