Seite 1 von 2
Kontextmenu in GtkCombobox?
Verfasst: Dienstag 3. November 2009, 21:01
von Chrispy
Folgendes Problem, ich *brauche* ein Kontextmenu in einer GtkCombobox (beim Klick von Knopf 1):
- Das Menu heißt: cm_base
- Die Zwei Einträge: ps1 und p_c
- Die Combobox: chooser
Code: Alles auswählen
def base_menu(self, event, text):
if event.button == 1:
self.cm_base.popup(None, None, None, event.button, event.time)
self.text = text
def ps1(ps1, event):
if event.button == 1:
prompt_add(self, "ps1", self.text)
self.text = ""
self.ps1.connect("button-press-event", ps1)
def p_c(p_c, event):
if event.button == 1:
prompt_add(self, "pc", self.text)
self.text = ""
self.p_c.connect("button-press-event", p_c)
self.chooser.set_active(0)
def chooser(chooser, event):
if event.button == 1:
position = chooser.get_active()
if position == 1:
text = "\\$(count_files +f)"
elif position == 2:
text = "\\$(count_files -f)"
if position != 0:
print "%s" % text
base_menu(self, event, text)
self.countfiles.chooser("button-press-event", chooser)
Aber da passiert gar nichts. Weiß irgendjemand weiter? `changed' und `button-press-event' zusammen gehen auch nicht, da funktioniert nur `changed'. Aber das Kontextmenu ist essentiell, da es bestimmt, in welchen der beiden Textpuffer die Auswahl der Combobox hinein soll (das wird von prompt_add() erledigt dessen 1. argument ist der puffer, das 2. was hinein soll). Mit Knöpfen stellt sich das Problem (Gott sei Dank) nicht.
Danke im Vorraus.
Verfasst: Dienstag 3. November 2009, 23:33
von ms4py
Deine Code sieht sehr magisch aus und die nicht richtig (dargestellten) Einrückungen machen das noch schwieriger.
Wieso verwendest du für die Callback-Funktionen immer den gleichen Namen wie der Name des Widgets?? Das ist sehr unschön und verwirrend.
Was ist bei dir ein Eintrag? Ein Entry? Korrekte Übersetzung wäre Eingabefeld oder so ähnlich
Bring mal die Einrückungen in Ordnung und geb mal den Callback-Funktionen sinnvolle Namen, dann kann man sich das ganze mal genauer anschauen, sonst ist man nur am rätseln...
Und woher kommt eigentlich das ``self``. Eventuell wäre ein größerer Code-Ausschnitt auch hilfreich. Den kann man z.B. hier posten
http://paste.pocoo.org/
Verfasst: Mittwoch 4. November 2009, 17:49
von Chrispy
Das komplette Program gibt's hier:
ZSFDW
Verfasst: Mittwoch 4. November 2009, 18:40
von ms4py
OMG! Dieser Code ist nicht dein Ernst, oder?!
Bin echt sprachlos... Weiß nicht mal, was ich dazu noch sagen soll.
Verfasst: Mittwoch 4. November 2009, 19:08
von Chrispy
Du musst ihn ja nicht lesen. Nun, wie dem auch sei, dann versuch ichs halt alleine weiter, wenn der Code so furchbar ist, dass du nichts mehr sagen kannst. Konstruktive Kritik sieht anders aus.

Thread-Ende
Verfasst: Mittwoch 4. November 2009, 20:55
von Leonidas
Wo ist denn ZSFDW?
Verfasst: Mittwoch 4. November 2009, 21:07
von ms4py
Leonidas hat geschrieben:Wo ist denn ZSFDW?
Das wurde bearbeitet.
Hier ist der Code (mach dich auf etwas gefasst).
http://code.google.com/p/bashstyle-ng/s ... shstyle.in
Edit:
Chrispy hat geschrieben:Du musst ihn ja nicht lesen. Nun, wie dem auch sei, dann versuch ichs halt alleine weiter, wenn der Code so furchbar ist, dass du nichts mehr sagen kannst. Konstruktive Kritik sieht anders aus.

