2017-01-13 4 views
0

SavePVParmsCloseApplyGraph 메소드가 버튼을 통해 호출 될 때 정의되지 않은 이유를 알고 싶습니다. 나는 그들이 내 안에 __init__을 넣으면 작동하고 내 문제는 해결되지만 그것이 왜 그런 식으로 작동하지 않는지 이해하지 못한다는 것을 안다. 나는이 질문을 찾으려고 노력했는데이 Python Class: Global/Local variable name not defined과이 Python says global name not defined을 찾았지만 그 답을 이해할 수 없다면 나를 용서해주십시오. 이유를 이해하도록 도와 주실 수 있습니까? 배경 :이 클래스는 루트 윈도우에서 버튼을 누르면 팝업되는 최상위 창입니다 (여기에서는 최상위 창을 직접 보여줍니다). 저장하면 모든 항목의 사전을 전달해야합니다 (아직 구현되지 않음). ** 추가로 (그러나 원하지 않는다면 대답 할 필요는 없습니다) 이것이 OOP에서 적절한 코딩 스타일입니까? (tkinter 배우기 1 주일 이내, 선행 Python에서 OOP python으로 이동).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__이 읽고 클래스에서 실행되는 첫 번째 일이 있음을 기억했다. 나는 여전히 파이썬이 외부에 있다면 그들을 호출 할 수없는 이유를 이해하지 못한다. __init__ 파이썬이 전체 클래스를 읽지 않는가? __init__ 외부에있는 self.method을 어떻게 호출 할 수 있습니까? 감사!

+0

이 코드에는 실제 코드가 정확하게 반영되어 있습니까? 들여 쓰기가 잘못되었습니다. –

+0

올바른 들여 쓰기로 고정! –

답변

0

SavePVParms, Close, ApplyGraph 방법은 클래스에 속해있다, 그래서 당신은, 당신이 당신의 클래스에서 메소드를 사용하고자하는 통역에게 self.를 사용해야합니다.

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

standarts에 코딩의 경우 PEP 8를 확인해야하지만만큼 당신이 당신의 스타일과 일치, 그것은 중요하지 그 정도해야한다.

+0

이러한 메서드를 클래스 메서드 또는 인스턴스 메서드로 사용하는 데있어 어떤 이점이나 차이가 있습니까? 현재 나는 그것들을 __init__ 인스턴스 메소드로 두었습니다. 왜냐하면 나는 모릅니다. @Lafexlos –

+0

나는 [이 질문 및 답변] (http://stackoverflow.com/questions/17134653/difference-between-class-and-instance-methods)을 읽어야한다고 생각합니다. 내가 할 수있는 것보다 훨씬 잘 설명 해준다. – Lafexlos

관련 문제