【问题标题】:Program unresponsive on clicking a button in Tkinter?单击 Tkinter 中的按钮时程序无响应?
【发布时间】:2021-12-24 12:03:22
【问题描述】:

我正在尝试使用 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 都会变得无响应,并且我无法为除法运算输入下一个值并退出循环。

谁能帮忙?

【问题讨论】:

  • while get_answer == False: 中断mainloop。只要 while 循环运行,就不会发生任何事件。
  • 首先避免在 tkinter 应用程序中使用 while 循环,因为它会阻止 tkinter 处理未决事件。其次,您在equals() 内创建局部变量get_answer,而不是更新全局变量(假设有一个)。
  • @acw1668 您的假设是正确的,但是您能否以详细答案的形式告诉我该怎么做,因为您的第二行答案有点混乱?
  • @acw1668 还有我应该使用什么样的方法来实时更新临时变量,Entry对象中有没有类似ontextchanged之类的方法?

标签: python python-3.x tkinter tk


【解决方案1】:

避免在 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)

【讨论】:

  • 非常感谢您!您解决了我的所有问题,我将其包含在我的代码中,并稍作修改。再次感谢!
【解决方案2】:

程序变得无响应,因为while 循环永远持续并且永不中断,因为变量get_answer 从未更改为True

您不能点击任何按钮,因为while 循环一直在运行,并且如果没有给它的条件变为false 或在经过一定次数的循环后被手动告知break,它就无法中断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    相关资源
    最近更新 更多