1

我编写了一个非常简单的应用程序,它根据用户输入生成配置文件。然而,数据从 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)
4

3 回答 3

3

重写代码,以便在更改字段时更改配置文件字符串,而不是更改内存中字典的值。然后,让您的 on_commit_clicked 函数使用该字典完全按照您的需要构建配置文件字符串。

于 2012-06-24T22:58:35.100 回答
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:。身份检查比相等检查更有效。

于 2012-06-24T23:14:45.670 回答
1

您需要将数据收集与输出生成分开。想象一下像一个单独的ConfigBuilder类,比如,,telnet_port属性和一个ushare_iface只返回一个生成的字符串 blob 的方法。然后您的方法将只设置以下字段:ushare_dirbuild()builder

def on_servername_activate(self, widget):
    servername = widget.get_text()
    self.builder.ushare_name = servername

当用户单击 Commit 按钮时,您会生成配置并将其写入文件:

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")
于 2012-06-24T22:58:22.560 回答