我被要求为暑期课程制作一个子网扫描程序。这个应用程序是完整的,但它丑陋得像罪恶,因为代码非常长。
它很长,因为应用程序要求一个带有8个ip地址的gui,以及该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"。
我的问题是。有没有一种方法可以让for循环按我想要的方式工作,或者它是基于我写它的方式而必要的更长的代码。谢谢大家。很抱歉发了这么长的帖子,这是我潜伏多年后的第一个问题。如果你们还需要更多信息,请告诉我。
创建静态文本对象时,将引用以及(或代替)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)