1

私は(Pythonで)プログラムを作成しようとしていますが、それを書き込むとファイルに書き込み、すでに作成した特定のウィンドウが開きます。唯一のオプション。

オプションの自動実行が「アクティブ化」されると、次のようになることを期待していました。

while 1:
    wbuffer = textview.get_buffer()
    text = wbuffer.get_text(wbuffer.get_start_iter(), wbuffer.get_end_iter())
    openfile = open(filename,"w")
    openfile.write(text)
    openfile.close() 

私はpygtkを使用していて、textviewウィンドウがありますが、バッファーを取得すると、それは永久に残ります。私はそれをマルチスレッド化してキューに入れる必要があると考えています。そうすれば、キューに入れられている間に1つのスレッドがバッファーに書き込みます。

私の情報源はここにあります。(ステートメントは177行目にあると思います。)

どんな助けでも大歓迎です。:)

そしてここに機能があります:

def autorun(save):
    filename = None
    chooser = gtk.FileChooserDialog("Save File...", None,
                                    gtk.FILE_CHOOSER_ACTION_SAVE,
                                    (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                                     gtk.STOCK_SAVE, gtk.RESPONSE_OK))

    response = chooser.run()
    if response == gtk.RESPONSE_OK: filename = chooser.get_filename()
    filen = filename
    addr = (filename)
    addressbar.set_text("file://" + filename)
    web.open(addr)
    chooser.destroy()
    wbuffer = textview.get_buffer()
    while 1:
      text = wbuffer.get_text(wbuffer.get_start_iter(), wbuffer.get_end_iter())
      time.sleep(1)
      openfile = open(filename,"w")
      openfile.write(text)
      openfile.close()  
4

1 に答える 1

0

ここに含まれていないGTKのものが何をしているのかを正確に確認するのは簡単ではありませんが、主な問題は、コントロールをgtkメインループに戻す必要があることです。そうしないと、プログラムがハングします。

したがって、長いプロセス(ここではこの永遠のプロセスのように)がある場合は、それをスレッド化する必要があります。問題は、メインプログラムが終了したときにスレッドを適切に終了する必要があるため、その周りを少し再設計する必要があることです。また、gtkを使用したスレッド化は正しく初期化する必要があります(ここを参照)。

ただし、スレッド化は必要ないと思います。代わりに、ユーザーのchangedシグナルをTextBufferターゲットファイルにバッファーを書き込む関数に接続できます(ユーザーがプログラムをモードにした場合autorun)。これに伴う問題は、バッファが大きくなったり、プログラムが遅くなったりする場合です。その場合は、changedシグナルのコールバックをスレッド化することを検討する必要があります。したがって、このソリューションでは、ユーザーがコンピューターの保存よりも入力が速いため、保存要求が互いに積み重なる状況にならないようにする必要があります。いくつかの設計思想を取ります。

したがって、最後に、より簡単な解決策です。ボタンを押すたびにバッファを保存したくない場合があります。その場合、代わりに、タイムアウト時にsave関数(ループのない最初のコードブロックのように見える可能性があります)を使用できます。タイムアウトを短くしすぎないでください。

于 2012-12-30T02:01:50.393 に答える