python - 单击 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 循环,因为它会阻止 tkintermainloop
处理未决事件。
此外,get_answer
insideequals()
是一个局部变量,因为您没有将其声明为全局 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)
推荐阅读
- python - 从 colab 完成 drive.mount 后,如何使用 cv2.imread 读取图像?
- python - pip 安装的模块指向 anaconda 路径而不是实际路径
- flopy - 为 zone_budget 动态创建区域的工作流程是什么?
- c++ - 来自 Makefile 的编译错误:“无法打开输出文件”...“没有这样的文件或目录”
- vdm++ - 通过 for all 循环运行集合时无法返回集合中的每个元素
- sql - 查询自第一个记录订单日期起10年内最大订单
- node.js - 为什么世博会使得互联网不起作用?
- python - 为什么在 django 中运行服务器时主页没有显示并且在 heroku 中上传后它不起作用?
- docker - 以 shell 执行器和 docker 镜像为基础的 Gitlab CI
- docker - 通过 docker 部署时无法在 Heroku 应用程序中处理 SIGTERM