Python Tkinter GUI "parent"未定义错误和类声明行上的错误,不确定这意味着什么



下面的代码给了我错误名称"parent",而不是在第 25 行中定义的错误名称"parent",以及一个没有具体定义的错误,即第 13 行中带有"class mainWindow"的内容。我不完全确定这些是什么意思,我是 python 和制作 GUI 的新手。我查看了 GUI 示例,找不到我做错了什么。希望有人可以帮助我调试这个。:)

import sys, Tkinter
sys.modules['tkinter'] = Tkinter
import Pmw
class Print:
    def __init__(self, text):
        self.text = text
    def __call__(self):
        print self.text
class mainWindow:
    def __init__(self,parent,balloon):
        self.balloon = Pmw.Balloon(parent)
        self.parent = parent
        self.menuBar = menuBar
        self.mainPart = mainPart
        self.buttonBox = buttonBox
    def Quit():
        root.destroy()
    menuBar = Pmw.MenuBar(parent,hull_relief = 'raised',hull_borderwidth = 1,balloon = self.balloon)
    menuBar.pack(fill = 'x')
    menuBar.addmenu('Run Control','Calibration,Download Configuration,Number of Triggers,Data Output File,Upload Configuration,Start DAQ,Quit')
    menuBar.addcascademenu('Run Control','Calibration','View and/or change the calibration',traverseSpec = 'z',tearoff = 1)
    menuBar.addmenuitem('Calibration','command','Display the DAC calibration',command = Print('display the DAC calibration'),label = 'Display DAC Calibration')
    menuBar.addmenuitem('Calibration','command','Display the calibration mask',command = Print('display the calibration mask'),label = 'Display Calibration Mask')
    menuBar.addmenuitem('Calibration','command','Change the DAC calibration',command = Print('change the DAC calibration'),label = 'Change DAC Calibration')
    menuBar.addmenuitem('Calibration','command','Change the calibration mask',command = Print('change the calibration mask'),label = 'Change Calibration Mask')
    menuBar.addmenuitem('Run Control','command','Download a configuration',command = Print('download configuration'),label = 'Download Configuration')
    menuBar.addmenuitem('Run Control','command','Set the number of triggers',command = Print('set number of triggers'),label = 'Number of Triggers')
    menuBar.addmenuitem('Run Control','command','Change the file where the data will be sent to',command = Print('set data output file'),label = 'Data Output File')
    menuBar.addmenuitem('Run Control','command','Upload a configuration',command = Print('upload a configuration'),label = 'Upload Configuration')
    menuBar.addmenuitem('Run Control','command','Start the data aquisition',command = Print('start data aquisition'),label = 'Start DAQ')
    menuBar.addmenuitem('Run Control','separator')
    menuBar.addmenuitem('Run Control','command','Close the GUI',command = Quit,label = 'Quit')
    mainPart = Tkinter.Label(parent,text = 'GUI',background = 'white',foreground = 'white',padx = 100,pady = 100)
    mainPart.pack(fill = 'both', expand = 1)
    buttonBox = Pmw.ButtonBox(parent)
    buttonBox.pack(fill = 'x')
    buttonBox.add('StartnRoot', command = Print('start root'))
if __name__ == '__main__':
    root = Tkinter.Tk()
    Pmw.initialise(root)
    root.title('pCT GUI')
    root.mainloop()

作为概述,我所做的更改是:

  1. __init__方法下移动代码
  2. __init__中删除气球作为参数
  3. self.buttonBoxself.menuBarself.mainPart的定义分别移到buttonBoxmenuBarmainPart的定义之后。
  4. 添加调用以创建类mainWindow的实例。

正如托比亚斯在他的评论中提到的那样,您需要缩进从def Quit():buttonBox.add的行。

接下来,您需要添加一行,通过在主区域添加以下行来创建类的实例

if __name__ == '__main__':
    root = Tkinter.Tk()
    parent = Pmw.initialise(root)
    root.title('pCT GUI')
    derp = mainWindow(root) # <--- create your class
    root.mainloop()

现在,您需要对类定义进行一些更改。

首先,您不需要将气球作为__init__方法的参数,因为您已在方法的第一行将其初始化为self.balloon = Pmw.Balloon(parent) __init__并且不引用参数,也从不引用传递的参数。

其次,您需要移动类变量的一些声明

def __init__(self,parent):
    self.balloon = Pmw.Balloon(parent)        
    self.parent = parent

    def Quit():
        root.destroy()
    menuBar = Pmw.MenuBar(parent,hull_relief = 'raised',hull_borderwidth = 1,balloon = self.balloon)
    menuBar.pack(fill = 'x')
    menuBar.addmenu('Run Control','Calibration,Download Configuration,Number of Triggers,Data Output File,Upload Configuration,Start DAQ,Quit')
    # ...
    # ......
    # All the calls to menuBar in the lines above stay the same
    self.menuBar = menuBar   # This needs to be called AFTER you declare the variable
                             # and make your changes to it.
    mainPart = Tkinter.Label(parent,text = 'GUI',background = 'white',foreground = 'white',padx = 100,pady = 100)
    mainPart.pack(fill = 'both', expand = 1)
    self.mainPart = mainPart  # This needs to be called AFTER you declare the variable
                              # and make your changes to it.
    buttonBox = Pmw.ButtonBox(parent)
    buttonBox.pack(fill = 'x')
    buttonBox.add('StartnRoot', command = Print('start root'))
    self.buttonBox = buttonBox   # This needs to be called AFTER you declare the variable
                                 # and make your changes to it.

相关内容

最新更新