Gtk Can';t重命名文件,因为:g#u file_set_display_name:assertion';G#u是_文件(FILE)';失败

Gtk Can';t重命名文件,因为:g#u file_set_display_name:assertion';G#u是_文件(FILE)';失败,gtk,vala,genie,Gtk,Vala,Genie,这是练习的一部分。我当时找不到类似的问题。这里有一个小的GTK程序,在点击重命名按钮后,文件应该被重命名 尽管uri似乎指向正确的文件,但由于某种原因,我得到的断言G_IS_file在运行时失败 代码如下: [indent=4] uses Gtk class TestWindow:Window _file_chooser:FileChooserButton _entry:Gtk.Entry _button:Gtk.Button _file:File

这是练习的一部分。我当时找不到类似的问题。这里有一个小的GTK程序,在点击重命名按钮后,文件应该被重命名

尽管uri似乎指向正确的文件,但由于某种原因,我得到的断言G_IS_file在运行时失败

代码如下:

[indent=4]
uses
    Gtk

class TestWindow:Window
    _file_chooser:FileChooserButton
    _entry:Gtk.Entry
    _button:Gtk.Button
    _file:File

    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() )

        //I used selection_changed directly as per the question in stack_exchange
        //http://stackoverflow.com/questions/34689763/the-signal-connect-syntax
        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.file_set.connect( file_changed )
        _entry = new Gtk.Entry()
        _entry.set_text("Here the file name")
        //_entry.activate.connect(name_altered)

        _button = new Button.with_label("Rename")
        _button.set_sensitive(false)
        _button.clicked.connect(btn_pressed)

        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 )
        box.pack_start( _button, 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 )
        _file:File = File.new_for_uri(file_chooser_widget.get_uri())

        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
                _entry.set_sensitive (false)
            else
                _button.set_sensitive (true)
        except e: Error
            print e.message

        _entry.set_text(_file.get_path())

    def btn_pressed ()
        _file.set_display_name(_entry.get_text())

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

问题出现在以下行:
\u file.set\u display\u name(\u entry.get\u text())
。我正在寻找一些关于我在这个小精灵代码中做错了什么的见解。

\u文件
在调用
\u文件时为空。set\u display\u name()
。问题在于:

_file:File = File.new_for_uri(file_chooser_widget.get_uri())
您正在创建一个名为
\u file
的新变量,该变量对
\u file
字段进行阴影处理。改成

_file = File.new_for_uri(file_chooser_widget.get_uri())

应该解决这个问题。请注意,您也可以使用
此来访问字段。_字段
;它的键入时间稍长,但更易于阅读,并且会使类似这样的错误更加明显。

\u file
在调用
\u file.set\u display\u name()
时为空。问题在于:

_file:File = File.new_for_uri(file_chooser_widget.get_uri())
您正在创建一个名为
\u file
的新变量,该变量对
\u file
字段进行阴影处理。改成

_file = File.new_for_uri(file_chooser_widget.get_uri())

应该解决这个问题。请注意,您也可以使用
此来访问字段。_字段
;键入时间稍长,但更容易阅读,这样的错误也更明显。

谢谢Nemeq,你能推荐一些我可以学习如何使用此字段的参考资料吗。\u字段?谢谢Nemeq,你能推荐一些我可以学习如何使用此字段的参考资料吗。\u字段?