pyGTK / GTK filechooser - возможно ли проверить ввод пользователя перед записью файла или папки на диск? - PullRequest
3 голосов
/ 23 декабря 2010

Я хотел бы проверить выбор пользователя для имени папки в диалоге gtk.FileChooser при создании новой папки.
Я попытался подключиться к диалогу «ответ», но уже слишком поздно, новая папка будет записана на диск.
Есть ли способ достичь этого, а затем проверить папку после ее записи на диск?

Спасибо Марку ... вот код, который я использую:

import gtk

def _newFolderDialog(currentFolder=None):

    newDialog = gtk.FileChooserDialog(
        title="Create new folder", parent=None, 
        action=gtk.FILE_CHOOSER_ACTION_CREATE_FOLDER, 
        buttons= (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL), backend=None)
    newButton = newDialog.add_button(gtk.STOCK_NEW, gtk.RESPONSE_OK)
    if currentFolder is not None:
        newDialog.set_current_folder(currentFolder)

    newButton.connect("pressed", validateChoice, newDialog)

    response = newDialog.run()

    if response == gtk.RESPONSE_OK:
        newFolder = newDialog.get_filename()
        newDialog.destroy()
        return newFolder

    elif response == 1: # Validation was not satisfied
        msg = gtk.MessageDialog(parent=None, flags=gtk.DIALOG_MODAL,
            type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK, 
            message_format="Try again!")
        msg.run()
        msg.destroy()
        current_folder = newDialog.get_current_folder()
        newDialog.destroy()
        return _newFolderDialog(current_folder)

    elif response == 2: # Ok button was pressed, but with no entry
        current_folder = newDialog.get_current_folder()
        newDialog.destroy()
        return _newFolderDialog(current_folder)

    elif response == gtk.RESPONSE_CANCEL:
        newDialog.destroy()
        return None

def validateChoice(button, dialog):
    newFolder = dialog.get_filename()

    if newFolder is None: # The cursor was in the empty text entry box
        dialog.response(2)
    else:
        # If cursor is selecting a folder, lets unselect it, we are intereste
        # in the value in the entry text box.
        dialog.unselect_filename(newFolder) 
        newFolder = dialog.get_filename()

        if newFolder is None: # A folder was selected but empty text entry box
            dialog.response(2)

        ## do some validation, in this case the folder has to start with "/home"
        elif not newFolder.startswith("/home"):  
            dialog.response(1)
        else:
            dialog.response(gtk.RESPONSE_OK)

newFolder = _newFolderDialog()
print newFolder

1 Ответ

3 голосов
/ 23 декабря 2010

Я вижу несколько способов сделать это.

Во-первых, просто напишите свой собственный обработчик идентификатора ответа вместо использования gtk.RESPONSE_OK (что для виджета означает создание папки). Если вы сделаете это таким образом, вы будете нести ответственность за фактическое создание папки после проверки (os.path.mkdir).

Два, вы можете переопределить нажатие на «новую» кнопку:

import gtk

def new_button_pressed(widget, data=None):
    ## data is a reference to the dialog widget
    ## do some validation, in this case the folder has to start with "/home"
    if not(data.get_filename().startswith("/home")):
        ## force cancel response
        print "failed validation..."        
        data.response(gtk.RESPONSE_CANCEL)
    else:
        print "success validation..."
        data.response(gtk.RESPONSE_OK)

newDialog = gtk.FileChooserDialog(
title="Create new folder", parent=None, 
action=gtk.FILE_CHOOSER_ACTION_CREATE_FOLDER, 
buttons= (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL), backend=None)
new_button = newDialog.add_button(gtk.STOCK_NEW, gtk.RESPONSE_OK)
new_button.connect("pressed", new_button_pressed, newDialog)
newDialog.run()
...