Seite 1 von 1

Auflistung

Verfasst: Montag 21. August 2006, 22:32
von Spaten
Hey Leute!
Ich habe da mal eine Frage, und zwar
möchte ich den Inhalt einer verschachtelten Liste
in einer WX-Gui ausgeben, z.B.
[[wert1,wert2,wert3],[wert1,wert2,wert3],[wert1,wert2,wert3]]

Dies soll möglichst so ähnlich aussehen und anklickbar(also bei Klick Methode aufrufen) sein:
Bild

wie heißt denn das dazugehörige WX-Element? ich werde aus der Doku nicht ganz schlau...

...und schonmal danke für eure Mühen... :)

Verfasst: Montag 21. August 2006, 23:10
von DatenMetzgerX
wx.gizmos.TreeListCtrl

Verfasst: Dienstag 22. August 2006, 07:14
von Spaten
Danke für die schnelle Hilfe! :D
Allerdings weiß ich nicht, wie ich an dieses Element rankomme...
ich habs mit wx.TreeCtrl probiert, aber das sieht so aus:
Bild

ich hätte es aber lieber so::lol:
Bild

Ich kann in der Referenz nichts mit wx.gizmo finden, kann mir da bitte jemand helfen

Re: Auflistung

Verfasst: Dienstag 22. August 2006, 08:03
von gerold
Spaten hat geschrieben:wie heißt denn das dazugehörige WX-Element? ich werde aus der Doku nicht ganz schlau...
Hi Spaten!

Dazu brauchst du das "ListCtrl".
Wenn ich nicht weiß, was ich verwenden soll, dann sehe ich mir die wxPython-Demo durch. Dann finde ich immer ein passendes Widget.

mfg
Gerold
:-)

Verfasst: Dienstag 22. August 2006, 11:01
von rayo
Hi

Du kannst das Beispiel von meinen beiden Posts in einem früheren Beitrag nehmen.

VirtualListCtrl vom ersten Beitrag und DataSource vom zweiten.

Auf einen Klick kannst du einfach beim init der Liste noch ein Bind mit dem richtigen Event machen.


Gruss

*edit* eigentlich könnt ich ja das bsp schnell reinkopieren
Kannst das einfach mal austesten

Code: Alles auswählen

import wx 
import sys, glob, random 
import data 

class DataSource: 
    def __init__(self): 
        self.data = [(str(x),str(x),'test','noch mehr eintraege') for x in xrange(10000)] 
    def GetColumnHeaders(self): 
        return ['x','y','teststring','str'] 
    def GetCount(self): 
        return len(self.data) 
    def GetItem(self, index): 
        return self.data[index] 
    def UpdateCache(self, start, end): 
        pass

class VirtualListCtrl(wx.ListCtrl): 
    def __init__(self, parent, dataSource): 
        wx.ListCtrl.__init__(self, parent, \ 
                             style=wx.LC_REPORT|wx.LC_SINGLE_SEL|wx.LC_VIRTUAL) 
        self.dataSource = dataSource 
        self.Bind(wx.EVT_LIST_CACHE_HINT, self.DoCacheItems) 
        self.SetItemCount(dataSource.GetCount()) 
        columns = dataSource.GetColumnHeaders() 
        for col, text in enumerate(columns): 
            self.InsertColumn(col, text) 
    def DoCacheItems(self, evt): 
        self.dataSource.UpdateCache(evt.GetCacheFrom(), evt.GetCacheTo()) 
    def OnGetItemText(self, item, col): 
        data = self.dataSource.GetItem(item) 
        return data[col] 
    def OnGetItemAttr(self, item): 
        return None 
    def OnGetItemImage(self, item): 
        return -1 

class DemoFrame(wx.Frame): 
    def __init__(self): 
        wx.Frame.__init__(self, None, -1, "Virtual wx.ListCtrl", size=(600,400)) 
        self.list = VirtualListCtrl(self, DataSource()) 

app = wx.PySimpleApp() 
frame = DemoFrame() 
frame.Show() 
app.MainLoop()

Verfasst: Dienstag 22. August 2006, 16:06
von Spaten
Ah danke Leute ich habs hinbekommen! :D :D
freu mir echt n Keks :mrgreen:

So hab ichs gemacht:

Code: Alles auswählen

import wx.gizmos as gizmos      # für die Playlist
....
self.playlist = gizmos.TreeListCtrl(self,-1,(0,300),(1024,250))
self.playlist.AddColumn("Titel")
self.playlist.AddColumn("Interpret")
self.playlist.AddColumn("Album")
self.playlist.AddColumn("Genre")
self.playlist.AddColumn("Dauer")
self.playlist.AddColumn("Dateiname")
hab aber nochmal ne kleine Frage:
(is zwar nciht ganz so wichtig, aber..)
Kann man die Hintergrundfarbe von wx.Frames und wx.Buttons
ändern? dass ise nicht mehr grau, sondern Schwarz mit weißer oder roter
Schrift sind? :roll:

wär cool

Verfasst: Dienstag 22. August 2006, 16:39
von DatenMetzgerX

Code: Alles auswählen

