Kontextmenu in GtkCombobox?

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Chrispy
User
Beiträge: 37
Registriert: Montag 10. September 2007, 22:43

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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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/
Chrispy
User
Beiträge: 37
Registriert: Montag 10. September 2007, 22:43

Das komplette Program gibt's hier:

ZSFDW
Zuletzt geändert von Chrispy am Mittwoch 4. November 2009, 20:00, insgesamt 1-mal geändert.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

OMG! Dieser Code ist nicht dein Ernst, oder?! :evil:
Bin echt sprachlos... Weiß nicht mal, was ich dazu noch sagen soll.
Chrispy
User
Beiträge: 37
Registriert: Montag 10. September 2007, 22:43

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. :arrow: Thread-Ende
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wo ist denn ZSFDW?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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. :arrow: Thread-Ende
Dein Code hat null Struktur. Unter Struktur verstehe ich die sinnvolle Verknüpfung von Funktionen und Klassen. 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``.
Zuletzt geändert von ms4py am Mittwoch 4. November 2009, 21:16, insgesamt 2-mal geändert.
Chrispy
User
Beiträge: 37
Registriert: Montag 10. September 2007, 22:43

ZSFDW = Zu schlecht für diese Welt
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
Chrispy
User
Beiträge: 37
Registriert: Montag 10. September 2007, 22:43

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: :evil: -> 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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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: :evil: -> 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.
Chrispy
User
Beiträge: 37
Registriert: Montag 10. September 2007, 22:43

Schön, dass wir das jetzt geklärt haben. Die eigentliche Frage des Threads ist mir ehrlich gesagt auch schon Wurst.
Chrispy
User
Beiträge: 37
Registriert: Montag 10. September 2007, 22:43

O.K. Ich hab mich jetzt wieder beruhigt :P 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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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):
...
Chrispy
User
Beiträge: 37
Registriert: Montag 10. September 2007, 22:43

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?
Chrispy
User
Beiträge: 37
Registriert: Montag 10. September 2007, 22:43

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'?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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'?

Code: Alles auswählen

from base import APP_NAME
;)
Chrispy
User
Beiträge: 37
Registriert: Montag 10. September 2007, 22:43

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.
Chrispy
User
Beiträge: 37
Registriert: Montag 10. September 2007, 22:43

Ich habs:

Code: Alles auswählen

global APP_NAME
APP_NAME = "bashstyle" 
Na geht doch :D
Antworten