2013-12-11 96 views
0

几天我一直在试图解决这个问题,我没有任何成功。大部分代码都给了我,我应该让它更“面向对象”。Python:全球名称我没有定义(错误?)错误

在我上课之前它工作得很好。

到目前为止,我给出的错误是:

Exception in Tkinter callback 
Traceback (most recent call last): 
File "C:\Python32\lib\tkinter\__init__.py", line 1399, in __call__ 
return self.func(*args) 
File "C:\Users\oliver.andersson\Documents\pythonprog\kap21ovn1.py", line 45, in getfile 
filnamn = namn.get() 
NameError: global name 'namn' is not defined 

,但我敢肯定,这不是唯一的东西是错误的。

任何帮助将不胜感激!

这里是我的代码:

import tkinter as tk 
from tkinter.scrolledtext import * 

class App: 
    def __init__(self, root): 

     root.title('Min texteditor')    
     frame = tk.Frame(root, bg = '#f0f0f0') 
     frame.grid()        


     tk.Label(frame, text = 'Editera textfiler/Pythonfiler', 
       font = ('Arial', 16, 'normal')).grid(
        row = 0, column = 0, columnspan = 40) 


     tk.Label(frame, text = 'Fil: ', font = ('Arial', 12, 'normal')).grid(
      row = 1, column = 0, sticky = tk.E) 
     namn = tk.Entry(frame, width = 40) 
     namn.grid(row = 1, column = 1, columnspan = 5, sticky = tk.W) 


     openbutton = tk.Button(frame, text = 'Öppna', command = self.getfile) 
     openbutton.grid(row = 2, column = 1, sticky = tk.W) 

     saveButton = tk.Button(frame, text = 'Spara', command = self.savefile) 
     saveButton.grid(row = 2, column = 3, sticky = tk.W) 

     saveasButton = tk.Button(frame, text = 'Spara som...', command = self.saveas) 
     saveasButton.grid(row = 2, column = 4, sticky = tk.W) 

     exitButton = tk.Button(frame, text = 'Avsluta', command = root.destroy) 
     exitButton.grid(row = 2, column = 6, sticky = tk.E) 


     tk.Label(frame, text = ' ', 
       font = ('Arial', 14, 'normal')).grid(row = 3, column = 0) 


     textruta = ScrolledText(frame, heigh = 30, width = 80) 
     textruta.grid(row = 4, column = 0, columnspan = 40) 

    def getfile(self): 

     filnamn = namn.get() 

     if not filnamn: 
      filnamn = tk.filedialog.askopenfilename(filetypes = (('Pythonfiler', 
                  '*.py'),)) 
     if filnamn: 
      try: 
       fil = open(filnamn, 'r', encoding = 'utf-8') 
       rader = fil.read() 
      except: 
       tk.messagebox.showerror('Filfel', 'Kunde inte öppna fil') 
      else: 
       namn.delete(0, tk.END)   
       namn.insert(0, filnamn)   
       textruta.delete(1.0,tk.END) 
       textruta.insert(1.0, rader) 

      finally: 
       try:    
        fil.close() 
       except: 
        pass 

    def savefile(self): 

     rader = textruta.get(1.0, tk.END) 
     filnamn = namn.get()    

     if filnamn: 
      try: 
       fil = open(filnamn, 'w', encoding = 'utf-8') 
       fil.write(rader) 
      except: 
       tk.messagebox.showerror('Filfel', 'Kunde inte spara fil') 
      else: 
       fil.close() 

    def saveas(self): 

     filnamn = tk.filedialog.asksaveasfile(
      filetypes = (('Alla filer', '*.*'),)) 

     if filnamn: 
      namn.delete(0, tk.END) 
      namn.insert(0, filnamn) 
      savefile() 

master = tk.Tk() 
a = App(master) 
master.mainloop() 
+2

这个问题似乎是无关紧要的,因为OP要求我们调试他们的代码 – Kimvais

回答

4

你的变量namn仅在init函数中定义。如果您希望它可以在整个对象上使用,请使用self.namn

这也适用于您想要在不同方法中使用的所有变量。

1

尝试用self.namn替换所有出现的namn,因为它需要是您的对象的成员。

相关问题