Seite 1 von 1

dynamisch buttons aus dictionary erzeugen

Verfasst: Mittwoch 30. Januar 2008, 22:28
von DocFisher
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

Verfasst: Donnerstag 31. Januar 2008, 08:15
von Nikolas
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.

Re: dynamisch buttons aus dictionary erzeugen

Verfasst: Donnerstag 31. Januar 2008, 09:32
von gerold
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
:-)

Verfasst: Donnerstag 31. Januar 2008, 11:27
von DocFisher
:D
!RAWHIDE!

Ich Danke Dir, Gerold!
Und natürlich auch Dir Nikols, aber um Tkinter mache ich noch einen Bogen...

Verfasst: Sonntag 2. März 2008, 17:26
von sea-live
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)

Verfasst: Sonntag 2. März 2008, 21:24
von gerold
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
:-)

Verfasst: Dienstag 4. März 2008, 09:31
von sea-live
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