Buttons mit for Loop erstellen und mit 2 Loop disablen

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
matze1708
User
Beiträge: 112
Registriert: Dienstag 12. März 2019, 11:49

Hallo,

ich habe eine Frage,
ich erstelle über eine range eine Anzahl an Buttons.
eine Teilmenge dieser Buttons soll aber direkt Disabled sein.
Wie mache ich das?

Habe das so mal angefangen:

Aus max_places kommt eine Zahl z.B. 20

aus occupied_places kommt eine Liste mit den Plätzen die belegt sind.


Code: Alles auswählen

def buttons_places(self, db, range_id):
         frame = tk.Frame(self.master)
         occupied_places = sql_aufrufe.get_occupied_place_numbers(db, range_id)
         max_places= sql_aufrufe.get_max_place_number(db, range_id)
         label = tk.Label(frame, text = "Bitte tippe auf den Platz auf dem du schießt: ", font= "Arial 12 bold")
         label.pack(padx=5, pady=5)
         
       
          
         buttons = []
            
         for i in  range(1, max_places+1):
             b = tk.Button(frame, text = i) #,command=lambda i=i: onClick(i))
             
             
             for z in occupied_places:
             
                b.config(state=tk.DISABLED)
             
             else: 
                
                b.config(state=tk.NORMAL)
             
             b.pack(padx=5, pady=5, side=tk.LEFT)
          
             
             buttons.append(b)
             
             
                    
         frame.pack(side=tk.BOTTOM)
Danke schon mal

Liebe Grüße
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Was soll denn die innere for-Schleife deiner Meinung nach machen?
matze1708
User
Beiträge: 112
Registriert: Dienstag 12. März 2019, 11:49

Sie soll diese Buttons deaktivieren die in occupied_places steht.

Aber über else, scheint es dennoch wieder auf normal gesetzt zu werden.

Ohne else, gehen alle auf Disabled.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

In `occupied_places` stehen keine Buttons. `z` wird auch gar nicht verwendet. Auch so ein Grund, warum man keine unsinnigen einbuchstabigen Variablennamen verwenden sollte. Hättest Du einen aussagekräftigen Namen verwendet, wäre Dir klar, was Du da geschrieben hast.
matze1708
User
Beiträge: 112
Registriert: Dienstag 12. März 2019, 11:49

ich mag da ja auch keine Buttons drine haben,

ich mag nur bei den enthaltenen Plätzen das Merkmal auf Disbaled setzten.

Sonst nix.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Dass Du das willst, ist klar. Aber wie willst Du das erreichen? Im Matheunterricht in der Schule hast Du mal gelernt, bei einer Aufgabe erst zu schauen, was gegeben ist. Was hast Du gegeben? Bitte mit genauer Beschreibung, was denn das wirklich ist, was Du an der Stelle, an der Du disabeln willst, gegeben hast.
matze1708
User
Beiträge: 112
Registriert: Dienstag 12. März 2019, 11:49

Gebe ich dir recht.
Gegeben wäre:

max_places hier ist nur eine Zahl z.B. 20
daraus mache ich eine Range von 1 bis 20

Dann wäre noch gegeben, occupied_places die Plätze die ggf. belegt sind. [5,4,3,2,7]

Diese würde ich dann gerne bei dem durchlauf falls die Nummer der Durchlaufes gleich ist mit der Nummer in der Liste, auf Disbaled stellen.


beim schreiben, kommt mir die Idee es dann nicht mit 2 Schleifen zu tun sondern mit if....
matze1708
User
Beiträge: 112
Registriert: Dienstag 12. März 2019, 11:49

Lösung :-)

Code: Alles auswählen

def buttons_places(self, db, range_id):
         frame = tk.Frame(self.master)
         occupied_places = sql_aufrufe.get_occupied_place_numbers(db, range_id)
         max_places= sql_aufrufe.get_max_place_number(db, range_id)
         label = tk.Label(frame, text = "Bitte tippe auf den Platz auf dem du schießt: ", font= "Arial 12 bold")
         label.pack(padx=5, pady=5)
         
       
          
         buttons = []
            
         for i in  range(1, max_places+1):
             b = tk.Button(frame, text = i) #,command=lambda i=i: onClick(i))
             
             if i in occupied_places:
                 b.config(state=tk.DISABLED)
             
                         
             b.pack(padx=5, pady=5, side=tk.LEFT)
          
             
             buttons.append(b)
             
             
                    
         frame.pack(side=tk.BOTTOM)
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Sowohl db als auch range_id sind an self gebunden und müssen nicht als Parameter übergeben werden.
`i` ist ein schlechter Name, da es sich ja um die Platznummer handelt. `b` ist `button`. Deine Leerzeichensetzung bei Keyword = ist uneinheitlich. Die richtige Anzahl ist 0.
Du hast immer noch viel zu viele Leerzeilen.
matze1708
User
Beiträge: 112
Registriert: Dienstag 12. März 2019, 11:49

nächster Versuch mit anderer Formatierung
EDIT:

Code: Alles auswählen

def buttons_places(self):
         self.frame_buttons_places = tk.Frame(self.master)
         occupied_places = sql_aufrufe.get_occupied_place_numbers(self.db, self.range_id)
         max_places= sql_aufrufe.get_max_place_number(self.db, self.range_id)
         label = tk.Label(self.frame_buttons_places, text = "Bitte tippe auf den Platz auf dem du schießt: ", font= "Arial 12 bold")
         label.pack(padx=10, pady=10)
         
         buttons = []
            
         for place in  range(1, max_places+1):
             button = tk.Button(self.frame_buttons_places, text = place , height = 4, width = 4, command=lambda button_value=place: self.get_place_from_button(button_value)) 
             
             if place in occupied_places:
                 button.config(state=tk.DISABLED)
             
                         
             button.pack(padx=3, pady=3, side=tk.LEFT)
             buttons.append(button)
                   
         self.frame_buttons_places.pack(side=tk.TOP))
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Sorgfältigkeit verhindert Fehler, weil es die Lesbarkeit erhöht:

Code: Alles auswählen

    def buttons_places(self):
        self.frame_buttons_places = tk.Frame(self.master)
        occupied_places = sql_aufrufe.get_occupied_place_numbers(self.db, self.range_id)
        max_places = sql_aufrufe.get_max_place_number(self.db, self.range_id)
        label = tk.Label(self.frame_buttons_places,
            text="Bitte tippe auf den Platz auf dem du schießt:", font="Arial 12 bold")
        label.pack(padx=10, pady=10)
        
        buttons = []
        for place in  range(1, max_places+1):
            button = tk.Button(self.frame_buttons_places, text=place, height=4, width=4,
                command=lambda place=place: self.get_place_from_button(place))
            if place in occupied_places:
                button.config(state=tk.DISABLED)
            button.pack(padx=3, pady=3, side=tk.LEFT)
            buttons.append(button)
                   
        self.frame_buttons_places.pack(side=tk.TOP))
Antworten