2017-01-13 3 views
0

Ich würde gerne wissen, warum die Methoden SavePVParmsClose und ApplyGraph nicht definiert sind, wenn ich sie über die Schaltflächen aufrufen. Ich weiß, dass, wenn ich sie in __init__ stecke, sie arbeiten werden und mein Problem gelöst ist, aber ich verstehe nicht, warum es nicht so funktionieren würde, wie es ist. Ich habe versucht, nach dieser Frage zu suchen und fand diese Python Class: Global/Local variable name not defined und diese Python says global name not defined aber vergib mir, wenn ich die Antwort dort nicht verstehen kann. Kannst du mir helfen zu verstehen warum? Hintergrund: Diese Klasse ist ein Top-Level-Fenster, das Pop-ups, wenn ich einen Knopf im Hauptfenster drücke (hier zeige ich euch nur das Toplevel-Fenster direkt). Es soll ein Wörterbuch aller Einträge übergeben, wenn ich es speichere (noch nicht implementiert). ** Zusätzlich (aber nicht erforderlich, um zu antworten, wenn Sie nicht wollen) ist dies eine angemessene Art der Codierung in OOP? (weniger als 1 Woche lernen tkinter und Umzug von Präzedenzfall Python zu OOP Python).tkinter Callback-Methode nicht definiert globalen Namen nicht definiert

import Tkinter as tk 
import ttk 
class PVDialog(tk.Toplevel): 

    def SavePVParms(self): 
     print "saved" 
     self.destroy() 

    def Close(self): 
     self.destroy() 

    def ApplyGraph(self): 
     print 'applied' 

    def __init__(self, parent): 
     tk.Toplevel.__init__(self, parent) 
     print parent 
     self.title('PV Parameters Configuration') 
     self.geometry('800x480') 
     self.resizable(width=False, height=False) 
     self.columnconfigure(0, weight=1) 
     self.columnconfigure(1, weight=8) 
     self.rowconfigure(0, weight=1) 
     self.rowconfigure(1, weight=2) 

    # ====== FRAMES ======= 

     lb1Frame = tk.LabelFrame(self, text='Electric Properties') 
     lb1Frame.grid(row=0, column=0, sticky='ewns', pady=(15, 2), padx=(30,10)) 

     AdvFrame = tk.LabelFrame(self, text='Thermal Properties') 
     AdvFrame.grid(row=1, column=0, sticky='ewns', pady=5, padx=(30,10)) 

     pcurveFrame = tk.LabelFrame(self, text='PV Curves') 
     pcurveFrame.grid(row=0, column=1, sticky='ewns', padx=(0,30), pady=(15,5),rowspan=2) 

     ctrlFrame = tk.Frame(self) 
     ctrlFrame.grid(row=2, column=0, columnspan=2, sticky='ens', padx=20, pady=(2, 20)) 

    # ======== PARAMETER INPUT DATA FRAME ============= # 

     labelName = tk.Label(lb1Frame, text='Name', anchor='w') 
     labelCellType = tk.Label(lb1Frame, text='Cell Type', anchor='w') 
     labelPower = tk.Label(lb1Frame, text='Rated Power [W]', anchor='w') 
     labelOV = tk.Label(lb1Frame, text='Open Voltage [V]', anchor='w') 
     labelSCC = tk.Label(lb1Frame, text='Short-circuit Current [A]', anchor='w') 
     labelMPC = tk.Label(lb1Frame, text='Maximum Point Current [I]', anchor='w') 
     labelMPV = tk.Label(lb1Frame, text="Maximum point Voltage [V]", anchor='w') 
     labelSeries = tk.Label(lb1Frame, text='Cells in series', anchor='w') 
     labelPallel = tk.Label(lb1Frame, text='Cells in parallel', anchor='w') 
     labelNOCT = tk.Label(AdvFrame, text='NOCT', anchor='w') 
     labelThC = tk.Label(AdvFrame, text='Current T factor [%/K]', anchor='w') 
     labelThV = tk.Label(AdvFrame, text='Voltage T factor [%/K]', anchor='w') 
     labelThP = tk.Label(AdvFrame, text='Power T factor [%/K]', anchor='w') 

     labelName.grid(row=0, sticky='ew', padx=10, pady=2) 
     labelCellType.grid(row=1, sticky='ew', padx=10, pady=2) 
     labelPower.grid(row=2, sticky='ew', padx=10, pady=2) 
     labelOV.grid(row=3, sticky='ew', padx=10, pady=2) 
     labelSCC.grid(row=4, sticky='ew', padx=10, pady=2) 
     labelMPC.grid(row=5, sticky='ew', padx=10, pady=2) 
     labelMPV.grid(row=6, sticky='ew', padx=10, pady=2) 
     labelSeries.grid(row=7, sticky='ew', padx=10, pady=2) 
     labelPallel.grid(row=8, sticky='ew', padx=10, pady=2) 
     labelNOCT.grid(row=9 , sticky='ew', padx=10, pady=2) 
     labelThC.grid(row=10, sticky='ew', padx=10, pady=2) 
     labelThV.grid(row=11, sticky='ew', padx=10, pady=2) 
     labelThP.grid(row=12, sticky='ew', padx=10, pady=2) 

     entryName = ttk.Entry(lb1Frame, show='Default') 
     entryCellType = ttk.Combobox(lb1Frame) 
     entryPower = ttk.Entry(lb1Frame) 
     entryOV = ttk.Entry(lb1Frame) 
     entrySCC = ttk.Entry(lb1Frame) 
     entryMPC = ttk.Entry(lb1Frame) 
     entryMPV = ttk.Entry(lb1Frame) 
     entrySeries = ttk.Entry(lb1Frame) 
     entryPallel = ttk.Entry(lb1Frame) 
     entryNOCT = ttk.Entry(AdvFrame, width=23) 
     entryThC = ttk.Entry(AdvFrame, width=23) 
     entryThV = ttk.Entry(AdvFrame, width=23) 
     entryThP = ttk.Entry(AdvFrame, width=23) 

     entryName.grid(row=0, column=1, sticky='ew') 
     entryCellType.grid(row=1, column=1, sticky='ew') 
     entryPower.grid(row=2, column=1, sticky='ew') 
     entryOV.grid(row=3, column=1, sticky='ew') 
     entrySCC.grid(row=4, column=1, sticky='ew') 
     entryMPC.grid(row=5, column=1, sticky='ew') 
     entryMPV.grid(row=6, column=1, sticky='ew') 
     entrySeries.grid(row=7, column=1, sticky='ew') 
     entryPallel.grid(row=8, column=1, sticky='ew') 
     entryNOCT.grid(row=9, column=1, sticky='w', padx=(26,0)) 
     entryThC.grid(row=10, column=1, sticky='w', padx=(26,0)) 
     entryThV.grid(row=11, column=1, sticky='w', padx=(26,0)) 
     entryThP.grid(row=12, column=1, sticky='w', padx=(26,0)) 

    # ==== BUTTON COMANDS ====== 
     saveBttn = ttk.Button(ctrlFrame, text='Save', command=SavePVParms) 
     closBttn = ttk.Button(ctrlFrame, text='Cancel', command=Close) 
     applyBttn = ttk.Button(ctrlFrame, text='Apply', command=ApplyGraph) 
     saveBttn.grid() 
     closBttn.grid(row=0, column=1, padx=10) 
     applyBttn.grid(row=0, column=2, padx=(0, 10)) 