In [1]: import wx

In [2]: app = wx.PySimpleApp()

In [3]: frame = wx.Frame(None)

In [4]: frame.SetBackgroundColour("Black")
Out[4]: True

In [5]: frame.Show()
Out[5]: True

In [6]: app.MainLoop()
Funktioniert vermutlich auch für buttons ;)

Edit... Jop geht...

Code: Alles auswählen

In [1]: import wx

In [2]: app = wx.PySimpleApp()

In [3]: frame = wx.Frame(None)

In [4]: panel = wx.Panel(frame)

In [5]: button = wx.Button(panel)

In [6]: button.SetBackgroundColour("red")
Out[6]: True

In [7]: frame.Show()
Out[7]: True

In [8]: app.MainLoop()

Verfasst: Dienstag 22. August 2006, 17:26
von Spaten
oh cool danke!
Kann man auch die Schriftfarbe auf den Buttons ändern?

Verfasst: Dienstag 22. August 2006, 18:28
von DatenMetzgerX
@Schriftfarbe

http://www.python-forum.de/topic-7003.html

hat das gleiche PRoblem ;)

Verfasst: Dienstag 22. August 2006, 22:46
von Spaten
ah cool das wurde ja sogar gelöst... :D

jetzt hab ich aber nochmal ne allerletzte Frage:
(echt die letzte zu diesem Thema, versprochen)

und zwar hab ich jetzt die TreeListCtrl mit Columns gefüllt
möchte aber nun Listeneinträge hunzufügen, werde aus der Doku aber
wiedemal nicht schlau. Kann mir da jemand helfen? :roll:

Code: Alles auswählen

self.playlist = gizmos.TreeListCtrl(self,-1,(0,300),(1024,250))
self.playlist.AddColumn("Titel")
self.playlist.AddColumn("Interpret")
self.playlist.AddColumn("Album")

Verfasst: Mittwoch 23. August 2006, 07:56
von Francesco
Spaten hat geschrieben:ah cool das wurde ja sogar gelöst... :D

jetzt hab ich aber nochmal ne allerletzte Frage:
(echt die letzte zu diesem Thema, versprochen)

und zwar hab ich jetzt die TreeListCtrl mit Columns gefüllt
möchte aber nun Listeneinträge hunzufügen, werde aus der Doku aber
wiedemal nicht schlau. Kann mir da jemand helfen? :roll:

Code: Alles auswählen

self.playlist = gizmos.TreeListCtrl(self,-1,(0,300),(1024,250))
self.playlist.AddColumn("Titel")
self.playlist.AddColumn("Interpret")
self.playlist.AddColumn("Album")
mit InsertItem oder AppendItem.
Im Demo sieht man ein schönes Sample.

Kannst ruhig noch mehr fragen, Platz ist genug hier. :)

Verfasst: Mittwoch 23. August 2006, 09:40
von pr0stAta
Halli Hallo, ich hatte zu genau zu diesem Thema mal ein kleines
Projekt. Hier mal der Code mit ein paar Kommentaren.
Ein Gemisch aus eigenem Code und der WX Demo die nicht
alle Infos bot, die ich brauchte.
Was zeigt das Script?
Eine ListCtrl das auf einem Panel liegt. DIeses liegt auf einem Frame.
Die ListCtrl bekommt in 2 Spalten einträge. Diese lassen sich
beide ordnen. Es gibt eine Farbunterscheidung und das Ändern der Größe
der Spalten wird unterbunden. Klick, Doppelklick und Rechtsklick
Events werden abgefangen.

Code: Alles auswählen

import wx, sys
import  wx.lib.mixins.listctrl  as  listmix

ID_LISTCTRL                 = wx.NewId()

musicdata = {
1 : ("Bad English", "The Price Of Love", "Rock"),
2 : ("DNA featuring Suzanne Vega", "Tom's Diner", "Rock"),
3 : ("George Michael", "Praying For Time", "Rock"),
4 : ("Gloria Estefan", "Here We Are", "Rock"),
5 : ("Linda Ronstadt", "Don't Know Much", "Rock"),
6 : ("Michael Bolton", "How Am I Supposed To Live Without You", "Blues"),
7 : ("Paul Young", "Oh Girl", "Rock"),
8 : ("Paula Abdul", "Opposites Attract", "Rock"),
9 : ("Richard Marx", "Should've Known Better", "Rock"),
}

