将python功能添加到Tkinter前端

时间:2014-03-17 11:28:55

标签: python tkinter

这是我使用Tkinter为我的应用程序开发的前端:

from Tkinter import *
class Example(Frame):
def __init__(self, parent):
    Frame.__init__(self, parent)   
    self.parent = parent
    self.initUI()

def initUI(self):

    self.parent.title("Simple")
    self.pack(fill=BOTH, expand=1)

    frame = Frame(self, relief="flat", borderwidth=1)

    label=Label(frame,text="Scope:")
    label.pack(side="left", fill=None, expand=False)

    var = StringVar()
    var.set("today")
    list = OptionMenu(frame, var, "today","yesterday","this week","last week","this month","last month")
    list.pack(side="left", fill=None, expand=False)

    fetchButton = Button(frame, text="Fetch",command=self.handle(var))
    fetchButton.pack(side="left", fill=None, expand=False)

    frame.grid(row=1,column=1,pady=4,padx=5,sticky=W)

    area = Text(self,height=15,width=60)
    area.grid(row=2,column=1,rowspan=1,pady=4,padx=5)

    scroll = Scrollbar(self)
    scroll.pack(side=RIGHT, fill=Y)

    area.config(yscrollcommand=scroll.set)
    scroll.config(command=area.yview)
    scroll.grid(row=2, column=2, sticky='nsew')

    quitButton = Button(self, text="Cancel",command=self.quit)
    quitButton.grid(pady=4,padx=5,sticky=W,row=3, column=1)

root = Tk()
app = Example(root)
root.mainloop()  

我究竟要在哪里放置handle()方法,以便它可以重复写入文本小部件?当我将handle()放入Example课程并使用self.area.insert()时,会显示错误

Example instance has no attribute 'area'

请帮忙。

1 个答案:

答案 0 :(得分:1)

您需要将函数对象传递给Button实例,而不是函数调用。即。

fetchButton = Button(frame, text="Fetch",command=self.handle)

使句柄在其余代码的上下文中起作用:

from Tkinter import *

class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.parent.title("Simple")
        self.pack(fill=BOTH, expand=1)
        self.init_ui()

    def init_ui(self):
        self.frame = Frame(self, relief="flat", borderwidth=1)
        self.frame.grid(row=1,column=1,pady=4,padx=5,sticky=W)
        self.label=Label(self.frame,text="Scope:")
        self.label.pack(side="left", fill=None, expand=False)

        self.var = StringVar()
        self.var.set("today")

        self.list = OptionMenu(self.frame, self.var, "today","yesterday",
                               "this week","last week","this month",
                               "last month")
        self.list.pack(side="left", fill=None, expand=False)

        self.fetchButton = Button(self.frame, text="Fetch",command=self.handle)
        self.fetchButton.pack(side="left", fill=None, expand=False)

        self.area = Text(self,height=15,width=60)
        self.area.grid(row=2,column=1,rowspan=1,pady=4,padx=5)

        self.scroll = Scrollbar(self)
        self.scroll.pack(side=RIGHT, fill=Y)

        self.area.config(yscrollcommand=self.scroll.set)
        self.scroll.config(command=self.area.yview)
        self.scroll.grid(row=2, column=2, sticky='nsew')

        self.quitButton = Button(self, text="Cancel",command=self.quit)
        self.quitButton.grid(pady=4,padx=5,sticky=W,row=3, column=1)

    def handle(self):
        self.area.delete(1.0, END)
        self.area.insert(CURRENT,self.var.get())

if __name__ == "__main__":
    root = Tk()
    app = Example(root)
    root.mainloop()

将您的小部件声明为属性可以为您的应用程序扩展带来很多痛苦。同时保留对Tk中所有内容的引用可以阻止一些不需要的垃圾收集,特别是对于Label个实例中的图像。

值得注意的是,交替使用gridpack可能会导致以后出现错误。