Thread-Ende
Dein Code hat null Struktur. Unter Struktur verstehe ich die sinnvolle Verknüpfung von Funktionen und Klasse
n. Damit ist eigentlich genug gesagt. Auf weitere Designfehler kann dann mal eingegangen werden, wenn dein Code wenigstens ansatzweise eine Struktur hat.
Ein Beispiel noch:
Man verwendet man für die Auswertung mehrerer Fälle (sprich switch case in anderen Sprachen) ein Dictionary und keine Folge von ``elif``s. Aber von diesem Datentyp scheinst du noch gar nichts gehört zu haben?! Speziell zur Behandlung von übergebenen Paramtern gibt es noch ``optparse``.
Verfasst: Mittwoch 4. November 2009, 21:10
von Chrispy
ZSFDW = Zu schlecht für diese Welt
Verfasst: Mittwoch 4. November 2009, 21:18
von ms4py
Chrispy hat geschrieben:ZSFDW = Zu schlecht für diese Welt
Oder:
BashStyle-NG: A useful idea poorly implemented
http://www.linux.com/archive/feature/127999
Leider sehr treffend...
P.S. Habe oben noch was geschrieben.
Verfasst: Mittwoch 4. November 2009, 21:27
von Chrispy
Der Artikel betraf nicht den Code sondern das Interface (v5.0rc) die 7.x ist damit nicht mehr vergleichbar. Achja und es wurden auch einige "major bugs" gefunden, die gar keine sind, sondern lediglich die Ahnungslosigkeit des Authors auf (insbesondere) GConf zeigen (GConf läd die Schemas nicht automatisch neu -> ergo funktionert das dann *erstmal* auch nicht, dass wurde aber als Fehler in meinem Programm gewertet, ergo poor)
Was ein switch ist weiß ich, und ich persönlich habe kein Problem mit dem Code. Über all das kann man sich endlos streiten und natürlich kann ich das ganze überarbeiten. Und dem Benutzer der nur das Interface vor der Nase hat ist der Codingstil völlig Wurst. Natürlich wäre ich überglücklich wenn du mich erleuchtest und den ultimativen Codingstil mir zu eigen machst, nur ging es darum überhaupt nicht und man kann auch etwas weniger destruktiv auftreten. Vor allem das hier:

-> Als ob ich dir den kleinen Finger abgeschnitten habe.
Nebenbei habe ich schon des öfteren Code gesehen der viel unlesbarer war. Und in erster Linie ging es mir darum. Der Rest war mir egal, da ich eh alleine dran rumwerkel, ich wusste ja nicht, dass das gleich zu Schockzuständen führt.
Verfasst: Mittwoch 4. November 2009, 21:36
von ms4py
Chrispy hat geschrieben:Der Artikel betraf nicht den Code sondern das Interface (v5.0rc) die 7.x ist damit nicht mehr vergleichbar. Achja und es wurden auch einige "major bugs" gefunden, die gar keine sind, sondern lediglich die Ahnungslosigkeit des Authors auf (insbesondere) GConf zeigen (GConf läd die Schemas nicht automatisch neu -> ergo funktionert das dann *erstmal* auch nicht, dass wurde aber als Fehler in meinem Programm gewertet, ergo poor)
Ich weiß, aber das Zitat ist trotzdem passend.
Chrispy hat geschrieben:
Was ein switch ist weiß ich, und ich persönlich habe kein Problem mit dem Code. Über all das kann man sich endlos streiten und natürlich kann ich das ganze überarbeiten. Und dem Benutzer der nur das Interface vor der Nase hat ist der Codingstil völlig Wurst. Natürlich wäre ich überglücklich wenn du mich erleuchtest und den ultimativen Codingstil mir zu eigen machst, nur ging es darum überhaupt nicht und man kann auch etwas weniger destruktiv auftreten. Vor allem das hier:

-> Als ob ich dir den kleinen Finger abgeschnitten habe.
Es gibt wohl nicht den ultimativen Stil, aber es gibt einen Unterschied zwischen Stil und *gar keinen* Stil.
Chrispy hat geschrieben:
Nebenbei habe ich schon des öfteren Code gesehen der viel unlesbarer war. Und in erster Linie ging es mir darum. Der Rest war mir egal, da ich eh alleine dran rumwerkel, ich wusste ja nicht, dass das gleich zu Schockzuständen führt.
Also dein Code ist mein persönlicher Rekord, und das mit riesigem Abstand. Und ich war wirklich geschockt... Von den noch schlimmeren will gar nichts mehr hören.
Verfasst: Mittwoch 4. November 2009, 21:41
von Chrispy
Schön, dass wir das jetzt geklärt haben. Die eigentliche Frage des Threads ist mir ehrlich gesagt auch schon Wurst.
Verfasst: Donnerstag 5. November 2009, 20:57
von Chrispy
O.K. Ich hab mich jetzt wieder beruhigt

