2

Python スクリプトの gtk.FileChooserButton に問題があります。オプション ›Other ...‹ をボタン メニューから選択すると、新しいフォルダを選択できる gtk.FileChooserDialog が開きます。この新しいフォルダーをダブルクリックして選択し、[開く] をクリックしてダイアログを確認すると、選択したフォルダー名が gtk.FileChooserButton に表示され、gtk.FileChooserButton.get_current_folder() の値が選択したフォルダーのパスに変更されます。フォルダー (例のステータス バーで確認できます)。これは予期される動作です。

しかし、ダブルクリックではなくシングルクリックだけで新しいフォルダーを選択し、[開く]をクリックしてダイアログを確認すると、選択したフォルダー名がgtk.FileChooserButtonに表示されますが、gtk.FileChooserButton.get_current_folderにパスが表示されます() は、選択したフォルダーのパスではなく、その親フォルダーのパスです。

それはバグですか、それともスクリプトにエラーがありますか? ボタンのフォルダー名は、常に gtk.FileChooserButton.get_current_folder() のフォルダー名と同じにする必要があります。ここで何ができるでしょうか?ありがとう。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import gtk, os

class MainClass(object):
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_position(gtk.WIN_POS_CENTER)
        self.window.set_default_size(400, 100)
        self.window.connect("delete_event", self.delete_event)
        self.window.connect("destroy", self.destroy)
        self.window.set_border_width(6)
        self.vbox1 = gtk.VBox(False, 0)
        self.window.add(self.vbox1)

        self.filechooserdialog1 = gtk.FileChooserDialog("Select a folder…", None, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
        self.filechooserdialog1.set_default_response(gtk.RESPONSE_OK)
        self.filechooserbutton1 = gtk.FileChooserButton(self.filechooserdialog1)
        self.filechooserbutton1.set_current_folder(os.environ['HOME'])
        self.filechooserbutton1.connect('current-folder-changed', self.tell_folder)

        self.vbox1.pack_start(self.filechooserbutton1, True, False, 0)
        self.statusbar1 = gtk.Statusbar()
        self.vbox1.pack_start(self.statusbar1, False, False, 0)
        self.context_id = self.statusbar1.get_context_id("status")
        self.window.show_all()

    def tell_folder(self, data=None):
        self.statusbar1.push(self.context_id, self.filechooserbutton1.get_current_folder())

    def delete_event(self, widget, event, data=None):
        return False

    def destroy(self, data=None):
        gtk.main_quit()

    def main(self):
        gtk.main()

if __name__ == "__main__":
    MyApp = MainClass()
    MyApp.main()
4

2 に答える 2

1

あなたが聞いている信号は、親フォルダー内のフォルダーを選択するときではなく、ファイルチューザーのビューフォルダーが変更されたときにのみ放出されget_current_folder()ます。あなたが選択したもの。したがって、コードで何が起こったのかは、ダブルクリックで最初に現在のフォルダーが変更され、次に「OK」が「押された」ということです。

file-setの信号を聞く方が適切に思えますがFileChooserButton、ユーザーがボタンをクリックしたり、ダイアログを終了したりしたかどうかを確認する方法は 100% わかりません。選択されているものを取得するには、一度に 1 つのみを選択できるようにする場合、FileChooser's get_filename()(またはget_filenames()複数選択を許可する場合) を使用できます。残念ながら、私は間違ったコンピューターを使用しているため、ソリューションをテストできませんが、少なくとも正しい方向に導くはずです.

run()補足として、ダイアログが必要なときに単に を呼び出し、FileChooserDialog応答として返されるもの (クリックされたボタン) をキャッチしてから を使用する方が簡単だと思いますget_filename()

于 2012-12-30T01:30:38.213 に答える
0

現在のフォルダーが必要な場合は、現在のフォルダーが変更された信号を監視することをお勧めします。その後、コールバックでget_current_folderを使用できますが、確実にコールバックでのみ使用できます。ここにまともな回避策があります。

def on_current_folder_changed(widget):
    widget._folder = widget.get_current_folder()

def on_file_set(widget):
    # Lock that value in.
    if widget.get_current_folder() != widget._folder:
        widget.set_current_folder(widget._folder)
于 2013-02-20T13:42:25.330 に答える