große Anzahl von Button macht Probleme

Fragen zu Tkinter.
Antworten
JoBi
User
Beiträge: 2
Registriert: Donnerstag 15. Mai 2008, 15:51

Hallo.

Ich habe ein Programm geschrieben welches 16x16 Button verwalten soll.
Mein Problem: Ich muss die Konfiguration der Button z.B. Hintergrundfarbe während der Laufzeit ändern.

Ich habe eine Lösung erarbeitet (auch dank diesem Forum) doch nimmt der Speicherbedarf des Programms bei jeder Aktualisierung der Button zu.

Aber hier erstmal ein bisschen Code:
Buttongenerierung:

Code: Alles auswählen

   def createWidgets(self):

        if self.y< 1 or self.x<1:
            return 0

        for i in range( self.y):
                for j in range( self.x ):
                    but = tk.Button(self,
                                    text = "    ",
                                    command = lambda x=j,y=i :
                                    self.returnID(x,y))
                    but.grid(row=i, column = j)
                    self.b.append( but )
                    self.L.append(self.b)
Ich erstelle die Button in einer Schleife und speichere den descriptor in der Liste self.b

Jetzt möchte ich die Button "updaten"

Code: Alles auswählen

    def updateWidgets(self,x,y):
        ui = x + (y*16)
        
        tk.Grid.grid_remove(self.b[ui])
        exchangeValue = returnArray(x, y)   
        
        if exchangeValue == 0:     
            but = tk.Button(self,
                           text = "    ",
                           command = lambda x=x,y=y :
                           self.returnID(x,y))
            self.b[ui] = but
            self.L[ui] = self.b
            but.grid(row = y, column = x)
            savetoarray(x, y, 0)
        else:
            but = tk.Button(self,
                            bg="red",
                            text = "    ",
                            command = lambda x=x,y=y :
                            self.returnID(x,y))
            self.b[ui] = but
            self.L[ui] = self.b
            but.grid(row = y, column = x)
            savetoarray(x, y, 1)
Ich dachte so könnte ich den Button zerstören und danach halt mit der selben Methode wie oben wieder mit verändeter Konfiguration erstellen.

Es klappt zwar, aber wenn ich alle 256 Button "update" frisst mein Programm direkt ca. 1Mb mehr Arbeitsspeicher und wird dazu noch langsamer.
Mache ich da irgendwas Falsch? Kann ich auf einen in einer Schleife erstellten Button überhaupt so zugreifen?

Oder gibt es eine andere Möglichkeit die Buttons neu zu konfigurieren.
(Ich möchte nicht alle Button selber von Hand erstellen)

danke im Voraus
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Meinst du das:

Code: Alles auswählen

import Tkinter as tk
from random import randrange

def buttonchange():
    for button in buttons:
        button.config(text=str(randrange(256)))
        button.config(bg='#'+hex(randrange(16777216))[2:].zfill(6))

buttons = []
root = tk.Tk()
for x in xrange(16):
    for y in xrange(16):
        bt = tk.Button(root,width=3,height=2,text=str(y*16+x),command=buttonchange)
        bt.grid(row=y,column=x)
        buttons.append(bt)
root.mainloop()
JoBi
User
Beiträge: 2
Registriert: Donnerstag 15. Mai 2008, 15:51

Jupp damit klappts..

Code: Alles auswählen

    def createWidgets(self):

        if self.y< 1 or self.x<1:
            return 0

        for i in range( self.y):
                for j in range( self.x ):
                    but = tk.Button(self,
                                    text = "    ",
                                    command = lambda x=j,y=i :
                                    self.returnID(x,y))
                    but.grid(row=i, column = j)
                    self.buttons.append( but )
...

Code: Alles auswählen

    def updateButton(self,x,y):       
        ui = x + (y*16)
        exchangeValue = returnArray(x, y)
               
        if exchangeValue == 1:     
            self.buttons[ui].config(bg="lightgray")
            savetoarray(x, y, 0)
        else:
            self.buttons[ui].config(bg="red")
            savetoarray(x, y, 1)
Dankeschön
Antworten