Anfängerfrage bei Buttons

Fragen zu Tkinter.
Antworten
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

Dienstag 9. Januar 2007, 20:38

Ich hab schon 2 Tage danach im Internet gesucht, um eine Alternative für globals zu finden(die dann ja doch sehr schnell sehr viel Arbeitsspeicher fressen) aber nichts gefunden.
Was ich wollte ist eigentlich nur, von Definition A Argumente an Definition B geben(und letztere ausführen).
Wie kann ich das am besten realisieren?

Danke im voraus =)
BlackJack

Dienstag 9. Januar 2007, 20:50

Modulglobale Objekte verwenden nicht mehr Speicher als lokale. Der Grund keine ``global``s zu benutzen ist Übersichtlichkeit und weniger fehleranfälliger Code.

Wo genau liegt denn das Problem?
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

Dienstag 9. Januar 2007, 22:38

da problem liegt darin das ich versucht habe, den Button in etwa so aufzurufen:
Button(..., command=Defi(arg1, arg2)).pack()

dadurch wird Defi aber sofort beim Erstellen des Dialoges aufgerufen; folglich habe ich den Button so aufgerufen:
Button(..., command=Defi).pack()

was mir allerdings keine Übergabe von Argumenten an Defi ermöglicht.

Daher habe ich mit globals gearbeitet und festgestellt das bei längerem Gebrauch des Programms der verwendete Speicher von 10k am anfang auf bis zu 120k geht, je mehr Aktionen man durchführt(Da ich das bei Konsolenprogrammen nie hatte und ich dort auch nie mit globals gearbeitet habe, hab ich geschlussfolgert, dass der zunehmend gebrauchte Speicher wohl an den globals liegen muss)

Und das Problem ist jetzt, wie ich die Argumente an Defi bei einem Klick auf den Button übergeben bekomme. =(
BlackJack

Dienstag 9. Januar 2007, 23:29

Das löst man entweder durch ein "Closure" oder eine ``lambda``-Funktion wenn bei jedem Druck ein fester Wert übergeben werden soll, oder man packt das Programm in eine Klasse und die Methoden können auf gemeinsame Objekte über `self` zugreifen.

Code: Alles auswählen

import Tkinter as tk


def make_print(value):
    def print_func():
        print value
    return print_func


def print_value(value):
    print value


class Application(object):
    def __init__(self):
        root = tk.Tk()
        button_1 = tk.Button(root,
                             text='A',
                             command=lambda: print_value('Knopf A'))
        button_1.pack()
        
        button_2 = tk.Button(root,
                             text='B',
                             command=make_print('Knopf B'))
        button_2.pack()
        
        self.entry = tk.Entry(root)
        self.entry.insert(0, 'Knopf C')
        self.entry.pack()
        button_3 = tk.Button(root,
                             text='C',
                             command=self.print_entry)
        button_3.pack()
        
        root.mainloop()
    
    def print_entry(self):
        print self.entry.get()


def main():
    application = Application()
Ferox
User
Beiträge: 48
Registriert: Dienstag 14. März 2006, 16:34

Mittwoch 10. Januar 2007, 14:33

Dankedankedankedankedankedankedanke :!: :!:
:D
(Soll heißen ich habs hinbekommen :D )
Antworten