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

データ収集と出力生成を分離する必要があります。たとえば、、、属性をConfigBuilder持つ別のクラスのようなものと、生成された文字列blobを返すだけのメソッドを想像してみてください。次に、メソッドは:のフィールドを設定するだけです。telnet_portushare_ifaceushare_dirbuild()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")
于 2012-06-24T22:58:22.560 に答える
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正しく書く必要があることに注意する必要があります。IDチェックは、同等性チェックよりも効率的です。is Trueif webif:

于 2012-06-24T23:14:45.670 に答える