Text in einen TextBuffer einfügen - PyGObject

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
sh4nks
User
Beiträge: 13
Registriert: Montag 5. März 2012, 22:08
Wohnort: Styria

Hallo liebe Community!

Ich habe folgendes Problem:

Wenn die "Funktion Command" in der Klasse "MainApp" ist, wird in meiner TextView der Befehl "cmd" und das Resultat "output" von "cmd" angezeigt
http://pastebin.com/EKZJtug4

wenn aber die "Funktion Command" außerhalb der Klasse ist, funktioniert es nicht - ich erhalte auch keine Fehlermeldung
http://pastebin.com/49hPST4t

Ich würde die Funktion gerne außerhalb der Klasse haben da ich sie in anderen Dateien später auch brauchen werden :)

Danke für eure Hilfe!

greetz
BlackJack

@sh4nks: Im zweiten Beispiel erzeugst Du zwei verschiedene Exemplare von `MainApp` und operierst in der `Command` auf einem anderen als dem was als erstes erzeugt wird.

Die Namensgebung und der Code insgesamt sehen so als, als wenn Du Dich erst noch ein wenig mit objektorientierter Programmierung (OOP) befassen solltest, bevor Du GUIs in Angriff nimmst.
sh4nks
User
Beiträge: 13
Registriert: Montag 5. März 2012, 22:08
Wohnort: Styria

Jap, befasse mich erst seit kurzem mit OOP :)
Habe mir aber heute schon ein Buch zu objektorientierter Programmierung mit Python bestellt und solange ich warte will ich mir die Zeit mit GUI-Programmierung vertreiben. :)

Das hab ich vergessen auszubessern im Pastebin:

Code: Alles auswählen

if __name__ == "__main__":
    StartMainApp = MainApp()
    StartMainApp.main()
Wäre trotzdem sehr dankbar wenn einer eventuell weiß woran das liegt ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Naja, erstmal: wo bleibt das Minimalbeispiel? Selbst wenn ich deinen Code ausbessere kommt ein ``AttributeError`` weil natürlich ``MainApp`` keine ``main``-Methode hat. Woher auch. Und selbst wenn, dann würde auch das nicht klappen, da du die Builder-Datei nicht mitlieferst. Ab dem Punkt wird mir das zu viel Arbeit deinen Code auszubessern damit er überhaupt läuft um dann dein eigentliches Problem zu lösen. Paste doch mal ein Minimalbeispiel am besten als Gist hier, insbesondere wenns mehrere Dateien sind. Dann kann man das simpel runterladen und ausprobieren.

Und BlackJack hat das auch schon angedeutet. Du solltest erstmal etwas über OOP lernen. Der Grund warum Command nicht funktioniert ist simpel. Weil du in Zeile 30 in ``GetBuffer`` ein zweites ``MainApp``-Objekt anlegst, was natürlich mit dem ersten überhaupt nichts zu tun hat. Dort setzt du dann die Ausgaben, aber bringen tut das halt nichts, weil dein eigentliches ``MainApp``-Objekt bekommt davon nichts mit. Du musst ``Command`` daher eine Referenz auf dein ``MainApp``-Objekt mitgeben. Normalerweise würde man das mit nem Button lösen, statt mit einer Funktion ``Test`` und dann bekommt die Callback-Funktion vom ``Button`` eine Referenz auf den Button der gedrückt wurde mit und man kann darüber dann die anderen Widgets erreichen. Ich würde dir das an deinem Code demonstrieren, aber der ist ja nicht lauffähig.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sh4nks
User
Beiträge: 13
Registriert: Montag 5. März 2012, 22:08
Wohnort: Styria

Hab jetzt das Beispiel bei gist hochgeladen:
Link

Wäre nett wenn du mir zeigst wie das geht :)

mfg
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sh4nks hat geschrieben:Wäre nett wenn du mir zeigst wie das geht :)
OK, hier. Hab auch paar Sachen umbenannt, die ich sinnlos fand. Da gäbs an dem Code noch einiges zu ändern, aber hab mich jetzt mal hauptsächlich auf dein Problem konzentriert.

Und huch, bei Gist kann man sich keine Diffs anzeigen lassen? Das finde ich ja sehr schwach, hab eigentlich auf dieses Feature gehofft.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sh4nks
User
Beiträge: 13
Registriert: Montag 5. März 2012, 22:08
Wohnort: Styria

Herzlichen Dank! :)

So wie ich das jetzt mitbekommen habe wird das "app" dann durch "self" ersetzt oder?
Sry für diese komische Ausdrucksweise^^

Wie "formatiert" man eigentlich Code?
Schreibt man bei Klassen den ersten Buchstaben groß und die Methoden darin klein?
Würde mich über Tipps freuen ;)

mfg
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

sh4nks hat geschrieben: Wie "formatiert" man eigentlich Code?
Schreibt man bei Klassen den ersten Buchstaben groß und die Methoden darin klein?
Würde mich über Tipps freuen ;)
Google mal nach "PEP8" - und lies Dir das durch. Das ist der offizielle Styleguide, an den man sich wenn möglich halten sollte. :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sh4nks hat geschrieben:So wie ich das jetzt mitbekommen habe wird das "app" dann durch "self" ersetzt oder?
Sry für diese komische Ausdrucksweise^^
Nein. Die Methoden der Klasse bekommen implizit im Parameter ``self`` eine Referenz auf die Instanz der Klasse ``MainApp``. Diese Instanz leite ich einfach weiter an die andere Methode damit sie Zugriff hat auf die Widgets. Wie die Parameter heißen ist eigentlich immer ziemlich egal.

Und ja, normalerweise Klassen CamelCase und methoden_mit_unterstrichen. So wie es in dem Code ist, ist es Quark ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sh4nks
User
Beiträge: 13
Registriert: Montag 5. März 2012, 22:08
Wohnort: Styria

Hyperion hat geschrieben:Google mal nach "PEP8" - und lies Dir das durch. Das ist der offizielle Styleguide, an den man sich wenn möglich halten sollte. :-)
Danke, habs mir mal durchgelesen. Ich werde versuchen, mich so gut wie möglich dran zu halten :)
Leonidas hat geschrieben:Nein. Die Methoden der Klasse bekommen implizit im Parameter ``self`` eine Referenz auf die Instanz der Klasse ``MainApp``. Diese Instanz leite ich einfach weiter an die andere Methode damit sie Zugriff hat auf die Widgets. Wie die Parameter heißen ist eigentlich immer ziemlich egal.

Und ja, normalerweise Klassen CamelCase und methoden_mit_unterstrichen. So wie es in dem Code ist, ist es Quark ;)
Ah ok, danke für deine Hilfe! :)
Antworten