1

selection_changed を FileChooserButton の関数に接続すると、奇妙な動作が発生します。SOユーザーの助けを借りて 、selection_changed 構文を理解できるようになりました。しかし、同じプログラムで 2 回目に使用すると、奇妙なことが起こります。

環境

私の目的は、ウィンドウの終了位置に 2 つの FileChooserButtons と Entry テキストを持つウィンドウを作成することです。最初の FileChooserButton は、ユーザーがディレクトリを選択するのに役立ち、ユーザーが最初のディレクトリで選択したディレクトリで 2 番目の FileChooserButton を開きます。この時点まで、コードは完全に機能しています。エントリも適切に描画され、「ここにファイル名が入ります」と表示されます。意図した動作は、ファイルが書き込み可能かどうかを確認した後、2 番目の FileChooserButton でファイル名を選択すると、エントリのテキストを変更することです。

私が使用した戦略は、selection_changed を、ファイルが書き込み可能かどうかのチェックとエントリのテキストの変更を処理する関数に接続することでした。

問題は、関数が呼び出されないことです。次のようなデバッグ用のダム コードを追加しました。

stdout.printf("Checking whether this function is actually called")

印刷されないため、関数が呼び出されることはないと思います。問題の関数は、以下の file_changed です。

[indent=4]
uses
    Gtk

class TestWindow:Window
    _file_chooser:FileChooserButton
    _entry:Gtk.Entry

    construct()

        title = "File chooser"
        window_position = WindowPosition.CENTER
        destroy.connect( Gtk.main_quit )

        var folder_chooser = new FileChooserButton("Choose a Folder",FileChooserAction.SELECT_FOLDER)
        folder_chooser.set_current_folder( Environment.get_home_dir() )
        folder_chooser.selection_changed.connect( folder_changed )

        _file_chooser = new FileChooserButton("Choose a File",FileChooserAction.OPEN)
        _file_chooser.set_current_folder( Environment.get_home_dir() )

        _file_chooser.selection_changed.connect( file_changed )
        var _entry = new Gtk.Entry()
        _entry.set_text("Here the file name")

        var box = new Box( Orientation.VERTICAL, 0 )
        box.pack_start( folder_chooser, true, true, 0 )
        box.pack_start( _file_chooser, true, true, 0 )
        box.pack_start( _entry, true, true, 0 )

        add( box )

    def folder_changed( folder_chooser_widget:FileChooser )
        folder:string = folder_chooser_widget.get_uri()
        _file_chooser.set_current_folder_uri( folder )

    def file_changed ( file_chooser_widget: FileChooser )
        stdout.printf(file_chooser_widget.get_filename())

        stdout.printf("Checking whether this function is actually called")

        file:File = File.new_for_uri(file_chooser_widget.get_filename())
        stdout.printf(file_chooser_widget.get_filename())
        info:FileInfo = file.query_info (FileAttribute.ACCESS_CAN_WRITE, FileQueryInfoFlags.NONE, null)
        writable:bool = info.get_attribute_boolean (FileAttribute.ACCESS_CAN_WRITE)
        stdout.printf(writable.to_string())
        if writable is true
            _entry.set_sensitive(false)


init
    Gtk.init( ref args )
    var test = new TestWindow()
    test.show_all()
    Gtk.main()

質問

  • 2 番目の selection_changed 呼び出しが機能しないのはなぜですか? Action.OPEN の FileChooserButton は、SELECT_FOLDER アクションの FileChooserButton とは異なる動作をしますか?
4

2 に答える 2

1

stdout はデフォルトで行バッファリングされます。

出力については、次のことができます。

var that = "message"
print that
message (that)


stdout.printf ("%s\n", that)    // add a newline
stdout.printf (that)   // no newline, but
stdout.flush ()             // flush if no newline in that

ここに問題があります:

var _entry = ...    // this one unvisiable in file_changed
_entry = ...        // remove var, it will visiable in file_changed

しかし、私はまだあなたのコードに問題があります(私のマシンで):

操作はサポートされていません

try
    info:FileInfo = file.query_info (FileAttribute.ACCESS_CAN_WRITE, FileQueryInfoFlags.NONE, null)
    writable: bool = info.get_attribute_boolean (FileAttribute.ACCESS_CAN_WRITE)
    if writable is true
    _entry.set_sensitive (false)

except e: Error
    print e.message // opration not supported

私は問題を見つけようとしました。しかし、何も得られませんでした。

于 2016-01-16T09:41:21.767 に答える