2017-07-12 7 views
0

Wie würde ich mehrere Frames erstellen, die die gleichen Widgets in Tkinter haben? Grundsätzlich möchte ich 15 Kopien eines Satzes von multiple frames erstellen, die alle die gleichen Widgets wie im Bild gezeigt enthalten. Der Zweck dieses Programms ist es, dem Benutzer beim Sortieren von Fotos in Gruppen basierend auf einer spezifischen ID zu helfen Benutzer. Die Radioknöpfe sind dort für den Benutzer, jedes Foto, dh Front, Rückseite, Spitze usw. zu klassifizieren.Wie erstelle ich mehrere ähnliche Frames mit tkinter mit Klassen?

Sein nicht sehr leistungsfähiger, den Code 15mal zu kopieren und ich möchte wissen, ob es möglich ist, eine Klasse zu verwenden, um zu definieren den Rahmen einmal und den Code für jeden neuen Rahmen wiederverwenden. Ich muss verfolgen, was der Benutzer für jeden Frame macht und ihre Auswahl auf den Optionsfeldern und Kontrollkästchen für jeden Frame speichern. Nachdem alle Fotos vom Benutzer klassifiziert wurden, wird eine Schaltfläche angeklickt, die dann alle Fotos mit einer neuen ID speichern und die Informationen aus den Optionsfeldern in eine CSV-Datei speichern soll. Dann wird der nächste Stapel von Fotos geladen und der Vorgang wird wiederholt.

Ich habe ein Beispiel für den Code, den ich verwendet habe, um einen der Frames zu erstellen, das ist der Code, den ich wiederverwendbar machen möchte. Ich möchte es nicht 15 mal wiederholen müssen.

############################################################################ 
#FRAME 3 
Photo_2 = Frame(master, bg = "white",relief = RIDGE, bd = 2) 
Photo_2.grid(column = 2, row = 1, padx=5, pady=5) 
Lbl2 = Label(Photo_2,text = 'Frame 3') 
Lbl2.grid(row = 0, column = 0, columnspan = 4, pady = 5) 

# Check box 
varc2 = StringVar() 
varc2.set(0) 
Check_2 = Checkbutton(Photo_2, variable = varc2, text="Relevant?", command = lambda:Chk_Val(varc2)) 
Check_2.grid(row = 1,column = 0,columnspan = 4) 

# Photo 1 
P2 = "Photo_2.jpg" 
P2 = Image.open(P2).resize((200, 200), Image.ANTIALIAS) 
phot2 = ImageTk.PhotoImage(P2) 
panel = Label(Photo_2, image = phot2) 
panel.grid(columnspan = 3, column=1) 

# Create Multiple Radio Buttons 
Rad_Cont = Frame(Photo_2) 
Rad_Cont.grid(column = 0, row = 2) 

v2 = StringVar() 
v2.set("Address") 

for text,mode in RADIO: 
    b = Radiobutton(Rad_Cont, text=text, variable=v2, 
        value=mode, command = lambda:Rad_Val(v2)) 
    b.pack() 

################################################################################ 

Antwort

3

Natürlich ist es möglich, eine Klasse zu erstellen, um ähnliche Objekte darzustellen.

Hier ist, wie könnte ich das umsetzen, was Sie erreichen wollen:

import tkinter as tk 

class PhotoFrame(tk.Frame): 

    def __init__(self, master): 

     tk.Frame.__init__(self, master, bg='white', relief='ridge', bd=2) 

     self.label_widget() 
     self.checkbox_widget() 
     self.photo_widget() 
     self.radio_widgets() 


    def label_widget(self): 
     self.title_label = tk.Frame(self, text='Frame 3') # Or Frame 1, 2 etc. 
     self.title_label.grid(row=0, column=0, columnspan=4, pady=5) 


    def checkbox_widget(self): 
     self.varc = tk.StringVar() 
     self.varc.set(0) 

     self.checkbox = tk.Checkbutton(self, variable=self.varc, 
             text='Relevant?', command=self.Chk_Val) 
     self.checkbox.grid(row=1, column=0, columnspan=4) 


    def photo_widget(self): 
     # ... Your code here 


    def radio_widgets(self): 
     # ... Your code here 


    def Chk_Val(self): 
     # ... Your code here 

Jetzt habe ich versucht, nicht Sie die gesamte Lösung zu geben, so dass Sie den Rest von selbst lernen und herauszufinden, aber ich Ich bin sicher, dass Sie sehen können, was ich in Bezug auf die Verwendung einer Klasse verstehe. Nun kann diese Klasse PhotoFrame so oft verwendet werden, wie Sie möchten, obwohl Sie bitte verstehen, dass Sie jeden Rahmen entsprechend konfigurieren müssen, z. Ich würde die Zuweisung des Textattributs im Abschnitt weglassen (Sie möchten nicht, dass alle Ihre Frames "Frame 3" heißen), also würden Sie in Ihrer Hauptprogrammlogik jede Instanz eines PhotoFrame Objekts wie folgt konfigurieren:

frame1 = PhotoFrame(master) 
frame1.title_label.configure(text='Frame 1') # Along with any other configuration 

ich hoffe, das alles hilft - wenn Sie nicht vertraut mit den Klassen sind die mitgelieferte Dokumentation Check-out, und hier ist eine große tkinter Referenz: NMT tkinter

+0

Vielen Dank für die schnelle Antwort! Das hat definitiv geholfen. Ich habe es geschafft, eine PhotoFrame-Klasse zu erstellen, und ich rufe sie in einer anderen Hauptfensterklasse auf, in der ich jeden Frame konfiguriere. Diese Methode macht den Code viel lesbarer und modularer, nochmals vielen Dank. Das von Ihnen vorgeschlagene Lesematerial war ebenfalls sehr nützlich. –

+0

Ich bin froh, dass ich helfen konnte! – flevinkelming

Verwandte Themen