beim wx.ListCtrl nichts auswählbar

Plattformunabhängige GUIs mit wxWidgets.
Antworten
daniel
User
Beiträge: 4
Registriert: Donnerstag 16. Oktober 2008, 19:44

Hallo,
Ich habe folgende Probleme:
Also bei mir kann ich beim wx.ListCtrl nichts auswählen
und scrollen auch nicht
hab python 2.5 und windows XP

Code: Alles auswählen

self.list = wx.ListCtrl(parent, -1, pos=(10,35), size=(400,150), style=wx.LC_REPORT | wx.LC_SINGLE_SEL)
BlackJack

@daniel: Beim gezeigten Quelltext wird das `ListCtrl` nicht mit Inhalt gefüllt. Dann kann man natürlich auch nichts auswählen. ;-)
daniel
User
Beiträge: 4
Registriert: Donnerstag 16. Oktober 2008, 19:44

Das wird Später gemacht.
hier mal die komplette klasse:

Code: Alles auswählen

class liste:
	def __init__(self, parent):
		self.list = wx.ListCtrl(parent, -1, pos=(10,35), size=(400,150), style=wx.LC_REPORT | wx.LC_SINGLE_SEL)
		self.list.InsertColumn(0,"Datum")
		self.list.InsertColumn(1,"Uhrzeit")
		self.list.InsertColumn(2,"Notiz")
	
	def add(self, liste):
		print liste
		
		index = self.list.InsertStringItem(sys.maxint,liste[0])
		self.list.SetStringItem(index,1,liste[1])
		self.list.SetStringItem(index,2,liste[2])
	
	def select(self, event):
		'''itemIndex = -1
		while True:
			itemIndex = self.list.GetNextItem(itemIndex,
											 wx.LIST_NEXT_ALL,
											 wx.LIST_STATE_SELECTED);
			print itemIndex
			if (itemIndex == -1):
				break
			
	 
			#Got the selected item index
			print self.list.GetItemText(itemIndex);
		'''
		temp = self.TabelleBox.GetFirstSelected()
		
		if temp is not wx.NOT_FOUND:
			idNr = self.TabelleBox.GetItemText(temp)
			termine, fehler = self.datenbank.select()
			eintrag = termine[temp]
			print eintrag
	
	def clear(self):
		self.list.DeleteAllItems()
fürs hinzufügen benutze ich dann add.
und das select sid verschiedene ausprobierereien. aber ich kann noch nicht mal eine zeile oder spalte markieren.
BlackJack

@daniel: Das ist wohl kaum die komplette Klasse. Dann fehlt das Binden von Ergeignissen an Methoden. Und selbst wenn man EVT_LIST_ITEM_SELECTED an die `selected()`-Methode bindet bekommt man dort als erstes wohl einen `AttributeError` weil es `self.TabelleBox` nicht gibt.

Zeig doch mal ein minimales Beispiel das man auch ausprobieren kann.
daniel
User
Beiträge: 4
Registriert: Donnerstag 16. Oktober 2008, 19:44

Ok. hier ist der Code.
inklusive der Haptklasse des Programms.

Code: Alles auswählen

# _*_ coding: utf-8 _*_
# _*_ coding: cp1225 _*_
# _*_ coding: cp850 _*_


import wx
import os
from wx.lib.ticker import Ticker
from wx.lib import masked
from wx.lib import colourdb
from wx.lib.plot import *
import traceback
import sys