Und jetzt eine bessere import function (...) und optparse für die Kommandozeilenargumente. Nur eine Frage: Was ist besser? Je eine Klasse je Subprogram + eine für den Aboutdialog oder eine Klasse je Gruppe von ähnlichen Funktionen? Hört sich vielleicht blöd an, aber mit Klassen habe ich nur sporadisch gearbeitet, da dieses Programm das einzige ist, in dem sie nötig wären.
Verfasst: Donnerstag 5. November 2009, 21:13
von ms4py
Also für eine Gruppe ähnlicher Funktionen würde ich keine Klasse nehmen, sondern ein Modul mit Funktionen auf Modulebene.
Und bei GUIs verwende ich jeweils eine Klasse für das Hauptfenster, für jedes größere Child-Widget und für extra Fenster. Aber ganz genau so musst du es natürlich nicht machen, passt vielleicht auch nicht bei deinem Programm.
So als Faustregel (von mir) kannst du dich auch einmal orientieren, dass eine Klasse maximal 300 Zeilen haben sollte und ein Modul 800. Wenn du deutlich über diesen Werten bist, kannst du die Elemente meistens noch sinnvoll unterteilen. Aber wie gesagt, diese Werte sind nur Richtwerte, an denen man sich orientieren kann.
P.S. Klassen solltest du immer von ``object`` ableiten, wenn sie keine andere Basisklasse haben.
Code: Alles auswählen
class MyClass(object):
...
class MySecClass(MyClass):
...
Verfasst: Donnerstag 5. November 2009, 21:16
von Chrispy
Dann eher Module.
Gut. Und zum eigentlichen Problem des Threads: Wie öffne ich ein GtkMenu als popmenu wenn ich mit den Linken Mausknopf einen Wert aus einer GtkComboBox klicke?
Verfasst: Donnerstag 5. November 2009, 22:09
von Chrispy
wenn ich beispielsweise in base.py
APP_NAME = "bashstyle"
habe und dann base.py lade, wie stelle ich dann sicher, dass das andere Skript APP_NAME kennt? Gibt's sowas wie Bashs `export'?
Verfasst: Donnerstag 5. November 2009, 22:25
von ms4py
Vermutlich kannst du die Maus-Events bei einer ComboBox nicht verarbeiten, weil GTK selbst schon auf diese reagieren muss.
Finde es aber auch sehr seltsam, was du da vor hast. Habe ich das richtig verstanden, dass man zuerst einen Eintrag in der ComboBox auswählen soll und anschließend soll automatisch das Popup-Menu erscheinen? Falls ja, finde ich das keine gute Lösung. IMHO ist das ein Verhalten, was die meisten User als störend empfinden würden. Wenn ich richtig liege mit meiner Vermutung solltest du dir vielleicht eine Alternative überlegen.
Verfasst: Donnerstag 5. November 2009, 22:26
von ms4py
Chrispy hat geschrieben:wenn ich beispielsweise in base.py
APP_NAME = "bashstyle"
habe und dann base.py lade, wie stelle ich dann sicher, dass das andere Skript APP_NAME kennt? Gibt's sowas wie Bashs `export'?

Verfasst: Donnerstag 5. November 2009, 22:28
von Chrispy
Schon klar, aber dann habe ich in jeder Datei 1000 (leicht übertrieben) imports. Also gibt es kein `export' .
Und zum Kontextmenü, nunja es gibt zwei Textpuffer (einen für PROMPT_COMMAND und PS1) und mir ist nichts besseres zur Auswahl eingefallen, als das Kontextmenü. Mit Knöpfen ist das ja kein Problem.
Verfasst: Donnerstag 5. November 2009, 22:30
von Chrispy
Ich habs:
Na geht doch
