2014-12-08 1 views
0

gtk를 사용하여 폴더 선택 대화 상자를 만들려고했지만 대화 상자를 닫는 방법을 알 수 없습니다. 여기에 코드입니다 :파이썬을위한 pygtk에서 파일 선택기 대화 상자를 파괴하는 적절한 방법

from gi.repository import Gtk 
import time 

dialog = Gtk.FileChooserDialog("Please choose a folder", None, 
Gtk.FileChooserAction.SELECT_FOLDER, 
    (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, 
    "Select", Gtk.ResponseType.OK)) 

response = dialog.run() 
if response == Gtk.ResponseType.OK: 
    print("Select clicked") 
    print("Folder selected: " + dialog.get_filename()) 
elif response == Gtk.ResponseType.CANCEL: 
    print("Cancel clicked") 

dialog.destroy() 
time.sleep(5) 

내가 제대로 작동하려면 어떤 방법으로() gtk.main 호출 할 필요가 있음을 이해하지만, 내가 어떻게 알아낼 수 없습니다. 나는 http://python-gtk-3-tutorial.readthedocs.org/en/latest/dialogs.html에서 마지막 예제를 사용해 왔지만 시작 부분에 제거하는 방법을 알지 못하는 상자가 있습니다.

답변

1

은 더 좋은 방법이있을 수도 있지만, 나는 보통 이런 식으로 작업을 수행합니다

from gi.repository import Gtk, Gdk, GLib 

def run_dialog(_None): 
    dialog = Gtk.FileChooserDialog("Please choose a folder", None, 
    Gtk.FileChooserAction.SELECT_FOLDER, 
     (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, 
     "Select", Gtk.ResponseType.OK)) 

    response = dialog.run() 
    if response == Gtk.ResponseType.OK: 
     print("Select clicked") 
     print("Folder selected: " + dialog.get_filename()) 
    elif response == Gtk.ResponseType.CANCEL: 
     print("Cancel clicked") 

    dialog.destroy() 
    Gtk.main_quit() 


Gdk.threads_add_idle(GLib.PRIORITY_DEFAULT, run_dialog, None) 
Gtk.main() 

이 대화 상자를 표시 한 후 종료되는, 즉시 돌이를 시작으로 run_dialog 함수를 호출합니다.

UPDATE : 선택한 폴더를 반환하는 함수에 그 코드를 동봉 할 경우, 당신은 로컬이 아닌 변수에 경로를 저장해야합니다 :

파이썬 3에서
def run_folder_chooser_dialog(): 
    result= [] 

    def run_dialog(_None): 
     dialog = Gtk.FileChooserDialog("Please choose a folder", None, 
     Gtk.FileChooserAction.SELECT_FOLDER, 
      (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, 
      "Select", Gtk.ResponseType.OK)) 

     response = dialog.run() 
     if response == Gtk.ResponseType.OK: 
      result.append(dialog.get_filename()) 
     else: 
      result.append(None) 

     dialog.destroy() 
     Gtk.main_quit() 


    Gdk.threads_add_idle(GLib.PRIORITY_DEFAULT, run_dialog, None) 
    Gtk.main() 
    return result[0] 

, 못생긴 목록 참조 대신 nonlocal resultresult= dialog.get_filename()을 사용할 수 있습니다.

+0

아니요 다른 문제가 있습니다. 선택한 폴더의 값을 실제로 문자열로 반환하는 함수는 어떻게 얻습니까? – Johan

+0

'return dialog.get_filename()'? –

+0

예 그렇지만 함수 밖의 값을 반환하려고하면 루프가 영원히 계속되거나 gtk.main_quit에 루프를 종료하지 않는다는 오류 메시지가 표시됩니다. – Johan

관련 문제