首页 > 解决方案 > 单击 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 都会变得无响应,并且我无法为除法操作输入下一个值并退出循环。

任何人都可以帮忙吗?

标签: pythonpython-3.xtkintertk

解决方案


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

此外,get_answerinsideequals()是一个局部变量,因为您没有将其声明为全局 using 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)

推荐阅读