用于打印条目文本的tkinter脚本

时间:2013-01-17 04:16:54

标签: python tkinter

我刚刚开始学习使用tkinter和python,这似乎违反直觉,这个尝试在一个简单的脚本上打印输入到输入框中的内容,不起作用:

class App:
    def __init__(self, master):

        frame  = Frame(master)
        frame.pack()

        text_write = Entry(frame)
        text_write.pack()

        self.button = Button(frame, text="quit", fg="red", command=frame.quit)
        self.button.pack(side=LEFT)

        self.hi_there = Button(frame, text='hello', fg='black', command=self.say_hi(text_write.get()))
        self.hi_there.pack(side=RIGHT)

    def say_hi(self, text):
        print(text)

root = Tk()

app = App(root)

root.mainloop()

这没有任何作用,并且没有输出任何错误,但如果我将其更改为:

class App:
    def __init__(self, master):

        frame  = Frame(master)
        frame.pack()

        self.text_write = Entry(frame)
        self.text_write.pack()

        self.button = Button(frame, text="quit", fg="red", command=frame.quit)
        self.button.pack(side=LEFT)

        self.hi_there = Button(frame, text='hello', fg='black', command=self.say_hi)
        self.hi_there.pack(side=RIGHT)

    def say_hi(self):
        print(self.text_write.get())

然后调用该函数并打印该值。为什么需要在那里宣布“自我”?为什么不能将text_write的值作为参数传递给say_hi(如第一个例子中所示)并显示它?或者你和我只是做错了吗?

1 个答案:

答案 0 :(得分:0)

执行此操作时:

self.button = Button(..., command=func())

然后python将调用func(),其结果将分配给command属性。由于您的func不返回任何内容,因此命令将为None。这就是为什么当你按下按钮时,没有任何反应。

你的第二个版本似乎很好。需要self的原因是没有它,text_write是一个只对init函数可见的局部变量。通过使用self,它成为对象的属性,因此可以访问对象的所有方法。

如果您想了解如何传递与首次尝试类似的参数,请在此网站上搜索lambdafunctools.partial的使用情况。这类问题已被多次提出并回答。