Странная разница. Почему другой результат в FileChooserDialog? - PullRequest
0 голосов
/ 06 мая 2020

Я боролся со следующим в течение нескольких дней и выделил очень компактную версию проблемы, которая все еще показывает проблему. Следующая программа показывает основное окно c, и сначала открывает FileChooserDialog.

Вот версия, которая терпит неудачу - она ​​не показывает кнопки Cancel и Accept в диалоговом окне:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import GLib, Gtk

class Script():
    def __init__(self, parent, width = 800):
        self.parent = parent

    def script_file_dialog(self):
        fc = Gtk.FileChooserDialog(
                    parent = self.parent,
                    title = "title",
                    action = Gtk.FileChooserAction.OPEN,
                    do_overwrite_confirmation = True)
        fc.add_buttons = ("Cancel", Gtk.ResponseType.CANCEL,
                          "Open", Gtk.ResponseType.ACCEPT)

        return fc

class MainWindow(Gtk.Window):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.connect("destroy", lambda x: Gtk.main_quit())
        self.set_default_size(1000, 580)

        self.script = Script(self)

        fc = self.script.script_file_dialog()
        if fc.run() == 1:
            print("one")
        fc.destroy()

        self.show_all()

    def on_test_clicked(self, btn):
        #~ self.script.on_open_script(btn)
        self.script = Script(self)

        fc = self.script.script_file_dialog()
        if fc.run() == 1:
            print("one")
        fc.destroy()

    def run(self):
        Gtk.main()

def main(args):
    mainwdw = MainWindow()
    mainwdw.run()

    return 0

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

И следующая, почти идентичная версия действительно работает должным образом. Обратите внимание, единственная разница заключается в том, что при создании экземпляра FileChooserDialog кнопки передаются как параметры ключевого слова. Это устарело и выдает предупреждение.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import GLib, Gtk

class Script():
    def __init__(self, parent, width = 800):
        self.parent = parent

    def script_file_dialog(self):
        fc = Gtk.FileChooserDialog(
                    parent = self.parent,
                    title = "title",
                    action = Gtk.FileChooserAction.OPEN,
                    do_overwrite_confirmation = True,
                    buttons = ("Cancel", Gtk.ResponseType.CANCEL,
                               "Open", Gtk.ResponseType.ACCEPT))

        return fc

class MainWindow(Gtk.Window):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.connect("destroy", lambda x: Gtk.main_quit())
        self.set_default_size(1000, 580)

        self.script = Script(self)

        fc = self.script.script_file_dialog()
        if fc.run() == 1:
            print("one")
        fc.destroy()

        self.show_all()

    def on_test_clicked(self, btn):
        #~ self.script.on_open_script(btn)
        self.script = Script(self)

        fc = self.script.script_file_dialog()
        if fc.run() == 1:
            print("one")
        fc.destroy()

    def run(self):
        Gtk.main()

def main(args):
    mainwdw = MainWindow()
    mainwdw.run()

    return 0

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

Я попытался отложить отображение диалогового окна, вызвав его кнопкой после того, как был показан основной диалог. Более того, я использовал первый шаблон в других программах, и он там работает.

Это, вероятно, правила домоседства, которые постепенно сводят меня с ума ... Кто-нибудь видит проблему?

1 Ответ

1 голос
/ 07 мая 2020

В первой версии есть опечатка:

fc.add_buttons = ("Cancel", Gtk.ResponseType.CANCEL,
                  "Open", Gtk.ResponseType.ACCEPT)

должно быть:

fc.add_buttons("Cancel", Gtk.ResponseType.CANCEL,
               "Open", Gtk.ResponseType.ACCEPT)
...