Ich habe eine tkinter-basierte GUI mit vielen Instanzen einer Klasse in einer ttk.LabelFrame
gruppiert. Die Klasse erbt von ttk.Frame
und wird unter Verwendung von .grid()
in LabelFrame
platziert. Die LabelFrame
enthält auch ttk.Labels
.Wie kann ich eine Methode für jede Instanz einer einzelnen Klasse verwenden?
Bitte sehen Sie diese sehr vereinfachtes Beispiel:
import tkinter as tk
from tkinter import ttk
class MyClass(tk.Frame):
def __init__(self, parent):
super().__init__(parent)
def MyMethod(self):
print(tk.Widget.winfo_name(self))
root = tk.Tk()
frame = ttk.LabelFrame(root, text="frame")
label = ttk.Label(frame, text="label")
class1 = MyClass(frame)
class2 = MyClass(frame)
print("class.MyMethod() calls:")
class1.MyMethod()
class2.MyMethod()
print("\ntkinter.Widget.nwinfo_children(frame):")
childlist = tk.Widget.winfo_children(frame)
print(childlist)
Die Ausgabe sieht wie folgt aus:
class.MyMethod() calls:
49250736
49252752
tkinter.Widget.nwinfo_children(frame):
[<tkinter.ttk.Label object .49250672.49252880>,
<__main__.MyClass object .49250672.49250736>,
<__main__.MyClass object .49250672.49252752>]
Ich will es so etwas wie:
for child in childlist:
child.MyMethod()
Was nicht tut Arbeit wegen der Etiketten. Oder vielleicht:
for child in childlist:
{if this is a MyClass instance}:
child.MyMethod()
Aber ich weiß nicht, ob das in die richtige Richtung geht.
Gibt es einen sauberen Weg zu tun, was ich will?
es ist keine Antwort wert 'ifinstance (Kind, MyClass):' ist, was Sie wollen, ich denke –
eine Alternative wäre 'getattr (Kind," MyMethod ", Lambda: 1)()' das könnte tatsächlich besser sein –
FWIW du kannst 'self.winfo_name()' anstelle von 'tk.Widget.winfo_name (self)' –