我刚刚开始学习使用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(如第一个例子中所示)并显示它?或者你和我只是做错了吗?
答案 0 :(得分:0)
执行此操作时:
self.button = Button(..., command=func())
然后python将调用func()
,其结果将分配给command属性。由于您的func不返回任何内容,因此命令将为None。这就是为什么当你按下按钮时,没有任何反应。
你的第二个版本似乎很好。需要self
的原因是没有它,text_write
是一个只对init函数可见的局部变量。通过使用self
,它成为对象的属性,因此可以访问对象的所有方法。
如果您想了解如何传递与首次尝试类似的参数,请在此网站上搜索lambda
和functools.partial
的使用情况。这类问题已被多次提出并回答。