Caixa de diálogo Pygtk e ID de retorno / info

1
Estou escrevendo um aplicativo com pygtk-glade rapidamente e eu quero mostrar um diálogo e obter o id de retorno ... Eu usei o método run (), mas se fechar a caixa de diálogo e reabri-lo eu recebo uma janela vazia e alguns erros! Eu estava usando destroy () para fechá-lo ..

Então eu tentei usar o método show (), mas eu posso obter um valor de retorno usando

id = dialog.show()

como posso obter o ID de retorno?

Além disso, como posso obter o texto de alguma entrada na caixa de diálogo do código principal?

    
por Clepto 02.08.2012 / 00:08

3 respostas

3

Encontrei este stackoverflow post , que leva à documentação na função de execução de um GtkDialog, onde afirma:

The run() method blocks in a recursive main loop until the dialog either emits the "response" signal, or is destroyed. If the dialog is destroyed, the run() method returns gtk.RESPONSE_NONE; otherwise, it returns the response ID from the "response" signal emission. Before entering the recursive main loop, the run() method calls the gtk.Widget.show() on the dialog for you. Note that you still need to show any children of the dialog yourself.

During the run() method, the default behavior of "delete_event" is disabled; if the dialog receives a "delete_event", it will not be destroyed as windows usually are, and the run() method will return gtk.RESPONSE_DELETE_EVENT. Also, during the run() method the dialog will be modal. You can force the run() method to return at any time by calling response() to emit the "response" signal. Destroying the dialog during the run() method is a very bad idea, because your post-run code won't know whether the dialog was destroyed or not.

After the run() method returns, you are responsible for hiding or destroying the dialog as needed.

E também no tutorial do PyGTK 3 :

Finally, there are two ways to remove a dialog. The Gtk.Widget.hide() method removes the dialog from view, however keeps it stored in memory. This is useful to prevent having to construct the dialog again if it needs to be accessed at a later time. Alternatively, the Gtk.Widget.destroy() method can be used to delete the dialog from memory once it is no longer needed. It should be noted that if the dialog needs to be accessed after it has been destroyed, it will need to be constructed again otherwise the dialog window will be empty.

Assim, seguindo esses bits de informação, se você chamar a função hide da caixa de diálogo antes de receber o evento delete, ela não será destruída e você poderá continuar chamando a execução, para trazer a caixa de diálogo para o foco.

por exemplo,

def on_mnu_test_dialog_activate(self, widget, data=None):
    result = self.TestDialog.run()
    if result == Gtk.ResponseType.OK:
        print "The OK button was clicked"
    self.TestDialog.hide()

Além disso, apenas para responder à sua segunda pergunta.

No meu exemplo, importei a classe para o diálogo:

from dialog_show.TestDialog import TestDialog

Em seguida, na função finish_initializing, criei uma variável de instância para o diálogo:

self.TestDialog = TestDialog()

Eu posso acessar as propriedades assim:

self.TestDialog.ui.txt_entry1.get_text()

ou, como sugerido por John,

self.TestDialog.builder.get_object("txt_entry1").get_text()
    
por trent 02.08.2012 / 04:11
1

O projeto em que trabalho descobre o nome do arquivo ui e reconstrói a caixa de diálogo toda vez. Ele mostra e termina chamando gtk.main ().

Vários controles recebem nomes no glade-gtk2 e o glade-gtk2 também é usado para definir os botões cancel e ok. Os manipuladores recebem nomes para os sinais quando esses botões são pressionados.

Nos nomes de código também estão conectados aos vários controles. Por exemplo:

self.use_vertical_layout = builder.get_object('vertical_layout')

O código define definições para os manipuladores e esses manipuladores são conectados com builder.connect_signals antes que a caixa de diálogo seja mostrada.

Quando o manipulador de ok é chamado, ele pode verificar os valores dos vários controles da caixa de seleção. No caso acima, self.use_vertical_layout para representar o valor da caixa de seleção quando OK foi selecionado.

Por favor, tenha em mente que o pygtk é a maneira gtk-2 de fazer as coisas e as versões atuais de usar rapidamente o gtk3 e a introspecção (mas usando uma abordagem muito similar).

    
por John S Gruber 02.08.2012 / 03:42
1
from gi.repository import Gtk

builder = Gtk.Builder()
#correct the path to ui file
builder.add_from_file("ui/stuff.glade")

class Worker:
    def __init__(self):
        self.dia = builder.get_object("MyDialogue")
        self.win = builder.get_object("MyWindow")
    def change_application_settings(self, *args, **kwds):
        '''
        get dialogue states
        '''
        pass
    def reset_dialogue_settings(self, *args, **kwds):
        '''
        set dialogue states
        '''
        pass

worker = Worker()

class Handler:
    def on_mywindow_delete_event(self, *args, **kwds):
        Gtk.main_quit()

    def on_show_dialogue_button_clicked(self, *args, **kwds):
        retval = worker.dia.run()
        worker.dia.hide()
        if retval in [Gtk.ResponseType.OK,
                      Gtk.ResponseType.APPLY, 
                      Gtk.ResponseType.ACCEPT]:
            worker.change_application_settings()
        else:
            worker.reset_dialogue_settings()

builder.connect_signals(Handler())
worker.win.show_all()
Gtk.main()  

Eu não testei, mas é como deve ser.

    
por RobotHumans 02.08.2012 / 05:05