2015-02-06 1 views
0

Я начинаю изучать Python и пакет tkinter, и я пишу программу для загрузки текстового файла в окне графического интерфейса. Чтобы открыть браузер файлов, я установил кнопку и ее нужную функцию, как показано в приведенном ниже коде. Программа запускается, но когда я нажимаю кнопку «просмотр», я получаю ошибку атрибута, говоря: «Объект« assign_1 »не имеет атрибута« var_filename ». Было бы здорово, если бы кто-нибудь мог мне помочь в этом.Ошибка атрибута открытия диалогового окна открытия файла в графическом интерфейсе python с использованием tkinter

from tkinter import * 
from tkinter import messagebox 
from tkinter import simpledialog 
from tkinter import filedialog 
from math import * 
from numpy import * 
import string 

root = Tk() 

def close_window_callback(root): 
    if messagebox.askokcancel("Quit", "Do you really wish to quit?"): 
    root.destroy() 


class assign_1: 
    def __init__(self,master): 
     self.master = master 
     frame = Frame(master) 
     frame.pack() 
     self.canvas = Canvas(master,width=1000,height=1000, bg="yellow") 


     self.button_browse = Button(frame, text="Browse", 
command=self.browse_file) 
     self.button_browse.pack() 

     self.button_load = Button(frame, text="Load") 
     self.button_load.pack(side = LEFT) 

     self.canvas.pack(expand=YES, fill=BOTH) 

def browse_file(self): 
    self.var_filename.set(filedialog.askopenfilename(filetypes=[("allfiles","*"),("pythonfiles","*.txt")])) 
    filename = self.var_filename.get() 
    print(filename) 

root.protocol("WM_DELETE_WINDOW", lambda root_window=root: close_window_callback(root_window)) 
assign_1(root) 

root.mainloop() 

ответ

1

Хотя, как указал Ринцлер, ваш отступ - это неправильно в коде, который вы отправили, что приведет к другой ошибке (AttributeError: assign_1 instance has no attribute 'browse_file'). Поэтому я предполагаю, что отступ в коде, который вы используете, правильный.

Проблема заключается в том, что вы пытаетесь использовать self.var_filename.set(...), не указав, что такое self.var_filename. Если вы хотите, чтобы это был StringVar, который, кажется, имеет место, так как вы используете set и get, вы должны его инициализировать. Для этого вы должны поместить self.var_filename = StringVar(master) в функцию класса __init__. Небольшой пример, демонстрирующий это:

root = Tk() 

class assign_1: 
    def __init__(self, master): 
     self.master = master 
     self.var_filename = StringVar(master) 

     self.button_browse = Button(master, text="Browse", command=self.browse_file) 
     self.button_browse.pack() 

    def browse_file(self): 
     self.var_filename.set(filedialog.askopenfilename(filetypes=[("allfiles","*"),("pythonfiles","*.txt")])) 
     filename = self.var_filename.get() 
     print(filename) 


assign_1(root) 
root.mainloop() 

Однако, судя по всему, в вашем случае нет необходимости использовать Tkinter STRINGVAR, просто используйте обычную строковую переменную:

root = Tk() 

class assign_1: 
    def __init__(self, master): 
     self.master = master 

     self.button_browse = Button(master, text="Browse", command=self.browse_file) 
     self.button_browse.pack() 

    def browse_file(self): 
     self.filename = filedialog.askopenfilename(filetypes=[("allfiles","*"),("pythonfiles","*.txt")]) 
     print(self.filename) 


assign_1(root) 
root.mainloop() 
1

Отступ неправильный. Функция browse_file, которую вы хотели бы определить как метод класса assign_1 (использовать буквы прописной буквы, чтобы объявить название классов) является глобальной функцией, как вы ее определили.

Вы также не определено self.var_filename в любом месте, так что это будет затем дать вам ошибку:

AttributeError: 'assign_1' object has no attribute 'var_filename' 

Под функцией close_window_callback, вы должны также неправильно отступов.

+0

identation не проблема ... не определение self.var_filename было проблемой ... я получил это прямо сейчас .. Спасибо! – Taral

+0

@Taral Так как ваш код теперь отображается, отступом также является проблема. – nbro

+0

Мне придется перестроить его лучше со следующего раза ... в моем редакторе, его правильно идентифицировать. Спасибо за ваше время и помощь. – Taral

Смежные вопросы