Seite 1 von 1

GTK-2, Glade und ComboBox

Verfasst: Dienstag 9. März 2004, 22:35
von bmh1980
Hallo.

Langsam lerne ich dazu. Trotzdem scheine ich wieder in einer Sackgasse gelandet zu sein.

Ich habe mit Glade-2 ein GTK-GUI erstellt, dass drei ComboBoxen(?nennt man die Mehrzahl so?) enthält.

Diese sollen ihre Einträge aus einem Skript erhalten. Mit folgendem Code klappt das auch schon ganz gut.

Code: Alles auswählen

[...]

combo1 = xml.get_widget('combo1')
combotmp1 = popen('find /opt/gnome/share/themes -name gtk-2* -type d | awk -F / \'{print $6}\' | sort')
comboinhalt1 = combotmp1.readlines()
combo1.set_popdown_strings(comboinhalt1)

[...]
Allerdings habe ich bei den Einträgen dann ein recht komisches Zeichen hinten drann. Das besteht aus einem hochgestellten V und einem T. Dazu kommt, dass es aussieht, als käme nach jedem Eintrag eine Leerzeile.

Wie bekomme ich das weg?

Zur Erklärung wegen der zweiten Codezeile: listdir kann ich hier nicht nehmen, da nur Verzeichnisse angezeigt werden sollen, die ein ganz bestimmtes Unterverzeichnis enthalten. Vielleicht lässt sich das auch über Python realisieren. Nur bisher habe ich da keine Lösung gefunden.

Marcus

Verfasst: Dienstag 9. März 2004, 23:05
von Dookie
Hi bmh1980,

da sind wohl noch die "linefeeds" an den Strings.

Code: Alles auswählen

comboinhalt1 = [s.rstrip() for s in combotmp1.readlines()]
sollte es beheben.

Gruß

Dookie

Verfasst: Dienstag 9. März 2004, 23:27
von Dookie
Hallo nochmal,

hier die Pythonlösung für die Directoryliste:

Code: Alles auswählen

import os
mypath = "/opt/gnome/share/themes"
comboinhalt1 = [x[0] for x in os.walk(mypath) if 'gtk-2.0' in x[1]]
Falls du nicht die kompletten Pfade haben willst sondern nur die Verzeichnisnamen:

Code: Alles auswählen

comboinhalt1 = [x[0].split("/")[-1] for x in os.walk(mypath) if 'gtk-2.0' in x[1]]
Gruß

Dookie

Verfasst: Mittwoch 10. März 2004, 20:29
von bmh1980
Super! Funktioniert so, wie es soll. Danke.

Mir ist aber noch unklar, wie ich jetzt richtig an den ausgewählten Texte komme.

Sobald ein Eintrag ausgewählt wird, soll der Eintrag auf der Konsole (zumindest Bis alles 100 %ig funktioniert) ausgegeben werden.

Mit

Code: Alles auswählen

text = combo1.entry.get_text()
print 'Du hast '+text+' ausgewaehlt'
funktioniert das auch schon. Allerdings wird die Zeile zwei Mal ausgegeben. Das erste Mal ohne den Text aus dem ComboText und das zweite Mal mit dem Text.

Ich habe schon nach einem Gegenstück zu rstrip gesucht, bzw. Hilfe zu rstrip. Aber weder die Python-Shell, noch meine schlauen Bücher sagen mir nix dazu. :(

Marcus

Verfasst: Mittwoch 10. März 2004, 20:53
von Dookie
ich denke mal deine Funktion wird beim Mausklick 2x aufgerufen, einmal bei Mousedown, wo aber noch gar kein Text selektiert wurde, und beim Mouseup mit dem selektierten Text.

Code: Alles auswählen

text = combo1.entry.get_text()
if text:
    print 'Du hast '+text+' ausgewaehlt'
reicht um zu Testen ob ein eintrag selektiert wurde oder nicht.

Die Methode rstrip() löscht alle "Whitespaces"(space, tab, cr, lf) am Ende eines Strings. Ein Gegenstück wär

Code: Alles auswählen

testtext = "Hallo Welt!"
testtext += "\n"
Wenn Du meine Version für die Directoryliste verwendest, brauchst Du das rstrip() nicht.
Die Stringmethoden findest Du hier -> http://www.python.org/doc/current/lib/s ... thods.html oder mit pydoc str


Gruß

Dookie

Verfasst: Mittwoch 10. März 2004, 21:34
von bmh1980

Code: Alles auswählen

text = combo1.entry.get_text()
if text:
    print 'Du hast '+text+' ausgewaehlt'
Das war es. Nochmals Danke!
Dookie hat geschrieben:ich denke mal deine Funktion wird beim Mausklick 2x aufgerufen, einmal bei Mousedown, wo aber noch gar kein Text selektiert wurde, und beim Mouseup mit dem selektierten Text.
Nein. Ich habe unter Glade das Signal changed eingesetzt. Ich bin mir zwar nicht sicher, ob es richtig ist, aber dem Namen nach hörst es sich gut an.

Immerhin soll der obige Code nur dann ausgeführt werden, wenn der Eintrag geändert wurde. Ich finde, dass sich 'changed' da richtig anhört.

Gruß

Marcus