String und Integer verbinden ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Wolflkoder
User
Beiträge: 28
Registriert: Sonntag 7. Dezember 2014, 15:57

Hallo,

ich würde gerne einige Tkinter-Buttons ausblenden, und würde dies gerne mit einer for-schleife realisieren

Code: Alles auswählen


def ausblenden():
        print ("ausblenden")       
        wert = 9
        for i in range (41):
                wert = wert+1
                print ('button%d'%(wert))               
                ('button%d'%(wert)).place_forget()
die vorletzte Zeile print... gibt mir alles richtig aus!
Allerdings hab ich hier ein Problem in der letzten Zeile meines Codes.
Ziel wäre:

button10.place_foget()
.
.
.
.
button50.place_forget()

wäre dankbar für einen Lösungsansatz
Sirius3
User
Beiträge: 18319
Registriert: Sonntag 21. Oktober 2012, 17:20

@Wolflkoder: Variablennamen durchzunummerieren macht man nicht. Statt dessen benutzt man Listen:

Code: Alles auswählen

def ausblenden(buttons):
    for button in buttons:
        button.place_forget()
Wolflkoder
User
Beiträge: 28
Registriert: Sonntag 7. Dezember 2014, 15:57

Hallo Sirius3


ich habe nun eine Liste erstellt:

buttons = ["button1","button2","butt.............."]

und die for-schleife angepasst.

Allerdings erhalte ich nun folgende Fehlermeldung:

missing 1 required positional argument
Wolflkoder
User
Beiträge: 28
Registriert: Sonntag 7. Dezember 2014, 15:57

wenn ich die Liste inerhalb der Funktion erstelle habe ich folgende Meldung:

AttributeError: 'str' object has no attribute 'place_forget'
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du sollst nicht eine Liste von Strings erzeugen, sondern die Tkinter Buttons in eine Liste packen.
Wolflkoder
User
Beiträge: 28
Registriert: Sonntag 7. Dezember 2014, 15:57

Ich verstehe nicht wie ich die Liste machen soll, da ja jeder Button einen eigenen "text" und ein eigenes "command" hat ?
Sirius3
User
Beiträge: 18319
Registriert: Sonntag 21. Oktober 2012, 17:20

@Wolflkoder: wenn Du eine Liste mit Strings erzeugen kannst, dann kannst Du das auch mit Buttons.
Benutzeravatar
snafu
User
Beiträge: 6895
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wolflkoder hat geschrieben:Ich verstehe nicht wie ich die Liste machen soll, da ja jeder Button einen eigenen "text" und ein eigenes "command" hat ?
Das "weiß" das Button-Objekt ja von sich aus, nachdem du es erstellt hast. Erstelle halt eine Liste von Button-Objekten, so wie du die Button-Objekte ursprünglich (vermutlich) an die Bezeichner "button1", "button2", usw binden wolltest.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Hier einmal das Rundumsorglospaket, welches hoffentlich Deine Fragen beantworten könnte. Es zeigt, wie man Buttons aus einer Liste (mit Tupeln) erzeugt, in einer Liste speichert und diese Liste zum Ein- und Ausblenden der Buttons verwendet.

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk


class MainFrame(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.buttons = []
        self.hide = None # tk.Button
        self.show = None # tk.Button
        self._init_widgets()

    def _init_widgets(self):
        for name, function in [('First Button', first),
                               ('Second Button', second),
                               ('Third Button', third)]:
            button = tk.Button(self, text=name, command=function)
            button.pack(side=tk.TOP, fill=tk.X)
            self.buttons.append(button)

        self.hide = tk.Button(self, text='Hide Buttons',
                              command=self.hide_buttons,
                              bg='#ff8080')
        self.hide.pack(side=tk.BOTTOM, fill=tk.X)
        
        self.show = tk.Button(self, text='Show Buttons',
                              command=self.show_buttons,
                              bg='#80ff80',
                              state=tk.DISABLED)
        self.show.pack(side=tk.BOTTOM, fill=tk.X)

    def show_buttons(self):
        for button in self.buttons:
            button.pack(side=tk.TOP, fill=tk.X)
        self.show.configure(state=tk.DISABLED)
        self.hide.configure(state=tk.NORMAL)

    def hide_buttons(self):
        for button in self.buttons:
            button.pack_forget()
        self.show.configure(state=tk.NORMAL)
        self.hide.configure(state=tk.DISABLED)


# Exemplary functions to be bound to the buttons
def first():
    print('First button pressed')
    
def second():
    print('Second button pressed')
    
def third():
    print('Third button pressed')

# Main Idiom
def main():
    """Program's entry-point."""
    root = tk.Tk()
    frame = MainFrame(root)
    frame.pack(fill=tk.BOTH)
    root.mainloop()

if __name__ == '__main__':
    main()
Aus Deinem Codeschnippsel folgere ich, dass Du mit Klassen und Objektorientierung noch nicht viel am Hut hattest. Diese Kenntnisse eignete ich mir an Deiner Stelle schnell an. Ansonsten würde es schnell unübersichtlich.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Wolflkoder
User
Beiträge: 28
Registriert: Sonntag 7. Dezember 2014, 15:57

Hallo bwbg,

richtig ich habe mit OoP noch nicht viel mit am Hut!
Aktuell erstelle ich meine Buttons mit "button1 = Button(main,width=15, height = 2, text="Info",bd=1,command=info)"
Da ich mehrere Buttons benötige hat das keinen Sinn so weiter zu machen.

Ich werde mich nun intensiv mit Objektorientiertem programmieren beschäftigen.
Mit deinem Code Beispiel habe ich jetzt wirklich alles was ich benötige, etzt gehts ans verstehen :-)



Viele Dank an alle für die Hilfestellungen!
Antworten