class Gui(wx.Frame, listmix.ColumnSorterMixin):
  def __init__(self):
    wx.Frame.__init__(self, None, -1, 'Test', (300,300), (240, 300), style=wx.MINIMIZE_BOX | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX)
    panel = wx.Panel(self, -1)

    # Online/Offline Dictionary
    self.operations = {}

    #Aufruf der ListCtrl Klasse
    #zum Darstellen der Friendsliste
    self.list = TestListCtrl(panel, ID_LISTCTRL, style=wx.LC_REPORT #| wx.BORDER_SUNKEN
                                              | wx.BORDER_NONE #| wx.LC_EDIT_LABELS
                                              | wx.LC_VRULES #| wx.LC_SORT_ASCENDING
                                              | wx.LC_HRULES | wx.LC_SINGLE_SEL
                                              )
    self.itemDataMap = {}
    listmix.ColumnSorterMixin.__init__(self, 3)


    #Benennung der Header
    self.list.InsertColumn(0, "Spalte 1")
    self.list.InsertColumn(1, "Spalte 2")
    self.list.SetColumnWidth(0, 170)
    self.list.SetColumnWidth(1, 48)

    self.column = -1

    #Bindings
    self.Bind(wx.EVT_LIST_ITEM_SELECTED,  self.item_select,        id=ID_LISTCTRL)
    self.Bind(wx.EVT_LIST_COL_BEGIN_DRAG, self.column_drag,        id=ID_LISTCTRL)
    self.Bind(wx.EVT_LIST_COL_CLICK,      self.column_click,       id=ID_LISTCTRL)

    self.list.Bind(wx.EVT_LEFT_DCLICK,         self.on_double_click)
    self.list.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.on_right_click)

    self.insertUsersIntoListCtrl()

  def insertUsersIntoListCtrl(self):
    #Daten in die ListCtrl einfuegen
    items = musicdata.items()
    for key, data in items:
        index = self.list.InsertImageStringItem(sys.maxint, data[0], 0)
        self.list.SetStringItem(index, 1, data[1])
        self.list.SetItemData(index, key)


    #Farbunterscheidung von Eintraegen
    length = self.list.GetItemCount()
    for x in range(length):
      if self.list.GetItem(x, 1).GetText() == "BLAU":
        self.list.SetItemTextColour(x, wx.BLUE)
      else:
        self.list.SetItemTextColour(x, wx.RED)

  #Methoden zum Ordnen der ListCtrl
  def column_click(self, event):
    lastColumn = self.column
    self.column = event.m_col
    if self.column == lastColumn:
      temp = self.lower
      self.lower = self.higher
      self.higher = temp
    else:
      self.lower = -1
      self.higher = 1
    self.list.SortItems(self.column_sorter)

  def column_sorter(self, key1, key2):
    data1 = musicdata[key1]
    data2 = musicdata[key2]
    if data1 == data2:
      return 0
    elif data1 < data2:
      return self.lower
    else:
      return self.higher

  #Pflichtmethode der ColumnSorterMixin Klasse
  def GetListCtrl(self):
    return self

  #Methoden der Click Events
  def item_select(self, event):
    self.currentItem = event.m_itemIndex
    print "Ausgewaehlt wurde Eintrag Nummer " + str(self.currentItem) + \
          " mit dem Inhalt " + self.list.GetItem(self.currentItem, 0).GetText()

  def on_double_click(self, event):
    print "DOPPELKLICK"

  def on_right_click(self, event):
    print "Rechtsklick"

  #Verhindert das Veraendern der Groesse der Spalten
  def column_drag(self, event):
    print "Es wird versucht, die Groesse der Spalten \
           zu aendern... Event kann mit event.Veto() fuer \
           die jeweilige Spalte abgefangen werden"
    
    if event.GetColumn() == 0 or event.GetColumn() == 1:
      event.Veto()



class TestListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
  def __init__(self, parent, ID, pos=(0,0), size=(234,300), style=0):
    wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
    listmix.ListCtrlAutoWidthMixin.__init__(self)
    
    
class TestClass(wx.App):
  def OnInit(self):
    gui = Gui()
    gui.Show()
    return True

if (__name__ == '__main__'):
    app = TestClass(False)
    app.MainLoop()
Gruss prosta

Verfasst: Mittwoch 23. August 2006, 12:24
von Spaten
ah wie cool! Danke:D werds mir ansehen
vielen Dank!!! :)

Verfasst: Mittwoch 23. August 2006, 16:45
von DatenMetzgerX
Spaten hat geschrieben:ah cool das wurde ja sogar gelöst... :D

jetzt hab ich aber nochmal ne allerletzte Frage:
(echt die letzte zu diesem Thema, versprochen)

und zwar hab ich jetzt die TreeListCtrl mit Columns gefüllt
möchte aber nun Listeneinträge hunzufügen, werde aus der Doku aber
wiedemal nicht schlau. Kann mir da jemand helfen? :roll:

Code: Alles auswählen

self.playlist = gizmos.TreeListCtrl(self,-1,(0,300),(1024,250))
self.playlist.AddColumn("Titel")
self.playlist.AddColumn("Interpret")
self.playlist.AddColumn("Album")
Beim treelistctrl musst du aber noch die main column setzen bevor du items hinzufügen kannst (+ root item)

Code: Alles auswählen

       self.AddColumn(_("Konto"))
        self.SetColumnWidth(0, 150)
        i = 1
        for month in data.MonthList():
            self.AddColumn(month)
            self.SetColumnAlignment(i, 1)
            self.SetColumnWidth(i, 75)
            i+=1
        self.SetMainColumn(0)     #Maincolumn setzen (in welcher der tree ist)
        self.root = self.AddRoot(_("Konten"))    #Rootitem hinzufügen
        item = self.AppendItem(parent, k.get_name())    #Einzelnes Element hinzufügen