Reputation: 5159
I'm trying to create a program that uses the Gtk FileChooserDialog dialog. I followed the tutorial here, and it works. However, I would like to just have the dialog pop up and not have to deal with the actual Gtk window.
I've tried taking the code that, in the tutorial, is in the on_file_clicked()
function and putting it in the __init__
function (and tweaking it a bit so it looks like it would work) after removing the code already in __init__
:
class FileChooserWindow(Gtk.Window):
def __init__(self):
global path
dialog = Gtk.FileChooserDialog("Please choose a file", self,
Gtk.FileChooserAction.OPEN,
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
self.add_filters(dialog)
response = dialog.run()
if response == Gtk.ResponseType.OK:
print("Open clicked")
print("File selected: " + dialog.get_filename())
path = dialog.get_filename()
dialog.destroy()
elif response == Gtk.ResponseType.CANCEL:
print("Cancel clicked")
dialog.destroy()
def add_filters(self, dialog):
filter_any = Gtk.FileFilter()
filter_any.set_name("Any files")
filter_any.add_pattern("*")
dialog.add_filter(filter_any)
filter_text = Gtk.FileFilter()
filter_text.set_name('Text files')
filter_text.add_mime_type('text/plain')
dialog.add_filter(filter_text)
filter_py = Gtk.FileFilter()
filter_py.set_name('Python files')
filter_py.add_mime_type('text/x-python')
dialog.add_filter(filter_py)
filter_img = Gtk.FileFilter()
filter_img.set_name('Image')
filter_img.add_mime_type('image/*')
dialog.add_filter(filter_img)
win = FileChooserWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
but it just returns this error:
Traceback (most recent call last):
File "base.py", line 152, in <module>
win = FileChooserWindow()
File "base.py", line 38, in __init__
Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
File "/usr/lib/python3/dist-packages/gi/overrides/__init__.py", line 175, in new_init
return super_init_func(self, **new_kwargs)
File "/usr/lib/python3/dist-packages/gi/overrides/Gtk.py", line 500, in __init__
self._init(*args, **new_kwargs)
File "/usr/lib/python3/dist-packages/gi/overrides/__init__.py", line 175, in new_init
return super_init_func(self, **new_kwargs)
File "/usr/lib/python3/dist-packages/gi/overrides/__init__.py", line 175, in new_init
return super_init_func(self, **new_kwargs)
TypeError: could not convert value for property `transient_for' from FileChooserWindow to GtkWindow
Does anyone know the proper method for pulling up just the Gtk FileChooserDialog dialog?
Upvotes: 3
Views: 3434
Reputation: 1
@Seths solution above crashes with this error:
Traceback (most recent call last):
File "scriptname.py", line 57, in <module>
win.connect("delete-event", Gtk.main_quit)
TypeError: object at 0x7ff81d5dedc0 of type FileChooserWindow is not initialized
CRITICAL: Exiting due to uncaught exception <class 'TypeError'>
I found a simpler PyGObject example and fixed a few bugs to try to get it to work, but it blocks on the main loop and waits:
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
filechooserdialog = Gtk.FileChooserDialog(title="Open...",
parent=None,
action=Gtk.FileChooserAction.OPEN)
filechooserdialog.add_buttons("_Open", Gtk.ResponseType.OK)
filechooserdialog.add_buttons("_Cancel", Gtk.ResponseType.CANCEL)
filechooserdialog.set_default_response(Gtk.ResponseType.OK)
response = filechooserdialog.run()
if response == Gtk.ResponseType.OK:
print("File selected: %s" % filechooserdialog.get_filename())
filechooserdialog.destroy()
Upvotes: 0
Reputation: 528
When you declare the dialog on line 6:
dialog = Gtk.FileChooserDialog("Please choose a file", self,
self
is the parent of the dialog. To create a dialog with no parent set it to None
, like so:
dialog = Gtk.FileChooserDialog("Please choose a file", None,
Upvotes: 7