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

Was noch fehlt ist ein globales setattr ...

Code: Alles auswählen

class ini_widget(object):
	def __init__(self, widget):
		####################### Initialize a Widget #######################################
		setattr(self, widget, gtkbuilder.get_object("%s" % widget))
Wenn ich das als base.ini_widget("beispielwidget") aufrufe, dann kann ich nicht aus dem anderen Skript darauf zugreifen (z.B. beispielwidget.get_text() oder so)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Chrispy hat geschrieben:Schon klar, aber dann habe ich in jeder Datei 1000 (leicht übertrieben) imports. Also gibt es kein `export' .
Du kannst ja auch schreiben

Code: Alles auswählen

from base import func1, func2
oder

Code: Alles auswählen

import base
base.func1()
Wenn du mit diesen Anmerkungen immer noch denkst, du hast sehr viele Importe (mehr als 10 aus dem package sollten es im Allgemeinen nicht sein), hast du vermutlich noch keine so saubere Struktur.

Vielleicht beschreibst oder skizzierst auch mal kurz deine Struktur, wie du dir das vorgestellt hast. (Hilft meistens auch sofort dir selbst, um gleich Fehler in der Struktur zu erkennen). Also z.B. so

Code: Alles auswählen

-base.py
  -APP_NAME
  -def main
  -class Base
-other.py
  -class MyClass
...
Chrispy hat geschrieben: 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.
Eine ComboBox hat ja schon ein Dropdown-Menü, zu was benötigst du dann noch extra ein zweites (danach?) ?
Mal ganz davon abgesehen, hört sich das nach Radio Buttons an, was du benötigst. http://graphics.sci.ubu.ac.th/api/pygtk ... ttons.html
Wenn ich voll daneben liege, solltest dein Problem noch einmal besser beschreiben ;)
Chrispy
User
Beiträge: 37
Registriert: Montag 10. September 2007, 22:43

Also du wählst in der Combobox aus WAS du einfügen willst, dann musst du aber noch ausählen WOHIN. DAS ist das Problem. Und Deshalb ist mir nichts besseres eingefallen ................................................... Ausser .... Eine Combobox mit zwei Spalten

[PS1] [P_C]
[xxx] [xxx]
[abc] [abc]

.... Aber seltsam ist das auch.

Struktur: bs-ng als das skript das als `bashstyle' ausgeführt wird und den Rest lädt.
base.py enthält die Basis (init_gettext, init_gtkbuilder, init_gconf, init_rest, ini_widget, check_lockfile, write_lockfile, get_value)

und dann je ein Modul je Subprogramm (BashStyle-NG besteht aus mehreren ehemals eigenständigen Programmen und mehreren Gruppen, also style.py alias.py advanced.py readline.py extras.py profile.py vim.py nano.py custom.py ls.py)
Zuletzt geändert von Chrispy am Donnerstag 5. November 2009, 22:50, insgesamt 1-mal geändert.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Chrispy hat geschrieben:Ich habs:

Code: Alles auswählen

global APP_NAME
APP_NAME = "bashstyle" 
Na geht doch :D
``global`` sollte man nicht verwenden! Mach das über imports, ``global`` ist viel zu magisch. Vor allem modulübergreifend (wusste gar nicht, dass das geht...).

Dein zweites Beispiel mit dem ``setattr`` ist mir schleierhaft. Mir keimt allmählich der Gedanke auf, dass du das Grundprinzip von OO nicht so richtig verstanden hast.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Chrispy hat geschrieben:Also du wählst in der Combobox aus WAS du einfügen willst, dann musst du aber noch ausählen WOHIN. DAS ist das Problem. Und Deshalb ist mir nichts besseres eingefallen ................................................... Ausser .... Eine Combobox mit zwei Spalten

[PS1] [P_C]
[xxx] [xxx]
[abc] [abc]

.... Aber seltsam ist das auch.
1 Combo, 2 RadioButtons und 1 Button finde ich da die am geeignetsten. (Dürfte ja klar sein, was die jew. Elemente dann machen sollen, od?)
Chrispy
User
Beiträge: 37
Registriert: Montag 10. September 2007, 22:43

Nunja ini_widget war einfach eine Lösung um weniger tippen zu müssen, also statt

self.beispielwidget = gtkbuilder.get_object("beispielwidget")

einfach ini_widget("beispielwidget")

Ich habe kein Problem dass "normal" zu machen, aber so sieht's halt besser aus und beugt Sehnenscheidenendzündungen vor ;)

_______
Combo = was
Radiobuttons = wohin
Button = mach schon

Oder?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Chrispy hat geschrieben:Nunja ini_widget war einfach eine Lösung um weniger tippen zu müssen, also statt

self.beispielwidget = gtkbuilder.get_object("beispielwidget")

einfach ini_widget("beispielwidget")

Ich habe kein Problem dass "normal" zu machen, aber so sieht's halt besser aus und beugt Sehnenscheidenendzündungen vor ;)
Jetzt ist mir klar, was du damit willst. Allerdings kann das so nicht funktionieren (vermute immer noch, dass dir das Arbeiten mit Klassen und Instanzen nicht ganz klar ist). Außerdem "sieht" das überhaupt nicht besser aus, das ist viel zu magisch.
Hier eine (IMHO noch zu magische, aber vllt findest du das ja i.O.) Alternative. Vielleicht hilft dir das auch, OO besser zu verstehen.

Code: Alles auswählen

class Initiator(object):
    def __init(self, gtkbuilder):
        self.builder = gtkbuilder
    
    def init_widget(objects):
        for obj in objects:
            setattr(self, obj, self.builder.get_object(obj))
            
class MainWindow(Initiator):
    def __init__(self, builder):
        Initiator.__init__(self, builder)
        self.init_widget(['entry1', 'entry2', 'radio1'])

class OptionWindow(gtk.Window, Initiator):
    def __init__(self, builder):
        Initiator.__init__(self, builder)
        gtk.Window.__init__(self)
        self.init_widget(['hbox1', 'text_field'])
Edit: SyntaxError gefixt
Edit2: ``load_objects`` wäre vllt ein besserer Name als ``init_widget``, hab mich da von dir verleiten lassen :wink:
Chrispy hat geschrieben: _______
Combo = was
Radiobuttons = wohin
Button = mach schon

Oder?
Genau!
BlackJack

@ice2k3: ``global`` auf Modulebene funktioniert auch nicht so wie der OP sich das denkt. Das ist auf Modulebene eine Nulloperation und bewirkt rein gar nichts.
Chrispy
User
Beiträge: 37
Registriert: Montag 10. September 2007, 22:43

Gut. Habe den Code jetzt überarbeitet. Zwei Radiobuttons kümmern sich jetzt darum, in welchen Puffer der Text soll. Aber was mir noch nicht gefällt, sind styles_pc{} (Zeile 2305) und styles_ps1{} (Zeile 2408). Evtl hat da jemand einen Verbesserungsvorschlag?

http://bashstyle-ng.googlecode.com/svn/ ... bsng.py.in
Antworten