class MyFrame(wx.Frame):
	def __init__(self):
		wx.Frame.__init__(self,None, -1,"Terminkalendar")
		self.SetSize(wx.Size(450, 320))
		self.panel = wx.Panel(self, -1)
		self.CenterOnScreen()
		menuBar = wx.MenuBar()
		menu1 = wx.Menu()
		menu1.AppendSeparator()
		menu1.Append(103, "&Beenden\tCtrl+B","")
		menuBar.Append(menu1, "&Datei")
		self.SetMenuBar(menuBar)
		self.Bind(wx.EVT_MENU,self.CloseWindow, id = 103)
		menu3 = wx.Menu()
		menu3.Append(103, "&Beenden\tCtrl+B","")
		menuBar.Append(menu3, "&Eintrag")
		self.Bind(wx.EVT_MENU,self.CloseWindow, id = 103)
		menu2 = wx.Menu()
		menu2.Append(104, "&Hilfe\tShift+H","")
		menuBar.Append(menu2, "&Hilfe")
		self.Bind(wx.EVT_MENU,self.helpfileDialog, id = 104)
		wx.StaticText(self.panel, -1, "Termine:", (10,15))
		self.neuertermin = wx.Button(self.panel, label='Neuer Termin', pos=(10, 200), size=(90, 20))                                             
		self.Bind(wx.EVT_BUTTON, self.neuer, self.neuertermin)
		self.terminloeschen = wx.Button(self.panel, label='Termin Löschen', pos=(160, 200), size=(90, 20))                                   
		self.Bind(wx.EVT_BUTTON, self.loeschen, self.terminloeschen)
		self.terminaendern = wx.Button(self.panel, label='Termin ändern', pos=(320, 200), size=(90, 20))                                             
		self.Bind(wx.EVT_BUTTON, self.aendern, self.terminaendern)
		#self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.meineliste.select, self.meineliste.list)
		
		self.meineliste = liste(self)
		self.reload()
		
	def reload(self):
		'''
			
		'''
		#self.meineliste.clear()
		#termine, fehler = self.datenbank.select()
		#print "termine", termine, fehler
		#for einTermin in termine:
		self.meineliste.add(["22.9", '11:11', "hallo"])		
		self.meineliste.add(["12.6", '15:26', "hallo"])
		
	def neuer(self, event):
		dialog=Neuertermin()
		
		dialog.ShowModal()
		tag, monat, jahr, stunde, minute, notiz = dialog.getDaten()
		
		zeit = "%s:%s" %(stunde, minute)
		datum = "%s.%s.%s" %(tag, monat, jahr)

		#print self.datenbank.add(datum, zeit, notiz)
		self.reload()
		
	def loeschen(self, event):
		self.Close()
	
	def aendern(self, event):
		temp = self.meineliste.list.GetFirstSelected()
		print temp
		if temp is not wx.NOT_FOUND:
			idNr = self.meineliste.list.GetItemText(temp)
			termine, fehler = self.datenbank.select()

			eintrag = termine[temp]
			print eintrag

	def CloseWindow(self, event):
		self.Destroy()


class liste:
	def __init__(self, parent):
		self.list = wx.ListCtrl(parent, -1, pos=(10,35), size=(400,150), style=wx.LC_REPORT | wx.LC_SINGLE_SEL)
		self.list.InsertColumn(0,"Datum")
		self.list.InsertColumn(1,"Uhrzeit")
		self.list.InsertColumn(2,"Notiz")
	
	def add(self, liste):
		print liste
		
		index = self.list.InsertStringItem(sys.maxint,liste[0])
		self.list.SetStringItem(index,1,liste[1])
		self.list.SetStringItem(index,2,liste[2])
	
	def select(self, event):
		'''itemIndex = -1
		while True:
			itemIndex = self.list.GetNextItem(itemIndex,
											 wx.LIST_NEXT_ALL,
											 wx.LIST_STATE_SELECTED);
			print itemIndex
			if (itemIndex == -1):
				break
			
	 
			#Got the selected item index
			print self.list.GetItemText(itemIndex);
		'''
		#temp = self.TabelleBox.GetFirstSelected()
		
		#if temp is not wx.NOT_FOUND:
		#	idNr = self.TabelleBox.GetItemText(temp)
		#	termine, fehler = self.datenbank.select()
		#	eintrag = termine[temp]
		#	print eintrag
	
	def clear(self):
		self.list.DeleteAllItems()

app = wx.PySimpleApp()
frame = MyFrame()
frame.Show(True)
app.MainLoop()
BlackJack

@daniel: Wenn ich Zeile 36 auskommentiere, denn `self.helpfileDialog` gibt's nicht, dann wird beim klicken auf eine der beiden Zeilen im `ListCtrl` diese Zeile auch ausgewählt.

Was kaputt ist, ist das Layout. Du solltest Dir das absolute positionieren gar nicht erst angewöhnen. Die Buttons sind zum Beispiel bei mir gar nicht zu sehen und von der Überschrift "Termine:" ist nur der Strich über dem T sichtbar -- der Rest wird vom `ListCtrl` verdeckt. So ist das unbenutzbar.
daniel
User
Beiträge: 4
Registriert: Donnerstag 16. Oktober 2008, 19:44

Du meinst Zeile 35 warscheinlich

Code: Alles auswählen

        self.Bind(wx.EVT_MENU,self.helpfileDialog, id = 104) 
Ok. vielen Dank.
mit dem absoluten Positionieren haben wir so in der Schule gelernt. und das mit den Sizern haben wir dann mal so in 1 Stunde nachgeholt. Das mit muss ich mir wohl nochmal ansehen, oder gibt es noch eine andere Methode nicht absolut zu positionieren?

Woran kann es denn liegen, dass bei mir nichts ausgewählt wird? liegt das an einer anderen Python-Version oder am wxpython? in der Schule hat das auch nicht funktioniert und ich habe die Schulinstallation mir heruntergeladen, wie es vom Lehrer uns gesagt wurde.
Antworten