GtkFileChooserDialog не действует как модальный

У меня есть обычай GtkFileChooserDialog, созданный с Glade. ModalСвойство помечено.
У меня также есть aGtkFileChooserButton, который использует это GtkFileChooserDialogв качестве диалогового окна:

class ImgChooserBttWithCapture(Gtk.FileChooserButton):
    """
    The custom Gtk.FileChooserButton and Gtt.FileChooserDialog with a button for call capture app
    """

    def __init__(self, cap_app_path):
        self.builder = Gtk.Builder.new_from_file(
            UIS_PATH + 'images_chooser_dialog.xml')
        self.chooser_dialog = self.builder.get_object('icd_photo_chsrdialog')

        super().__init__(dialog=self.chooser_dialog)
        self.cap_app_path = cap_app_path
        self.set_title('Selecione uma imagem')
        self.set_halign(Gtk.Align.START)
        self.set_valign(Gtk.Align.FILL)
        self.set_hexpand(True)
        self.set_tooltip_text('Clique para escolher uma nova imagem')
        self.set_local_only(False)

        handlers = {'onCaptureButtonClicked': self._on_capture_button_clicked}

        self.builder.connect_signals(handlers)

    def _on_capture_button_clicked(self, button):

        try:
            subprocess.call([self.cap_app_path])
        except (subprocess.CalledProcessError, subprocess.TimeoutExpired, FileNotFoundError) as ex:

            self.builder.add_from_file(UIS_PATH + 'information_window.xml')
            msg_dialog = self.builder.get_object('iw_messagedialog')

            msg_dialog.set_title('Erro')
            msg_dialog.set_markup(
                '<span size="12000"><b>Não foi possível abrir o aplicativo</b></span>')

            msg_dialog.format_secondary_markup(
                'O aplicativo de captura não está disponível.nVerifique o caminho para o aplicativo de caputura em configurações.n' + '<span foreground="red"><u>' + str(ex) + '</u></span>')

            msg_dialog.set_property('message-type', Gtk.MessageType.ERROR)
            msg_dialog.set_transient_for(self.chooser_dialog)
            self.builder.get_object('iw_message_image').set_from_file(
                'views/uis/images/message_error.png')

            msg_dialog.run()
            msg_dialog.destroy()

Но, когда я нажимаю на кнопку, диалог не является модальным, то есть я могу взаимодействовать с другим окном.

1 ответ

  1. Будет ли захват указателя работать для вас?

    //pass all events to window apart LEAVE_NOTIFY_MASK 
    MainWindow->set_events(GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK | GDK_PROXIMITY_IN_MASK | GDK_PROXIMITY_OUT_MASK | GDK_SUBSTRUCTURE_MASK | GDK_SCROLL_MASK | GDK_TOUCH_MASK | GDK_SMOOTH_SCROLL_MASK | GDK_TOUCHPAD_GESTURE_MASK);
    MainWindow->set_modal(true);
    auto display = MainWindow->get_display();
    auto window = MainWindow->get_window();
    auto grabSuccess = display->get_default_seat()->grab(window, Gdk::SEAT_CAPABILITY_ALL, true);
    if(grabSuccess != Gdk::GRAB_SUCCESS)
    {
        std::clog<<"grab failed: "<<grabSuccess<<std::endl;
    }