2017-01-13 50 views
0

SavePVParmsCloseApplyGraphのメソッドが、ボタンから呼び出されたときに定義されていない理由を知りたいと思います。私はそれらを__init__の中に入れれば、彼らはうまくいくだろうと私の問題は解決されますが、それがなぜそれが動作しないのか理解できません。私はこの質問を探して、このPython Class: Global/Local variable name not definedとこのPython says global name not definedを見つけましたが、私がその答えを理解できなければ私を許します。理由を理解するのを助けてくれますか? 背景:このクラスは、ルートウィンドウのボタンを押すとポップアップするトップレベルのウィンドウです(ここではトップレベルのウィンドウを直接表示しています)。私がそれを保存すると(まだ実装されていない)すべてのエントリの辞書を渡すことになっています。 **これに加えて、OOPでのコーディングの適切なスタイルはありますか? (tkinterを学び、前のPythonからOOP pythonに移行するのに1週間以下)。tkinterコールバックメソッドが定義されていませんグローバル名が定義されていません

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() 

アップデート:私はこの質問を提出しようとして作ったので、私は__init__に入れた場合インクルードが定義されている理由ですので__init__は、クラスに読み込まれて実行される最初のものであることを思い出しました。私はまだ彼らが外にいる場合、なぜPythonがそれらを呼び出すことができないのか理解していません__init__は、Pythonは全体のクラスを読んでいないのですか? __init__の外側にあるself.methodをどうすればいいですか?ありがとう!

+0

このコードは実際のコードを正確に反映していますか?インデントが正しくないように見えます。 –

+0

は正しいインデントで固定されました! –

答えて

0

SavePVParmsCloseApplyGraphの方法は、あなたのクラスに属しているので、あなたは、あなたがあなたのクラスからメソッドを使用したいインタプリタを伝えるためにself.を使用する必要があります。コーディングstandartsについては

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

、あなたはPEP 8をチェックする必要がありますが、限り、あなたは自分のスタイルと一致しているとして、それはそれほど重要ではないはず。

+0

これらのメソッドをクラスメソッドまたはインスタンスメソッドとして使用する利点または相違はありますか?現在、私はそれらを__init__インスタンスメソッドとして置いています。私は知らないので。 @Lafexlos –

+0

私はあなたが[この質問とその答え](http://stackoverflow.com/questions/17134653/difference-between-class-and-instance-methods)を読むべきだと思います。私よりもはるかに良いことが説明されています。 – Lafexlos

関連する問題