我编写了一个非常简单的应用程序,它基于用户输入生成配置文件。但是,将数据从StringIO转储到实际conf文件中的顺序对于使用该文件的程序很重要。我在代码中解决这个问题的方法是从上到下的数据输入模型。但是,如果用户不按顺序输入数据,这将导致程序失败或生成的conf文件将变得无用。有没有办法重新调整随机数据输入顺序并确保StringIO的数据按特定顺序插入?
目前代码看起来像这样(它已经到了这个阶段,你们的帮助很多!)
self.output = StringIO.StringIO()
context = self.toolbar.get_style_context()
context.add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR)
def on_servername_activate(self, widget):
output = StringIO.StringIO()
servername = widget.get_text()
self.output.write("USHARE_NAME="+servername+'\n')
def on_netif_changed(self, widget):
netif = widget.get_active_text()
self.output.write("USHARE_IFACE="+netif+'\n')
def on_port_activate(self, widget):
port = widget.get_text()
self.output.write("USHARE_PORT="+port+'\n')
def on_telprt_activate(self, widget):
telprt = widget.get_text()
self.output.write("USHARE_TELNET_PORT="+telprt+'\n')
def on_dirs_activate(self, widget):
dirs = widget.get_text()
self.output.write("USHARE_DIR="+dirs+'\n')
def on_iconv_toggled(self, widget):
iconv = widget.get_active()
if iconv == True:
self.output.write("USHARE_OVERRIDE_ICONV_ERR="+"True"+'\n')
else:
self.output.write("USHARE_OVERRIDE_ICONV_ERR="+"False"+'\n')
def on_webif_toggled(self, widget):
webif = widget.get_active()
if webif == True:
self.output.write("USHARE_ENABLE_WEB="+"yes"+'\n')
else:
self.output.write("USHARE_ENABLE_WEB="+"no"+'\n')
def on_telif_toggled(self, widget):
telif = widget.get_active()
if telif == True:
self.output.write("USHARE_ENABLE_TELNET="+"yes"+'\n')
else:
self.output.write("USHARE_ENABLE_TELNET="+"no"+'\n')
def on_xbox_toggled(self, widget):
xbox = widget.get_active()
if xbox == True:
self.output.write("USHARE_ENABLE_XBOX="+"yes"+'\n')
else:
self.output.write("USHARE_ENABLE_XBOX="+"no"+'\n')
def on_dlna_toggled(self, widget):
dlna = widget.get_active()
if dlna == True:
self.output.write("USHARE_ENABLE_DLNA="+"yes"+'\n')
else:
self.output.write("USHARE_ENABLE_DLNA="+"no"+'\n')
def on_commit_clicked(self, widget):
commit = self.output.getvalue()
logfile = open('/home/boywithaxe/Desktop/ushare.conf','w')
logfile.write(commit)
def on_endprogram_clicked(self, widget):
sys.exit(0)
答案 0 :(得分:3)
重写代码,以便在更改字段时不是编写配置文件字符串,而是更改内存中dictionary的值。然后,让你的on_commit_clicked函数使用该字典来完全按照你的需要构建配置文件字符串。
答案 1 :(得分:1)
您需要将数据收集与输出生成分开。想象一下类似于单独的ConfigBuilder
类,例如telnet_port
,ushare_iface
,ushare_dir
属性和build()
方法,它只返回生成的字符串blob。然后,您的方法只会设置builder
:
def on_servername_activate(self, widget):
servername = widget.get_text()
self.builder.ushare_name = servername
当用户点击“提交”按钮时,您将生成配置并将其写入文件:
def on_commit_clicked(self, widget):
logfile = open('/home/boywithaxe/Desktop/ushare.conf','w')
logfile.write(self.builder.build())
如果您不想拥有单独的Builder类,只需在字典甚至窗口类的成员字段中收集输入数据即可:
class MyApp(...):
ushare_name = None
... more fields to store user input
def can_build(self):
if self.ushare_name and
self.ushare_xxx and
self.ushare_yyy and
self.phase_of_moon_is_right():
return True
return False
def build_config(self):
return "BLAH =" + self.ushare_name + ...
def on_servername_activate(self, widget):
servername = widget.get_text()
self.ushare_name = servername
def on_commit_clicked(self, widget):
if self.can_build():
logfile = open('/home/boywithaxe/Desktop/ushare.conf','w')
logfile.write(self.build_config())
else:
display_some_warning_message("Data incomplete, the commit button should've been hidden/disabled so the user can't click until the app has all data it needs")
答案 2 :(得分:1)
装饰需要它的每个函数(一个简单的方法,它接受一个小部件并返回一个合适的 - 或者可能是一个类装饰器,闪电战的'on_ *'方法) - 你有很多重复并且装饰器附加到一个列表或其他东西。
def on_webif_toggled(self, widget):
webif = widget.get_active()
if webif == True:
self.output.write("USHARE_ENABLE_WEB="+"yes"+'\n')
else:
self.output.write("USHARE_ENABLE_WEB="+"no"+'\n')
我应该注意== True
应该正确写为is True
或if webif:
。身份检查比同等检查更有效。