2014-11-05 71 views
0

我想要在Tkinter GUI中检索我的Entry小部件的值(文件名),并在我的file_open函数中使用它来获取文件名,读取它并返回内容添加到我的文本小部件中。无法获取Tkinter中的Entry Widget的值

但我得到一个属性错误,说应用程序对象没有属性f3_entry(尽管我创建一个分配给f3_entry的条目小部件)。我在这里做错了什么?

from tkinter import * 
from tkinter.filedialog import LoadFileDialog, SaveFileDialog, Directory 


class Application(Frame): 

    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.grid() 
     self.master.title("Grid layout") 
     self.createWidgets() 


    def createWidgets(self): 
     def handler(event): 
      print("Frame {} clicked at {} {}".format(event.widget, event.x, event.y)) 

     for r in range(6): 
      self.master.rowconfigure(r, weight=1) 
     for c in range(6): 
      self.master.columnconfigure(c, weight=1) 

     Frame1 = Frame(self.master, bg="red", name='frame 1') 
     Frame1.grid(row=0, column=0, rowspan=3, columnspan=3, sticky=W+E+N+S) 
     Frame1.bind("<Button-1>", handler) 

     Frame2 = Frame(self.master, bg="green", name='frame 2') 
     Frame2.grid(row=3, column=0, rowspan=3, columnspan=3, sticky=W+E+N+S) 
     Frame2.bind("<Button-1>", handler) 

     Frame3 = Frame(self.master, bg="blue", name='frame 3') 
     Frame3.grid(row=0, column=3, rowspan=6, columnspan=4, sticky=W+E+N+S) 

     f3_entry = Entry(Frame3).pack(fill=BOTH) 
     f3_text = Text(Frame3).pack(fill=BOTH) 

     r_button = Button(self.master, text="Red").grid(row=6,column=1,sticky=E+W) 
     b_button = Button(self.master, text="Blue").grid(row=6,column=2,sticky=E+W) 
     g_button = Button(self.master, text="Green").grid(row=6,column=3,sticky=E+W) 
     bk_button = Button(self.master, text="Black").grid(row=6,column=4,sticky=E+W) 
     o_button = Button(self.master, text="Open", command=self.file_open).grid(row=6,column=5,sticky=E+W) 

    def file_open(self): 
     d = LoadFileDialog(self) 
     fname = self.f3_entry.get() 
     if fname is None: 
      print("No file exists...") 
     else: 
      f = open(fname, 'r').read() 
      f3_text.insert(f) 
      f.close() 

root = Tk() 
app = Application(master=root) 
app.mainloop() 

回答

1

你只在你createWidgets()方法创建的局部变量f3_entry的属性。你想在那前面添加一个self.参考:

self.f3_entry = Entry(Frame3) 
self.f3_entry.pack(fill=BOTH) 

这实际上创建您的Application实例的属性,然后可以在file_open()方法引用。

请注意,您需要分别拨打.pack()方法;该方法返回None,因此在调用它之前,您需要首先将Entry()对象存储在属性中。

这同样适用于您的f3_text小部件;您需要将其作为createWidgets()file_open()中的属性:

​​
+0

啊。我正在朝这个方向思考。我会给它一个镜头。 – 2014-11-05 22:30:57

+0

@PatrickBeeson:我已经更新了一些你需要在这里考虑的更多细节。 – 2014-11-05 22:35:42