如何让基于API的Python货币报价CustomTkinter应用正常运行?
问题修复方案
你的代码主要存在缩进错误和缺乏异常处理的问题,以下是修正后的完整代码及说明:
错误点分析
- 函数
pegar_cotacoes内部的代码没有正确缩进,Python对缩进要求严格,这会直接导致语法错误。 - 未处理网络请求失败、API返回数据异常的情况,一旦出现问题程序会直接崩溃。
CTkLabel设置了固定宽高,可能导致报价文本显示不全。
修正后的代码
import customtkinter import requests customtkinter.set_appearance_mode("dark") customtkinter.set_default_color_theme("dark-blue") root = customtkinter.CTk() root.geometry("500x350") root.title("Cotacao Krettina") def pegar_cotacoes(): try: # 修复缩进问题,正确缩进函数内代码 requisicao = requests.get('https://economia.awesomeapi.com.br/json/last/USD-BRL,EUR-BRL,BTC-BRL') # 检查请求是否成功 requisicao.raise_for_status() requisicao_dic = requisicao.json() # 提取报价时增加键存在性检查 cotacao_dolar = requisicao_dic.get('USDBRL', {}).get('bid', '获取失败') cotacao_euro = requisicao_dic.get('EURBRL', {}).get('bid', '获取失败') cotacao_bitcoin = requisicao_dic.get('BTCBRL', {}).get('bid', '获取失败') texto = f''' Dolar: {cotacao_dolar} Euro: {cotacao_euro} Bitcoin: {cotacao_bitcoin}''' texto_cotacoes.configure(text=texto) except requests.exceptions.RequestException as e: texto_cotacoes.configure(text=f"网络请求出错:{str(e)}") except Exception as e: texto_cotacoes.configure(text=f"数据解析出错:{str(e)}") frame = customtkinter.CTkFrame(master=root) frame.pack(pady=20, padx=60, fill="both", expand=True) button = customtkinter.CTkButton(master=frame, text="Cotar!", command=pegar_cotacoes) button.pack(pady=12, padx=10) # 去掉固定宽高,让标签自适应内容 texto_cotacoes = customtkinter.CTkLabel(master=root, corner_radius=8) texto_cotacoes.pack(pady=12, padx=10) root.mainloop()
关键修改说明
- 修复缩进:将函数内的所有代码统一缩进4个空格,符合Python语法规范。
- 增加异常处理:
- 捕获网络请求相关异常(如无网络、API服务器错误)。
- 捕获数据解析异常,避免因API返回格式变化导致崩溃。
- 使用
get()方法提取字典值,避免键不存在引发的KeyError。
- 优化标签显示:移除固定宽高设置,让标签根据文本内容自动调整尺寸,确保报价信息完整显示。
- 使用
configure()更新文本:虽然直接修改["text"]也能生效,但configure()是Tkinter系列组件更标准的属性更新方式。
内容的提问来源于stack exchange,提问作者Eduardo Krett
相关产品推荐
相关产品推荐

