dynamisch buttons aus dictionary erzeugen

Plattformunabhängige GUIs mit wxWidgets.
DocFisher
User
Beiträge: 50
Registriert: Donnerstag 29. November 2007, 21:04
Wohnort: Berlin
Kontaktdaten:

dynamisch buttons aus dictionary erzeugen

Beitragvon DocFisher » Mittwoch 30. Januar 2008, 22:28

Hallo,

mal wieder hoffe ich auf Eure Hilfe!

Ich versuche schon seit Stunden dynamisch wx.Button's zu generieren.

Problemstellung:

Dict = {1:[Wert1, Wert2, ..., Wert(n-1)], 2:[Wert2_1, .....]}
Jetzt möchte ich, dass zu jedem Key in Dict ein Button in einem Panel erzeugt wird. Aber ich schaffe es einfach nicht....

Als zweites Problem ergibt sich daraus:
Dict wird via einem Dialog erweitert. Wenn das obige Problem gelöst ist, wie kann ich dann mit Klick auf den OK-Button des Dialogs das Panel "updaten"?

Google hat mich nicht viel weiter gebracht. Deswegen wende ich mich mal wieder an Euch.
Jeglich Hilfe ist willkommen,
einen schönen Abend, Doc
Nikolas
User
Beiträge: 102
Registriert: Dienstag 25. Dezember 2007, 22:53
Wohnort: Freiburg im Breisgau

Beitragvon Nikolas » Donnerstag 31. Januar 2008, 08:15

bei Tkinter gehst etwa so, wx dürfte da nicht allzu unterschiedlich sein:

Code: Alles auswählen

root = IrgendWasAlsOberChef
for key in dict:
    einPanel = Panel(root, ... )
    einPanel.grid(column=? row=?) # wobei dann hier die dict[key]bentzt werden können
   einButton = Button(einPanel,command = dict[key][3]) # oder so
   ein Button.pack()


Wenn du jetzt noch einen Button hinzufügen willst, musst du dir entweder merken, wo du die Panels hingesetzt hast und einfach noch ein weiteres erstellen, oder (unschön), du erstellst dir eine Liste der ID der Panel und zerstörst sie dann, bevor du alle neu erstellst.
Erwarte das Beste und sei auf das Schlimmste vorbereitet.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: dynamisch buttons aus dictionary erzeugen

Beitragvon gerold » Donnerstag 31. Januar 2008, 09:32

DocFisher hat geschrieben:Dict = {1:[Wert1, Wert2, ..., Wert(n-1)], 2:[Wert2_1, .....]}
Jetzt möchte ich, dass zu jedem Key in Dict ein Button in einem Panel erzeugt wird.

Hallo DocFisher!

Ich würde eine Liste als Behälter nehmen, denn ein Dictionary hält sich nicht an die Reihenfolge.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import wx

wx.SetDefaultPyEncoding("iso-8859-15")


class MyFrame(wx.Frame):
   
    def __init__(
        self, parent = None, title = "Example", size = wx.Size(550, 420)
    ):
        wx.Frame.__init__(self, parent, -1, title, size = size)
       
        panel = wx.Panel(self)
       
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_main)
       
        buttons_def = [
            {
                "type": wx.Button, "id": -1, "label": "Button 1", "name": "btn01",
                "event": wx.EVT_BUTTON, "handler": self.on_button,
            },
            {
                "type": wx.Button, "id": -1, "label": "Button 2", "name": "btn02",
                "event": wx.EVT_BUTTON, "handler": self.on_button,
            },
            {
                "type": wx.Button, "id": -1, "label": "Button 3", "name": "btn03",
                "event": wx.EVT_BUTTON, "handler": self.on_button,
            },
        ]
        self.buttons = []
        for button_def in buttons_def:
            btn = button_def["type"](
                parent = panel,
                id = button_def.get("id", -1),
                label = button_def.get("label", wx.EmptyString),
                name = button_def.get("name", wx.ButtonNameStr)
            )
            vbox_main.Add(btn)
            if button_def.get("event", None):
                btn.Bind(button_def["event"], button_def["handler"])
            self.buttons.append(btn)
   
   
    def on_button(self, event):
        clicked_button = event.GetEventObject()
        button_name = clicked_button.GetName()
        print button_name


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


if __name__ == "__main__":
    main()

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
DocFisher
User
Beiträge: 50
Registriert: Donnerstag 29. November 2007, 21:04
Wohnort: Berlin
Kontaktdaten:

Beitragvon DocFisher » Donnerstag 31. Januar 2008, 11:27

:D
!RAWHIDE!

Ich Danke Dir, Gerold!
Und natürlich auch Dir Nikols, aber um Tkinter mache ich noch einen Bogen...
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Beitragvon sea-live » Sonntag 2. März 2008, 17:26

Guten Tag ich würde gerne das oben mit WX mal ausprobieren bisher nur tKinter

gibts da auch ne funktion mit auswahlmenüButons

Code: Alles auswählen

 symbollisten = {'tecdax':tecdax, 'mdax':mdax,'cdax':cdax,'sdax':sdax,'dax30':dax30}
           
    def auswahlbuttons(self):

        for key,value in self.symbollisten.iteritems():
            tlabel = tk.Label(self.auswahlframe, text='Symbol'+key+':')
            tlabel.pack(side=tk.LEFT)
            self.buttons.append(tlabel)
            self.optionTecdax = tk.OptionMenu(self.auswahlframe, self.var_symbol,
                                        command=self.druck,
                                        *self.value)
            self.optionTecdax.pack(side=tk.LEFT)
            self.buttons.append(self.optionTecdax)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Sonntag 2. März 2008, 21:24

sea-live hat geschrieben:gibts da auch ne funktion mit auswahlmenüButons

Hallo sea-live!

Suche in der wxPython-Demo nach "menu". Dort werden verschiedene Menüarten gezeigt.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Beitragvon sea-live » Dienstag 4. März 2008, 09:31

DANKE hat sich erledigt
Beitrag Hier http://www.python-forum.de/topic-13759.html?highlight=

Code: Alles auswählen

self.symbollisten = {'tecdax':tecdax, 'mdax':mdax,'cdax':cdax,'sdax':sdax,'dax30':dax30}
       
        wx.StaticText(self, -1, "Auswahl_Drop_down mit wxChoice.", (15, 10))
        self.wertx=10
        for key in self.symbollisten:
            wx.StaticText(self, -1, key, (self.wertx, 50), (40, -1))
            self.liste=self.symbollisten[key]
            self.liste = wx.Choice(self, -1, (self.wertx, 70),
                  choices = self.liste)
            self.Bind(wx.EVT_CHOICE, self.IhreWahl,self.liste)
            self.wertx=self.wertx+80
       

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder