Seite 1 von 1

Buttons mit for Loop erstellen und mit 2 Loop disablen

Verfasst: Montag 1. April 2019, 14:32
von matze1708
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

Re: Buttons mit for Loop erstellen und mit 2 Loop disablen

Verfasst: Montag 1. April 2019, 14:52
von Sirius3
Was soll denn die innere for-Schleife deiner Meinung nach machen?

Re: Buttons mit for Loop erstellen und mit 2 Loop disablen

Verfasst: Montag 1. April 2019, 14:55
von matze1708
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.

Re: Buttons mit for Loop erstellen und mit 2 Loop disablen

Verfasst: Montag 1. April 2019, 15:17
von Sirius3
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.

Re: Buttons mit for Loop erstellen und mit 2 Loop disablen

Verfasst: Dienstag 2. April 2019, 06:52
von matze1708
ich mag da ja auch keine Buttons drine haben,

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

Sonst nix.

Re: Buttons mit for Loop erstellen und mit 2 Loop disablen

Verfasst: Dienstag 2. April 2019, 07:00
von Sirius3
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.

Re: Buttons mit for Loop erstellen und mit 2 Loop disablen

Verfasst: Dienstag 2. April 2019, 07:17
von matze1708
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....

Re: Buttons mit for Loop erstellen und mit 2 Loop disablen

Verfasst: Dienstag 2. April 2019, 07:31
von matze1708
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)

Re: Buttons mit for Loop erstellen und mit 2 Loop disablen

Verfasst: Dienstag 2. April 2019, 08:10
von Sirius3
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.

Re: Buttons mit for Loop erstellen und mit 2 Loop disablen

Verfasst: Dienstag 2. April 2019, 08:32
von matze1708
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))

Re: Buttons mit for Loop erstellen und mit 2 Loop disablen

Verfasst: Dienstag 2. April 2019, 09:46
von Sirius3
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))