2017-12-10 1 views
0

Ich habe derzeit ein Raster von Schaltflächen mit Zeilen und Spalten (mit einer for-Schleife) und möchte in der Lage sein, auf eine dieser Schaltflächen klicken und es zurück, zum Beispiel, a1 angeklickt wird. Wie kann ich die Schaltfläche identifizieren? Ich klicke auf das Raster mit einer verschachtelten Liste von Namen? Python - .Tkinter

import tkinter as tk 
#list I need that attributes grid index to button name 
#seats=[["A", "a1", "a2", "a3", "a4", "a5"]["B", "b1", "b2", "b3", "b4", "b5"]["C", "c1", "c2", "c3", "c4", "c5"], ["D", "d1", "d2", "d3", "d4", "d5"]] 

def make_buttons(): 

    for r in range(10): 
     for c in range(10): 
      btn = tk.Button(root, text="Empty") 
      btn['command'] = lambda c=c, r=r, b=btn:red_click(c, r, b) 
      btn.grid(row=r,column=c) 

def red_click(c, r, btn): 
    print(btn, "clicked!") 
    btn.configure(bg="red") 


root = tk.Tk() 

make_buttons() 

root.mainloop() 

Ich erwarte, dass es mir zurück, welche Schaltfläche geklickt wurde. Ich habe versucht, es so zu machen, dass es es druckt, aber ich kann nicht sicher Tasten identifizieren, wie es zeigt, d.

+3

Sie können den Text auf die gleiche Weise übergeben, wie Sie die Zeilen-, Spalten- und Schaltflächeninstanz übergeben haben. – Novel

+0

senden Sie Text als Argument an 'red_click'. Wenn es Text auf Knopf ist, können Sie 'btn ['Text']' – furas

+0

BTW bekommen: die Funktion, die Knopf zugewiesen wird, kann nichts zurückbringen - es kann nur auf Bildschirm anzeigen oder Wert globaler Variable zuweisen. – furas

Antwort

1

Sie Werte für beliebige Attribute auf dem Button Objekt binden kann. Dann können Sie diesen Wert mithilfe einer Attributsuche abrufen.

Es wäre auch besser, den in der seats Liste gespeicherten Sitzplan zu verwenden, um die Schaltflächen zu erstellen. Sie können enumerate() verwenden Iterierte über die Werte zu helfen, während nach wie vor Zugriff auf die Indizes, die Sie für das Netz benötigt:

import tkinter as tk 

seats= [["A", "a1", "a2", "a3", "a4", "a5"], 
     ["B", "b1", "b2", "b3", "b4", "b5"], 
     ["C", "c1", "c2", "c3", "c4", "c5"], 
     ["D", "d1", "d2", "d3", "d4", "d5"]] 

def make_buttons(): 
    for r, row in enumerate(seats): 
     for c, seat in enumerate(row[1:]):  # N.B. skip first element 
      btn = tk.Button(root, text="Empty") 
      btn.name = seat      # arbitrary attribute on Button object 
      btn['command'] = lambda c=c, r=r, b=btn:red_click(c, r, b) 
      btn.grid(row=r,column=c) 

def red_click(c, r, btn): 
    print(btn.name, "clicked!") 
    btn.configure(bg="red") 

root = tk.Tk() 
make_buttons() 
root.mainloop() 

Für viele Objekte Python können Sie von außen „willkürlich“ Attribute für das Objekt erstellen der Klasse selbst. Z.B.

class C: 
    pass 

>>> c = C() 
>>> c.whatever 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: C instance has no attribute 'whatever' 
>>> c.whatever = 'hi there' 
>>> c.whatever 
'hi there' 
+0

Du hast mir auf zwei Arten geholfen. 1.) es funktioniert! 2.) Du hast mich eingeführt um aufzuzählen, was gebraucht wird. Danke noch einmal. –

+0

@ JohnHenderson: kein Problem. – mhawke

+0

@ JohnHenderson: Sie können in der Python-Dokumentation über 'enumerate' lesen - Link in der Antwort zur Verfügung gestellt. – mhawke

1

In red_click haben Sie Paar r,c so können Sie seats[r][c]

Verwandte Themen