GTK Combobox

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
mbhlr0815
User
Beiträge: 2
Registriert: Dienstag 5. Februar 2013, 11:38

Hallo,

ich habe mittels glade eine xml GUI erstellt (einfach nur eine Combobox, ein filechooser, einem liststore und einem Button.
Jetzt versuche ich verzweifelt die Combobox per Code mit Daten zu füllen ... was mir auch irgendwie gelungen ist ... ich es aber trotzdem noch nicht richtig verstanden habe.
Das Liststore "liststore2" hat eine Spalte vom Type gchararray. Wenn ich jetzt versuche eine Zeile mittels self.builder.get_object('liststore2').append('MK') anzufügen, erhalte ich immer die Meldung, das die Spalte nicht groß genug ist ... wenn ich hingegen z.B. eine neue Zeile mit nur einem Zeichen erzeuge (self.builder.get_object('liststore2').append('M')) funzt es.

Ich habe jetzt nach langem Probiere herausgefunden, dass ich Zeilen mit "combobox.append_text("MK1")" erzeugen kann ... aber warum muss ich die Instant der Combobox nutzen? Ich würde die Zeilen lieber im Liststore erzeugen.

Sorry ... ich bin nicht so der Python Experte... ich komme mehr aus der Microsoft VB.NET / VB / C# /ASPX Richtung.

Zur Info:
Der gezeigte Code ist nur ein kleiner Prototype zum Testen (Tool zum flashen eines Atmel Mikrocontrollers mittels avrdude) ... also bitte nicht so sehr über den Style meckern :oops: ...

Code: Alles auswählen

#!/usr/bin/python

import gtk
import gtk.glade
import os



def addCellRenderer (control, colNr=0, renderer=None, attr='text'):
	if renderer is None:
		renderer = gtk.CellRendererText()
	control.pack_start(renderer, True)
	control.add_attribute(renderer, attr, colNr)


class myApp(object):
	def __init__(self):
		self.builder = gtk.Builder()
		self.builder.add_from_file("dialogs/main.glade")
		self.builder.connect_signals(self)
		self.frmmain = self.builder.get_object("frmmain")
		self.frmmain.show()

		#self.builder.get_object('liststore2').append('MK')
		#self.builder.get_object('liststore2').append('B')

		combobox = self.builder.get_object('cboprogrammer')
		addCellRenderer(combobox)
		combobox.append_text("MK1")				
	
	def run(self):
		gtk.main()    


	def addCellRenderer (control, colNr=0, renderer=None, attr='text'):
		if renderer is None:
			renderer = gtk.CellRendererText()
		control.pack_start(renderer, True)
		control.add_attribute(renderer, attr, col_no)



	def on_cmdFlash_clicked(self, *args):
		print ("Start flash ...")
		print (self.builder.get_object('filechooserbutton1').get_filename())
		result = os.popen("avrdude -p m8")
		out = [zeile.strip() for zeile in result]
		print(out) 		

	def on_frmmain_delete_event(self, *args):
		print("bye")		
		gtk.main_quit()



if __name__ == "__main__":
	app = myApp()
	app.run()
Zuletzt geändert von Anonymous am Dienstag 12. Februar 2013, 12:40, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@mbhlr0815: `append()` erwartet eine Sequenz mit Elementen, und zwar so viele wie Spalten da sind. 'MK' ist eine Sequenz von Elementen, und zwar von zwei Buchstaben. Das ist zu viel für zwei Spalten. Nur 'M' geht natürlich weil diese Sequenz nur ein Element hat, für die eine Spalte. Du willst eigentlich ``self.builder.get_object('liststore2').append(['MK'])`` — also eine Liste (= Sequenz) mit *einem* Element was in die eine Spalte soll.

Edit: Statt `os.popen()` sollte man das `subprocess`-Modul verwenden. Das wurde eingeführt um die ganzen anderen Low-level-Arten externe Programme zu starten, zu ersetzen. Und die Einrücktiefe stimmt nicht mit den üblichen Konventionen überein, was vier Leerzeichen pro Ebene sind. Siehe Style Guide for Python Code.
mbhlr0815
User
Beiträge: 2
Registriert: Dienstag 5. Februar 2013, 11:38

Danke BlackJack für deine schnelle Antwort ...

ich möchte eigentlich eine Combobox, mit der ich (in meinem Beispiel) z.B. ein Device auswählen kann. In der Combobox sollen z.B. die Einträge "MK1" (Index) und "MK2" (Index 1) stehen.
Ich habe mir bereits die Doku zum gtk Framework durchgelesen ... bin aber nicht wirklich schlau geworden ... zumahl es scheinbar gtk und Gtk (>3) gibt ...

Kannst du mir hier "etwas unter die Arme greifen"? Danke!

Gruß

Markus

ps.: Das mit dem subprcess war ein guter Tipp!
Antworten