GtkFileFilter not working on macOS if defined through glade file
Selecting a file using a GtkFileChooserButton
and a matching GtkFileFilter
(using filter
property) defined in a glade file does work properly on Linux and Windows but not on macOS: no filter is applied and every file is selectable.
Take the following example:
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, GLib, GdkPixbuf
def main():
builder = Gtk.Builder()
builder.add_from_file("test.glade")
window = builder.get_object("window")
window.connect("delete-event", Gtk.main_quit)
window.show()
Gtk.main()
if __name__ == '__main__':
main()
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="3.10"/>
<object class="GtkFileFilter" id="image_filter">
<mime-types>
<mime-type>image/png</mime-type>
</mime-types>
<patterns>
<pattern>*.png</pattern>
</patterns>
</object>
<object class="GtkWindow" id="window">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Filter tester</property>
<child>
<object class="GtkBox" id="no_id_56">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox" id="no_id_8">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkBox" id="no_id_67">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel" id="image_chooser_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Image</property>
<property name="label" translatable="yes">image :</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFileChooserButton" id="image_chooser">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="create_folders">False</property>
<property name="filter">image_filter</property>
<property name="title" translatable="yes"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<child type="titlebar">
<placeholder/>
</child>
</object>
</interface>
This works on Linux/Windows, but not macOS.
To make it work on macOS, we need to :
- Remove the
<patterns>
node in the glade file - Add code to specify the pattern and to associate the filter and the chooser.
image_filter = builder.get_object("image_filter")
image_chooser = builder.get_object("image_chooser")
image_filter.add_pattern("*.png")
image_chooser.add_filter(image_filter)
Note: this might be a Gtk issue and not a pygobject one but I can't test it.