Erben von Gtk Dialog "doesn't support property `widget"

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Hallo

Ich wollte eigentlich eine Frage zum Vererben schreiben, und zwar ob dass nicht einfacher geht wenn ich mir wir unten zu sehen verschiedene Klassen schreiben will die von Gtk.MessageDialog erben. Ziele sind Hinweise, Fragen und Warnungen wie ich mit einem einfachen aufruf starte statt in jedem Skript wieder neu zu definieren.

Nun bekomme ich des leider nicht mehr ans laufen wegen dieser Fehlermeldung und ich komme nicht dahinter:

Code: Alles auswählen

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

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


logger = logging.getLogger("Dialog")


class Dialog(Gtk.MessageDialog):
    
    def __init__(self,
        title=None,
        text="",
        parent=Gtk.Window(), #bad
        flags=Gtk.DialogFlags.MODAL,
        widget=Gtk.MessageType.QUESTION,
        response_buttons=(Gtk.ButtonsType.YES_NO), 
        buttons=[],
        icon=None
        ):
        Gtk.MessageDialog.__init__(
            self,
            parent,
            flags,
            widget,
            response_buttons,
            text)
        if title:
            self.set_title(title)
        if icon:
            self.set_icon(icon)
        if buttons:
            content_area = self.get_content_area()
            for b in buttons:
                content_area.pack_start(b, True, True, 0)
                content_area.show()
                b.show()


class GetTextDialog(Dialog):

    def __init__(self,
        title=None,
        text="",
        parent=Gtk.Window(), #bad
        flags=Gtk.DialogFlags.MODAL,
        widget=Gtk.MessageType.QUESTION,
        buttons=[],
        icon=None
        ):
        response_buttons = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
                            Gtk.STOCK_OK, Gtk.ResponseType.OK)
        Gtk.Dialog.__init__(
            self,
            title=title,
            text=text,
            parent=parent,
            flags=flags,
            widget=widget,
            response_buttons=response_buttons,
            buttons=buttons,
            icon=icon
            )
        
        self.set_default_response(Gtk.ResponseType.OK)
        self.ok_button = self.get_widget_for_response(Gtk.ResponseType.OK)

        label = Gtk.Label(label=text)
        self.entry = Gtk.Entry()
        self.entry.set_activates_default(True)
        

        box = self.get_content_area()
        box.add(label)
        box.add(self.entry)
        self.show_all()
  

    def get_text(self):
        response = self.run()
        entry_text =  self.entry.get_text()
        self.hide()
        if response == Gtk.ResponseType.OK:
            return entry_text
         
Traceback (most recent call last):
File "Dialog.py", line 250, in <module>
GetTextDialog(text="some text")
File "Dialog.py", line 117, in __init__
icon=icon
File "/usr/lib/python2.7/dist-packages/gi/overrides/Gtk.py", line 537, in __init__
self._init(*args, **new_kwargs)
File "/usr/lib/python2.7/dist-packages/gi/overrides/__init__.py", line 326, in new_init
return super_init_func(self, **new_kwargs)
File "/usr/lib/python2.7/dist-packages/gi/overrides/__init__.py", line 326, in new_init
return super_init_func(self, **new_kwargs)
TypeError: gobject `__main__+GetTextDialog' doesn't support property `widget'
Zuletzt geändert von Anonymous am Montag 12. Juni 2017, 22:42, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@martinjo: Schau Dir mal bei `GetTextDialog` an wovon die Klasse erbt. Da solltest Du die `__init__()` von der Basisklasse `Dialog` aufrufen und nicht die von `Gtk.Dialog`.
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Gut gesehen, vielen Dank, ich sollte öfters mal ne Pause machen :-)
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Noch ne Frage zum Vererben. Die "Basisklasse" nenne ich ja Dialog, diese hat bei __init__ schon mal alle Parameter gelistet, hier erbe ich je schon mal von Gtk.MessageDialog dem ich auch alle Parameter mitgeben muss. Dann erstelle ich die Klasse GetTextDialog der ich auch alle alten + ein neues Parameter mit geben muss und die alle dann wieder der Klasse Dialog von er ich erbe.
Ich wollte ja eigentlich Code vermeiden durch das erstellen einer Klasse, nun habe ich durch das 2-fache init in der Klasse mehr Text wie wenn ich gleich Gtk.MessageDialog verwenden würde :-) Geht aber sicher irgenwie kürzer order? Ich habe bisher noch nie dieses *args bzw **kwargs verwendet, wäre das nicht hier eine Option?
BlackJack

@martinjo: Ich würde eher eine oder mehrere Methode einführen die Unterklassen überschreiben müssen, so dass die keine eigene `__init__()` mehr brauchen. So ähnlich wie `Dialog` das bei `tkSimpleDialog` beziehungsweise `tkinter.simpledialog` macht.
Antworten