2013-03-30 82 views
0

基本上我現在正在學習Python,所以我只是使用其他人的模板,只是編輯它們。到目前爲止,我已經瞭解到Python中的縮進非常挑剔。 然而,我卡住了,我想我已經正確地縮進並定義好了,但我仍然在控制檯中看到這個錯誤。 (窗口)名稱錯誤和其他?

(是的,我知道這是尚未完成的)

"...\documents\python_files>python calc.py 
Traceback (most recent call last): 
    File "calc.py", line 20, in <module> 
    class Calculator(wx.Dialog): 
    File "calc.py", line 46, in Calculator 
    b = wx.Button(self, -1, label) 
NameError: name 'self' is not defined" 

這裏是我的代碼(我認爲我把它放在這裏的代碼格式):

# -*- coding: utf-8 -*- 
from __future__ import division 

__author__ = 'Sean' 
__version__ = '0.0.2' 

#Calculator GUI: 

# ____________v 
#[(][)][^][log] 
#[C][±][√][%] 
#[7][8][9][/] 
#[4][5][6][*] 
#[1][2][3][-] 
#[0][.][+][=] 

import wx 
from math import * 

class Calculator(wx.Dialog): 
    '''Main calculator dialog''' 
    def __init__(self): 
     title = 'Calculator version %s' % __version__ 
     wx.Dialog.__init__(self, None, -1, title) 
     sizer = wx.BoxSizer(wx.VERTICAL) # Main vertical sizer 

     # ____________v 
     self.display = wx.ComboBox(self, -1) 
     sizer.Add(self.display, 0, wx.EXPAND) 


    #[(][)][^][log] 
    #[C][±][√][%] 
    #[7][8][9][/] 
    #[4][5][6][*] 
    #[1][2][3][-] 
    #[0][.][+][=] 
    gsizer = wx.GridSizer(4,6) 
    for row in (("(",")","^","log"), 
    ("C","±","√","%"), 
    ("7", "8", "9", "/"), 
    ("4", "5", "6", "*"), 
    ("1", "2", "3", "-"), 
    ("0", ".", "+", "=")): 
     for label in row: 
      b = wx.Button(self, -1, label) 
      gsizer.Add(b) 
      self.Bind(wx.EVT_Button,self.OnButton, b) 
      sizer.Add(gsizer, 1, wx.EXPAND) 

    b = wx.Button(self, -1, "=") 
    self.Bind(wx.EVT_BUTTON, self.OnButton, b) 
    sizer.Add(b, 0, wx.EXPAND) 
    self.equal = b 

    self.SetSizer(sizer) 
    sizer.Fit(self) 
    self.CenterOnScreen() 

def OnButton(self, evt): 
    '''Handle button click event''' 
    label = evt.GetEventObject().GetLabel() 

    if label == '=': 
     try: 
      compute = self.display.GetValue() 
      if not compute.strip(): 
       return 

      result = eval(compute) 

      self.display.Insert(compute, 0) 

      self.display.SetValue(str(result)) 
     except Exception as err: 
      wx.LogError(str(err)) 
      return 

    elif label == 'C': 
     self.display.SetValue('') 

    else: 
     self.display.SetValue(self.display.GetValue() + label) 
     self.equal.SetFocus() 

if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    dlg = Calculator() 
    dlg.ShowModal() 
    dlg.Destroy() 

回答

2

__init__方法部分的縮進是錯誤的:

class Calculator(wx.Dialog): 
    '''Main calculator dialog''' 
    def __init__(self): 
     title = 'Calculator version %s' % __version__ 
     wx.Dialog.__init__(self, None, -1, title) 
     sizer = wx.BoxSizer(wx.VERTICAL) # Main vertical sizer 
     self.display = wx.ComboBox(self, -1) 
     sizer.Add(self.display, 0, wx.EXPAND) 
     # This part was indented wrong 
     gsizer = wx.GridSizer(4,6) 
     for row in (("(",")","^","log"), 
        ("C","±","√","%"), 
        ("7", "8", "9", "/"), 
        ("4", "5", "6", "*"), 
        ("1", "2", "3", "-"), 
        ("0", ".", "+", "=")): 
     for label in row: 
      b = wx.Button(self, -1, label) 
      gsizer.Add(b) 
      self.Bind(wx.EVT_Button,self.OnButton, b) 
      sizer.Add(gsizer, 1, wx.EXPAND) 
     b = wx.Button(self, -1, "=") 
     self.Bind(wx.EVT_BUTTON, self.OnButton, b) 
     sizer.Add(b, 0, wx.EXPAND) 
     self.equal = b 

你應該閱讀Python。從Python 2 tutorial

請注意,基本塊內的每行必須縮進相同的數量。

另一件要讀的是Python Style Guide

+0

通常最好拿到一本書並閱讀它。編輯不會幫助他們,因爲沒有語法錯誤 - 可以在類體中使用代碼。 – georg

+1

@ thg435:我添加了一個指向教程的指針。這是一個開始... –

+0

謝謝你,我也應該閱讀教程,因爲編輯事情已經使我陷入死衚衕。 – user2227732