PyGTK + Glade: кнопка без какого-либо сигнала запускает другой сигнал - PullRequest
0 голосов
/ 14 июля 2020

Я разрабатываю приложение Python с использованием PyGTK + 3.0 с Glade 3.22.2 (и Python 3.8.1). Все было хорошо, но вдруг моя программа начала показывать странное поведение. У меня есть два метода для обработки некоторых нажатий кнопок: on_save_file() и on_open_file(). Эти функции принимают Gtk.Entry в качестве параметра и открывают / сохраняют файл и устанавливают имя файла на предоставленное Gtk.Entry.

Странная часть начинается сейчас: внезапно кнопка, открывающая файл, начала волшебным образом срабатывать щелчок на двух других кнопках в другом windows, который сохраняет файл. В результате одновременно отображаются три FileDialog.

Просто для тестирования я удалил сигнал on_open_file этой кнопки. И он продолжает запускать два других ...

Я также пытался вернуть несколько коммитов, но ошибка все еще была (я почти уверен, что этого не было раньше, так же, как Я почти уверен, что ничего не обновлял в своей виртуальной среде).

Кто-нибудь знает, где может быть эта проблема?

Спасибо!

Подробнее

Вот мои три метода (и обработчики сигналов):

# class blahblahblah: ...
def open_file(self, use_last_path=True) -> str:
    """
    Show an Open File dialog and return the filename

    :param use_last_path: Whether or not to start at the last folder opened
    :return: the selected filename
    """
    file_chooser = Gtk.FileChooserDialog(
        title="Open...", action=Gtk.FileChooserAction.OPEN)
    file_chooser.add_buttons(
        "Cancel", Gtk.ResponseType.CANCEL, "Open", Gtk.ResponseType.OK)
    file_chooser.set_default_response(Gtk.ResponseType.OK)
    file_chooser.add_filter(self.csv_file_filter)
    if self.last_opened_path and use_last_path:
        file_chooser.set_current_folder(self.last_opened_path)
    response = file_chooser.run()
    filename = None
    if response == Gtk.ResponseType.OK:
        filename = file_chooser.get_filename()
        self.last_opened_path = os.path.dirname(os.path.abspath(filename))
    file_chooser.destroy()
    return filename

def on_save_file(self, entry: Gtk.Entry) -> None:
    """Show a Save File dialog and set the filename to the given entry"""

    file_chooser = Gtk.FileChooserDialog(
        title="Save...", action=Gtk.FileChooserAction.SAVE)
    file_chooser.add_buttons(
        "Cancel", Gtk.ResponseType.CANCEL, "Save", Gtk.ResponseType.OK)
    file_chooser.set_default_response(Gtk.ResponseType.OK)
    file_chooser.add_filter(self.csv_file_filter)
    response = file_chooser.run()
    if response == Gtk.ResponseType.OK:
        filename = file_chooser.get_filename()
        entry.set_text(filename)
    file_chooser.destroy()

def on_open_file(self, entry: Gtk.Entry) -> None:
    """Show an Open File dialog and set the filename to the given entry"""

    filename = self.open_file()
    if filename:
        entry.set_text(filename)

Кнопка, которая должна открывать файл (как я уже сказал, я удалил сигнал on_open_file ).

<object class="GtkButton">
  <property name="label" translatable="yes">Open</property>
  <property name="visible">True</property>
  <property name="can_focus">True</property>
  <property name="receives_default">True</property>
</object>

Кнопка, которая запускается:

<object class="GtkButton">
  <property name="label" translatable="yes">Browse</property>
  <property name="visible">True</property>
  <property name="can_focus">True</property>
  <property name="receives_default">True</property>
  <signal name="clicked" handler="on_save_file" object="GA_output_matrix" swapped="no"/>
</object>

<object class="GtkButton">
  <property name="label" translatable="yes">Browse</property>
  <property name="visible">True</property>
  <property name="can_focus">True</property>
  <property name="receives_default">True</property>
  <signal name="clicked" handler="on_save_file" object="OPS_output_matrix" swapped="no"/>
</object>

Каждая кнопка выше находится в другом файле, и я загружаю их, используя Gtk.Builder:

builder: Gtk.Builder = Gtk.Builder()
builder.add_from_file('./Views/main.glade')
builder.add_from_file('./Views/ga.glade')
builder.add_from_file('./Views/ops.glade')
if __name__ == '__main__':
    builder.connect_signals(Handler())
    window = builder.get_object('main_window')
    window.show_all()
    Gtk.main()

1 Ответ

0 голосов
/ 19 июля 2020

Не знаю почему, но добавление идентификатора для каждой кнопки решило ошибку. Кнопки стали:

<object class="GtkButton" id="a_semantic_id_1">
  <property name="label" translatable="yes">Open</property>
  <property name="visible">True</property>
  <property name="can_focus">True</property>
  <property name="receives_default">True</property>
</object>

<object class="GtkButton" id="a_semantic_id_2">
  <property name="label" translatable="yes">Browse</property>
  <property name="visible">True</property>
  <property name="can_focus">True</property>
  <property name="receives_default">True</property>
  <signal name="clicked" handler="on_save_file" object="GA_output_matrix" swapped="no"/>
</object>

<object class="GtkButton" id="a_semantic_id_3">
  <property name="label" translatable="yes">Browse</property>
  <property name="visible">True</property>
  <property name="can_focus">True</property>
  <property name="receives_default">True</property>
  <signal name="clicked" handler="on_save_file" object="OPS_output_matrix" swapped="no"/>
</object>
...