dynamisch buttons aus dictionary erzeugen

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

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

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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:

: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

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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

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
       
Antworten