Arjen Balfoort
Arjen Balfoort

Reputation: 195

Gtk.MessageDialog inherited class throws PyGTKDeprecationWarning warnings

I use a custom class for several projects that inherits Gtk.MessageDialog. Just out of curiosity I ran the script with -Wd:

python3 -Wd dialogs_test.py

Using "parent=" in __init__ I get the following warnings:

.../dialogs_test.py:15: PyGTKDeprecationWarning: Using positional arguments with the GObject constructor has been deprecated. Please specify keyword(s) for "parent" or use a class specific constructor. See: https://wiki.gnome.org/PyGObject/InitializerDeprecations
  super().__init__(self,

/usr/lib/python3/dist-packages/gi/overrides/Gtk.py:577: PyGTKDeprecationWarning: The keyword(s) "parent" have been deprecated in favor of "transient_for" respectively. See: https://wiki.gnome.org/PyGObject/InitializerDeprecations

Replace "parent=" with "transient_for=" in __init__:

See above
...
TypeError: could not convert value for property `transient_for' from Dialog to GtkWindow

I use keywords in __init__. So, what am I missing with the first warning?

I cannot find how to use transient_for or if I even have to. Does anybody know where to find the documentation on that?

This is my simplified script:

#!/usr/bin/env python3

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


class Dialog(Gtk.MessageDialog):
    def __init__(self, message_type, buttons, title, text):

        # Search for parent
        parent = next((w for w in Gtk.Window.list_toplevels() if w.get_title()), None)

        # Initialize the dialog object
        super().__init__(self,
                         parent=parent,
                         message_type=message_type,
                         buttons=buttons,
                         text=text)

        # Set title
        self.set_title(title)

    def show_dialog(self):
        """ Show the dialog """
        response = self.run() in (Gtk.ResponseType.YES,
                                  Gtk.ResponseType.APPLY,
                                  Gtk.ResponseType.OK,
                                  Gtk.ResponseType.ACCEPT)
        self.destroy()
        return response

def message_dialog(*args, **kwargs):
    """ Show message dialog """
    #return kwargs
    return Dialog(Gtk.MessageType.INFO, Gtk.ButtonsType.OK, *args, **kwargs).show_dialog() 


class MessageDialogWindow(Gtk.Window):

    def __init__(self):
        super().__init__(title="MessageDialog Test")
        self.set_default_size(500, 100)
        box = Gtk.Box()
        self.add(box)
        
        button = Gtk.Button.new_with_label("Info dialog by class")
        button.connect("clicked", self.on_info_clicked)
        button.set_hexpand(True)
        box.add(button)
        
    def on_info_clicked(self, widget):
        result = message_dialog(title='button title', text='button text')
        print((f"button result: {result}"))
        

win = MessageDialogWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

[SOLUTION]

The solution is to leave out "self" and replace "parent=" with "transient_for=" in __init__:

super().__init__(transient_for=parent,
                 message_type=message_type,
                 buttons=buttons,
                 text=text)

Upvotes: 0

Views: 20

Answers (1)

Arjen Balfoort
Arjen Balfoort

Reputation: 195

@furos: Thanks for the quick response. That helped a lot.

I ended up with this __init__:

super().__init__(transient_for=parent,
                 message_type=message_type,
                 buttons=buttons,
                 text=text)

That solved all issues.

Upvotes: 1

Related Questions