在 Tkinter 中单击按钮时程序没有响应?

Program unresponsive on clicking a button in Tkinter?

我正在尝试使用 Tkinter 创建一个简单的计算器,但我遇到了一个问题。先看相关代码:

entry_text = StringVar()
inout = Entry(root, textvariable=entry_text)
inout.grid(row=0, column=0, columnspan=4, sticky="nsew")

def equals():
    print("Equal button is clicked")
    get_answer = True

def divide():
    tempvar = entry_text.get()
    num1 = int(tempvar)
    entry_text.set("")
    while get_answer == False:
        tempvar2 = entry_text.get()
        try:
            num2 = int(tempvar2)
        except ValueError:
            num2 = 0
    print("I'm out of the loop.")
    answer = num1 / num2
    entry_text.set(answer)

我在这里为 divide 按钮创建了一个函数。按钮的功能是每当您单击按钮时,它都会获取 entry_text 变量的瞬时值,将其存储在临时变量中并重置 entry_text 变量的值。然后它运行一个循环来收集 entry_text 的下一个值,直到单击等于按钮。但问题就出在这里。每当我单击 divide 按钮时,GUI 变得无响应,我无法输入下一个除法运算值并退出循环。

有人能帮忙吗?

避免在 tkinter 应用程序中使用 while 循环,因为它会阻止 tkinter mainloop 处理未决事件。

此外,equals() 中的 get_answer 是局部变量,因为您尚未使用 global get_answer.

将其声明为全局变量

实际上你应该在equals()里面执行所需的操作,但是你需要将第一个数字和选择的操作存储为全局变量:

num1 = 0
operator = None

def equals():
    global num1, operator
    print("Equal button is clicked")
    try:
        tempvar = entry_text.get()
        num2 = float(tempvar)  # used float() instead of int()
        if operator == '/' and num2 != 0:
            answer = num1 / num2
            entry_text.set(answer)
            operator = None # reset operator
    except ValueError:
        print('Invalid value', tempvar)

def divide():
    global num1, operator
    try:
        tempvar = entry_text.get()
        num1 = float(tempvar)  # used float() instead of int()
        entry_text.set("")
        operator = '/'   # save the operator
    except ValueError:
        print('Invalid value', tempvar)

由于变量 get_answer 永远不会更改为 True

,因此 while 循环将永远持续下去并且永不中断,程序变得无响应

You can’t click on any button, because the while loop keeps running and can’t break without the condition given to it turns false or it is manually told to break after some number of loops.