# ======== RUNNIG THE CLIENT ============ 
root = tk.Tk() 
dialog = PVDialog(root) 
root.mainloop() 

Update: Wie ich diese Frage vorlegen machte etwa, erinnerte ich mich, dass __init__ die erste Sache ist, die in der Klasse gelesen und ausgeführt, so dass deshalb die definiert sind, wenn ich sie in __init__ setzen. Ich verstehe immer noch nicht, warum Python sie nicht anrufen kann, wenn sie draußen sind __init__ liest Python nicht die ganze Klasse? wie kann ich dann anrufen self.method das ist dann außerhalb __init__?. Vielen Dank!

+0

Stimmt dieser Code genau mit Ihrem tatsächlichen Code überein? Der Einzug sieht falsch aus. –

+0

korrigiert mit korrekter Einrückung! –

Antwort

0

SavePVParms, Close, ApplyGraph Methoden sind, gehören in die Klasse, so müssen Sie self. verwenden Interpreter zu sagen, dass, Sie wollen von Klassenmethoden verwenden.

saveBttn = ttk.Button(..., command=self.SavePVParms) 

Für Standarts Codierung, sollten Sie PEP 8 überprüfen, aber so lange wie Sie mit Ihrem Stil konsistent sind, sollte es nicht wichtig, dass viel.

+0

Wäre es ein Vorteil oder ein Unterschied zwischen diesen Methoden als Klassenmethoden oder Instanzmethoden? Zur Zeit stelle ich sie als __init__ Instanz Methoden nur weil; seit ich es nicht weiß. @Lafexlos –

+0

Ich denke, du solltest [diese Frage und ihre Antwort] (http://stackoverflow.com/questions/17134653/difference-between-class-and-instance-methods) lesen. Es erklärt viel besser als ich kann. – Lafexlos

Verwandte Themen