0

下面的代码给出了第 25 行中未定义的错误名称“父级”,以及第 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('Start\nRoot', command = Print('start root'))

if __name__ == '__main__':
    root = Tkinter.Tk()
    Pmw.initialise(root)
    root.title('pCT GUI')
    root.mainloop()
4

1 回答 1

1

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

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

因此,正如托比亚斯在他的评论中提到的那样,您需要将行从def Quit():to缩进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__方法的参数,因为您已在__init__方法的第一行将其初始化为 asself.balloon = Pmw.Balloon(parent)并且不引用参数,也不会引用传递的参数。

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

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('Start\nRoot', command = Print('start root'))

    self.buttonBox = buttonBox   # This needs to be called AFTER you declare the variable
                                 # and make your changes to it.
于 2013-10-24T14:27:17.277 回答