Dynamische Layout

Plattformunabhängige GUIs mit wxWidgets.
RonnyO.
User
Beiträge: 6
Registriert: Freitag 6. Februar 2009, 08:40

Dynamische Layout

Beitragvon RonnyO. » Freitag 24. April 2009, 14:38

Hallo liebes Forum!

Ich habe eine kleine GUI erstellt... soweit nichts besonderes. Darin erstelle ich in einer For-Schleife 3 Labels, die ich in meine "Collection" Labels einfüge. Die Collection ist einfach eine Liste... Ich habe auch einen Event-Handler zu jedem Label hinzugefügt. Wenn man auf ein Label klickt ändert sich die Hintergrundfarbe des panels....

was nun zu meinem eigentilchen Problem führt. Ich will nicht die Hintergrundfarbe des panels ändern ich will die Hintergrundfarbe des Label auf das ich geklickt habe ändern. Wie weiß der Eventhandler aber von welchem Label aus der Klick ausgeführt wurde?? Wie muss ich den Eventhandler schreiben, damit immer das Label, auf das ich klicke eine andere Farbe bekommt?

Ich will ja nur einen Eventhandler haben, der alle Klick-Events auf eines der Labels behandelt, und eben das Aussehen des geklickten Labels ändert..

anbei mal mein Code:

Code: Alles auswählen

import wx
import wx.lib.stattext

class MyFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, 'wx.lib.stattext.GenStaticText',(300, 150), (320, 250))
       

        self.panel = wx.Panel(self)
        self.panel.SetBackgroundColour("white")
       
        self.labels =[]
        for label in range(3):
            self.labels.append(wx.lib.stattext.GenStaticText(self.panel, -1, 'Label', (label * 35 + 5, 8)))
            self.labels[label].Bind(wx.EVT_LEFT_DCLICK, self.labelClick, self.labels[label])
            self.labels[label].SetBackgroundColour('red')

        self.Show(True)

    def labelClick(self,event):
        self.panel.SetBackgroundColour('yellow')
        self.Refresh()

application = wx.PySimpleApp()
window = MyFrame()
application.MainLoop()


Was ist der Sinn des Ganzen...

Ich möchte eine GUI, bei der ich beliebig viele Labels machen kann, die dann auf Klick ihre Farbe ändern. Die Position der Labels wird mit einer noch ausstehenden Methode festgelegt, je nachdem wieviele Labels es dann sind. Dadurch muss ich die Labels nicht händisch positionieren. Sollte ich 500 labels benötigen, dann mache ich halt 10 Zeilen zu 50 Labels und sollte ich nur 300 brauchen, dann eben 10 zeilen mit 30 Labels... oder wie auch immer... und jedes Label ist über die Collection labels zu erreichen... jedenfalls sollte jedes Label bei klick seine Farbe ändern können und ich will nur einen Eventhandler dafür.

Vielleicht kann ja wer helfen?

Danke und LG

Roland
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 24. April 2009, 15:10

Hallo Roland!

Code: Alles auswählen

#!/usr/bin/env python
#coding: utf-8

import wx
import wx.lib.stattext

wx.SetDefaultPyEncoding("utf-8")


class MyFrame(wx.Frame):
   
    def __init__(
        self, parent = None, title = "wx.lib.stattext.GenStaticText",
        size = wx.Size(400, 300)
    ):
        wx.Frame.__init__(self, parent, -1, title, size = size)
       
        panel = wx.Panel(self)
        panel.SetBackgroundColour("white")
       
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_main)
       
        grid = wx.GridSizer(rows = 2, cols = 3)
        vbox_main.Add(grid, 1, wx.EXPAND | wx.ALL, 5)
       
        for i in xrange(6):
            label = wx.lib.stattext.GenStaticText(panel, -1, "")
            grid.Add(label, 1, wx.EXPAND | wx.ALL, 5)
            label.SetBackgroundColour("red")
            label.Bind(wx.EVT_LEFT_DCLICK, self.on_label_dclick)
       
        self.SetMinSize((200, 150))
   
   
    def on_label_dclick(self, event):
        label = event.GetEventObject()
        label.SetBackgroundColour("green")
        label.Refresh()


def main():
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()

Oder so:

Code: Alles auswählen

    def on_label_dclick(self, event):
        label = event.GetEventObject()
        red = wx.NamedColor("red")
        if label.GetBackgroundColour() == red:
            label.SetBackgroundColour("green")
        else:
            label.SetBackgroundColour("red")
        label.Refresh()

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
RonnyO.
User
Beiträge: 6
Registriert: Freitag 6. Februar 2009, 08:40

Beitragvon RonnyO. » Freitag 24. April 2009, 19:32

Was beibt hier noch zu sagen außer...

DANKE :)
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Freitag 24. April 2009, 21:08

Sag mal gerold ist Zeile 15 ASCII-Art? SCNR :twisted:
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 24. April 2009, 21:24

cofi hat geschrieben:Sag mal gerold ist Zeile 15 ASCII-Art? SCNR :twisted:

:mrgreen:
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder