Auflistung

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
Spaten
User
Beiträge: 52
Registriert: Samstag 27. Mai 2006, 11:35
Wohnort: Bremen
Kontaktdaten:

Montag 21. August 2006, 22:32

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... :)
Python-Version: 2.5
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Montag 21. August 2006, 23:10

wx.gizmos.TreeListCtrl
Benutzeravatar
Spaten
User
Beiträge: 52
Registriert: Samstag 27. Mai 2006, 11:35
Wohnort: Bremen
Kontaktdaten:

Dienstag 22. August 2006, 07:14

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
Python-Version: 2.5
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Dienstag 22. August 2006, 08:03

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Dienstag 22. August 2006, 11:01

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()
Benutzeravatar
Spaten
User
Beiträge: 52
Registriert: Samstag 27. Mai 2006, 11:35
Wohnort: Bremen
Kontaktdaten:

Dienstag 22. August 2006, 16:06

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
Python-Version: 2.5
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Dienstag 22. August 2006, 16:39

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()
Benutzeravatar
Spaten
User
Beiträge: 52
Registriert: Samstag 27. Mai 2006, 11:35
Wohnort: Bremen
Kontaktdaten:

Dienstag 22. August 2006, 17:26

oh cool danke!
Kann man auch die Schriftfarbe auf den Buttons ändern?
Python-Version: 2.5
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Dienstag 22. August 2006, 18:28

@Schriftfarbe

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

hat das gleiche PRoblem ;)
Benutzeravatar
Spaten
User
Beiträge: 52
Registriert: Samstag 27. Mai 2006, 11:35
Wohnort: Bremen
Kontaktdaten:

Dienstag 22. August 2006, 22:46

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")
Python-Version: 2.5
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Mittwoch 23. August 2006, 07:56

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. :)
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Mittwoch 23. August 2006, 09:40

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
Benutzeravatar
Spaten
User
Beiträge: 52
Registriert: Samstag 27. Mai 2006, 11:35
Wohnort: Bremen
Kontaktdaten:

Mittwoch 23. August 2006, 12:24

ah wie cool! Danke:D werds mir ansehen
vielen Dank!!! :)
Python-Version: 2.5
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Mittwoch 23. August 2006, 16:45

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
Antworten