Gtk Einträge neu laden nach Bearbeitung in einer anderen Klasse

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Guten Tag

Ich stehe vor einem Problem, welches mir, in dieser Art, schon öfters untergekommen ist.

Ich habe eine Klasse namen "Profiles", hier werden mir in einem Gtk-Fenster über eine Combobox verfügbare Profile angezeigt. Hier gibt es auch einen Knopf "Edit Profil", welcher ein neues Fenster öffnet. Und das wollte ich über eine separate Klasse namens "ProfileEditor" machen. Die Daten für das ausgewählte Profil übergebe ich einfach an diese Klasse (Name, Beschreibung, Dateipfad). Das funktioniert soweit auch und ich kann die Daten speichern.
Nun soll, nachdem das "ProfileEditor"-Fenster geschlossen wird (hide), "Profiles" die Daten automatisch neu laden, damit diese auch angezeigt werden. Hier fällt mir nun nur ein, einen Knopf "Neu laden" anzulegen. Da gibt es doch aber sicher bessere Möglichkeiten, ich komme aber nicht darauf.

Freue mich über Hilfe,
Danke

Kleines Beispiel, welches so aber nicht funktioniert:

Code: Alles auswählen

    def on_edit_template_button_clicked(self, widget):
        for template in self.templates:
            if template["template_name"] == self.active_template_name:
                ProfileEditor(template=template)
                self.load_settings()
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@martinjo: Das könnte/würde man über einen modalen Dialog lösen, also einen der den Rest der GUI blockiert und dessen Anzeigeaufruf auch blockiert. Wenn der Aufruf zurück kehrt, dann lädt man das Profil neu und gut ist.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Ja, Danke. Mit einem Gtk.Dialog funktioniert es. Gibt es da eine Möglichkeit, es auch mit einem Gtk.Window umzusetzen? Der Gtk.Dialog baut ja auf diese Klasse auf?

https://lazka.github.io/pgi-docs/Gtk-3.0/classes/Window
https://lazka.github.io/pgi-docs/Gtk-3.0/classes/Dialog
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@martinjo: Da Dialog von Window abgeleitet ist kann man das natürlich auch selber noch mal das programmieren was schon in Dialog fertig vorliegt. Aber warum möchtest Du das Rad neu erfinden? Genau dafür gibt es die Klasse ja.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Also, hauptsächlich, da sich dadurch eben unzählige andere Probleme ergeben und ich die Klasse wieder umschreiben muss. Fängt mit der Kleinigkeit an, dass man etwas umständlicher an die Box kommt (get_content_area). Aber das Hauptproblem, welches ich gerade habe ist, dass meine Textbox nicht angezeigt wird. Kleines Zusatzproblem ist, dass ist dem Dialog ein Widget mitgeben muss, beispielsweise Gtk.MessageType.INFO und dafür ein Icon angezeigt wird, welches Platz weg nimmt. Also ganz so einfach ist es leider nicht, ich versuche es ja schon seit einer ganzen Weile :-)


Also, ich habe meine Klasse MyTextbox welche im Dialog nicht angezeigt wird (Strich in der Mitte):

Bild

Code: Alles auswählen

class MyTextbox(Gtk.VBox):
    def __init__(self, spacing=5, border_width=5):
        Gtk.Box.__init__(self, spacing=spacing, border_width=border_width)
        scrolledwindow = Gtk.ScrolledWindow()
        scrolledwindow.set_policy(Gtk.PolicyType.ALWAYS,
                                       Gtk.PolicyType.ALWAYS)
        scrolledwindow.set_hexpand(True)
        scrolledwindow.set_vexpand(True)
        self.add(scrolledwindow)
        self.textview = Gtk.TextView()
        scrolledwindow.add(self.textview)
        self.textbuffer = self.textview.get_buffer()
        self.textview.set_wrap_mode(Gtk.WrapMode.WORD)


class EditDialog(Gtk.MessageDialog):
    def __init__(self,
        title="EditDialog",
        parent=None,
        flags=None,
        widget=Gtk.MessageType.INFO,
        response_buttons=[],
        text="",
        icon=None,
        border_width=10,
        spacing=2
    ):
        dialog = Gtk.MessageDialog.__init__(
            self,
            parent,
            flags,
            widget,
            response_buttons,
            text,
            icon
        )
        self.box = self.get_content_area()
        self.box.set_spacing(spacing)
        parent = self.box.get_parent()
        parent.set_border_width(border_width)
            
    def get_response(self):
        return = self.run()
        print (Gtk.ResponseType(response).value_nick, Gtk.ResponseType(response))
        return response



class MailTemplateWindow(EditDialog):

    def __init__(self, template=None, parent=None):
        EditDialog.__init__(self, title="MailTemplateWindow", parent=parent)

        newbox = Gtk.VBox()
        self.subject_entry = Gtk.Entry(placeholder_text="Email Subject")
        newbox.pack_start(self.subject_entry, False, False, 0)

        self.textbox = MyTextbox()
        newbox.pack_start(self.textbox, True, True, 0)

        self.template_name_entry = Gtk.Entry(placeholder_text="Template Name")
        newbox.pack_start(self.template_name_entry, False, False, 0)

        save_button = Gtk.Button.new_from_stock(Gtk.STOCK_SAVE)
        save_button.connect("clicked", self.on_save_button_clicked)
        newbox.pack_start(save_button, False, False, 0)

        self.box.pack_start(newbox, True, True, 0)
        self.show_all()
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Ok, mit einem "normalen" Gtk.Dialog funktioniert es, meine Klasse hatte noch den Gtk.MessageDialog verwendet.

https://lazka.github.io/pgi-docs/Gtk-3. ... ialog.html
Antworten