2017-01-13 2 views
0

Я хотел бы знать, почему методы SavePVParmsClose и ApplyGraph не определены, когда я вызываю их через кнопки. Я знаю, что если я поместил их внутри __init__, они будут работать, и моя проблема будет решена, но я не понимаю, почему это не сработает так, как есть. Я попытался найти этот вопрос и нашел это Python Class: Global/Local variable name not defined и это Python says global name not defined, но простите меня, если я не могу понять ответ там. Не могли бы вы помочь мне понять, почему? Фон: этот класс - это окно верхнего уровня, которое появляется, когда я нажимаю кнопку в корневом окне (здесь я просто показываю вам, ребята, окно верхнего уровня). Он должен передавать словарь всех записей, когда я его сохраняю (еще не реализован). ** Дополнительно (но не обязательно отвечать, если вы этого не хотите), это адекватный стиль кодирования в ООП? (менее 1 недели обучения tkinter и перехода от предшествующего питона к OOP-питону).Метод обратного вызова 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 весь класс? как я могу позвонить тогда self.method, который находится за пределами __init__, затем ?. Благодаря!

+0

Этот код точно отражает ваш фактический код? Отступ выглядит неверно. –

+0

исправлено с правильным отступом! –

ответ

0

SavePVParms, Close, ApplyGraph методы принадлежат к классу, так что вам нужно использовать self. сказать переводчику, что вы хотите использовать методы из вашего класса.

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

Для кодирования STANDARTS, вы должны проверить PEP 8, но до тех пор, как вы в соответствии с вашим стилем, он должен не важно, что много.

+0

Были ли какие-либо преимущества или различия между этими методами как методами класса или методами экземпляра? В настоящее время я ставил их как методы __init__ instance только потому, что; так как я не знаю. @Lafexlos –

+0

Я думаю, вы должны прочитать [этот вопрос и его ответ] (http://stackoverflow.com/questions/17134653/difference-between-class-and-instance-methods). Это объясняет гораздо лучше, чем я могу. – Lafexlos

Смежные вопросы