2017-11-17 2 views
2

Also würde ich gerne alle tk.Button (und Eintrag) Objekte in einem gesamten Programm zu einer Liste hinzufügen. (So, dass ich die Farben jeder Taste ändern kann, obwohl iterieren und config)Hinzufügen aller tk.Button Objekte zu einer Liste zu config

Ich bin ein Bündel von tkinter Frames wie folgt zu erstellen:

class AppClass(tk.Tk): 

    def __init__(self, *args, **kwargs): 


     # Initialising Tkinter 
     tk.Tk.__init__(self, *args, **kwargs) 
     tk.Tk.wm_title(self, 'test-program') 
     tk.Tk.geometry(self, '800x480') 

     container = tk.Frame(self) 
     container.pack(fill='both', expand=True) 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.background_theme = '2' 
     self.background_theme_to_be_written_to_file = '2' 

     self.frames = {} 

     for F in (HomePage, 
        SecondName, 
        ThirdName): 

      frame = F(container, self) 


      self.frames[F] = frame 

      frame.grid(row=0, column=0, sticky="nsew") 

      frame.configure(background=background_page) 


     self.show_frame(HomePage) 

...

app = AppClass() 

app.mainloop() 
app = None 
exit() 

Ideen ? Ich weiß .winfo_children() kann alle Objekte in einer Seite auswählen - können wir alle Objekte im Programm auswählen?

**

im Moment versuche ich so etwas wie diese Arbeit zu machen - seltsam ist es nur eine Taste auf dem Bildschirm zu wechseln (Es gibt 4):

parent.list_of_objects_in_parent = tk.Button.winfo_children(parent) 

print(parent.list_of_objects_in_parent) 

for entry in parent.list_of_objects_in_parent: 
    entry.config(bg="pink") 

** schnelles Update :

ich habe Art eine Teillösung:

self.bind("<<ShowFrame>>", self.on_show_frame) 

...

def on_show_frame(self, event): 
    self.list_of_objects_in_parent = tk.Button.winfo_children(self) 
    print(self.list_of_objects_in_parent) 
    for entry in self.list_of_objects_in_parent: 
     if type(entry) == type(self.button_to_go_to_home_page): 
      entry.config(bg="pink") 
      print("working") 
+1

Wenn ich das richtig verstanden, was Sie wollen, müssen Sie nur eine Liste in Ihrer Klasse erstellen und eine Funktion machen, die Ihr Widget erstellen und fügen Sie ihn in dieser Liste – Stephie

+0

Sie könnten zumindest alle Objekte auswählen, rekursiv unter der Annahme, 'winfo_children' funktioniert so wie du sagst. – Nae

+1

Können Sie die Widgets nicht wie in einer Liste von Widget-Objekten erstellen, wie 'für i in range (10): btn [i] = tk.Button (übergeordnete, text =" button "+ num)'? – Nae

Antwort

3

Ja, das ist möglich.

Sie können einfach .winfo_children() auf dem Tk() Fenster aufrufen, die eine Liste aller Widgets in der obersten Ebene des Fensters zurück, die Sie durchlaufen können, finden Sie unter:

from tkinter import * 

root = Tk() 

def command(): 
    for i in root.winfo_children(): 
     i.configure(bg="pink") 

entry = Entry(root) 
button = Button(root, text="Ok", command=command) 

entry.pack() 
button.pack() 

root.mainloop() 

Wenn Sie mehrere Ebenen von Widgets (IE, Frame s enthält Widgets, Toplevel Widgets) dann müssen Sie eine Art von Rekursion hinzufügen, um ALL der Widgets in Ihrem Programm zu bekommen, können wir dies mit etwas wie dem folgenden tun:

from tkinter import * 

root = Tk() 

def command(): 
    x = root.winfo_children() 
    for i in x: 
     if i.winfo_children(): 
      x.extend(i.winfo_children()) 
     i.configure(bg="pink") 

entry = Entry(root) 
button = Button(root, text="Ok", command=command) 

frame = Frame(root) 
entry2 = Entry(frame) 

top = Toplevel(root) 
entry3 = Entry(top) 

entry.pack() 
entry2.pack() 
entry3.pack() 
button.pack() 
frame.pack() 

root.mainloop() 
Verwandte Themen