我看到的几个问题:
-您提供的示例代码一团糟,这可能是由于格式不正确,但无论如何,我已经为我的示例修复了它。
-您在创建条目后调用了一次e1.get()。这将返回一个空字符串;但是,您实际上并没有对存储的变量进行任何操作 ,因此它是无用的。 us 从未使用过。
-command = factorize 不传递变量,factorize 需要变量。我已更改此设置,以便回调将传入 Entry 小部件。这样,我们就可以调用us = int(e1.get())inside这个函数,这样每次点击按钮,我们都会得到最新的入口值。
为此,我将命令更改为command = lambda: factorize(e1)。 lambda 本质上声明了一个“anonymous function”。这是使用 Tkinter 从回调传递变量的唯一方法,因为 command 关键字需要函数的名称,例如 command = master.destroy。说起来,我还把master.quit改成了master.destroy,因为you most likely want to destroy it。
-我已将 us = int(e1.get()) 包装在 try/catch 块中,因为您想要一个 int 用于您的函数。 Entry.get() 将返回一个您不能用来创建范围的字符串。
-最后我已经导入了 tkMessageBox,这样当你给 Entry 一个错误的值时我可以生成一个很好的错误消息(例如,任何不能转换为整数的东西)
from tkinter import *
import tkMessageBox
master= Tk()
e1 = Entry(master)
def factorize(us):
try:
us = int(e1.get())
except ValueError:
tkMessageBox.showerror("Value Error", "Please enter an integer!")
else:
product=1
for x in range(1,us+1):
product=product*x
print(product)
Label(master, text="Number").grid(row=0)
e1.grid(row=0, column=1)
Button(master, text='Quit', command=master.destroy).grid(row=3, column=0, sticky=W, pady=4)
Button(master, text='ans', command=lambda: factorize(e1)).grid(row=3, column=1, sticky=W, pady=4)
master.mainloop( )