【问题标题】:tkinter callback method not defined global name not definedtkinter 回调方法未定义全局名称未定义
【发布时间】:2017-01-13 02:03:34
【问题描述】:

我想知道为什么我通过按钮调用方法SavePVParmsCloseApplyGraph时没有定义它们。我知道如果我把它们放在__init__ 里面,它们会起作用,我的问题就解决了,但我不明白为什么它不能像现在这样起作用。我试图寻找这个问题并找到了这个Python Class: Global/Local variable name not defined 和这个Python says global name not defined 但如果我无法理解那里的答案,请原谅我。你能帮我理解为什么吗? 背景:这个类是一个顶层窗口,当我在根窗口中按下一个按钮时会弹出(这里我只是直接向你们展示顶层窗口)。它应该在我保存它时传递所有条目的字典(尚未实现)。 **另外(但如果您不想回答,则不需要回答)这是 OOP 中的一种适当的编码风格吗? (不到 1 周的时间学习 tkinter 并从 precedural python 转向 OOP python)。

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__ 之外python 不能调用它们,python 不读取整个类?我怎么能打电话给self.method,那是在__init__之外呢?谢谢!

【问题讨论】:

  • 此代码是否准确反映了您的实际代码?缩进看起来不正确。
  • 修正了正确的缩进!

标签: python class tkinter callback


【解决方案1】:

SavePVParmsCloseApplyGraph 方法属于你的类,所以你需要使用self. 告诉解释器,你想使用你类中的方法。

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

对于编码标准,您应该检查PEP 8,但只要您与您的风格保持一致,就应该没那么重要。

【讨论】:

  • 将这些方法作为类方法或作为实例方法会有什么优势或区别吗?目前我把它们作为 init 实例方法只是因为;因为我不知道。 @Lafexlos
  • 我认为你应该阅读this question and its answer。它比我解释得更好。
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2018-05-04
  • 2015-12-22
  • 2014-04-18
  • 2015-08-08
  • 2011-04-27
  • 2013-09-04
相关资源
最近更新 更多