You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter按钮触发API调用刷新加密货币数据与PNL的实现求助

解决Tkinter加密货币工具的点击刷新问题

我看了你的代码,发现几个核心问题导致点击按钮后没法更新数据,咱们一步步来修复:

原代码的主要问题

  • 重复创建窗口+阻塞的事件循环:main()里的while True会不断创建新的Tk窗口,而且mainloop()是阻塞函数,循环根本没法正常执行。
  • 点击事件未关联GUI更新:Click()函数只调用了get_crypto_data(),但没有把新获取的数据更新到已有的Label组件上。
  • Label组件无法动态访问:初始创建的显示数据的Label没有被保存为可访问的变量,后续没法修改它们的内容。
  • API参数错误:get_price的ids里有多余的逗号(bitcoin,ethereum,,neo,ripple),会导致API请求失败。
  • DataFrame显示不友好:直接把DataFrame放到Label里会显示成原始对象格式,可读性很差。

修改后的完整代码

from pycoingecko import CoinGeckoAPI
import pandas as pd
import datetime
from tkinter import *

def get_crypto_data():
    cg = CoinGeckoAPI()
    # 修正多余的逗号,避免API请求报错
    coins = cg.get_price(ids='bitcoin,ethereum,neo,ripple', vs_currencies='usd', include_24hr_change='true')
    df = pd.DataFrame.from_dict(coins, orient='index')
    # 给DataFrame重命名列,让显示更清晰
    df.columns = ['当前价格(USD)', '24小时涨跌幅(%)']
    # 这里可以替换成你的实际PNL计算逻辑
    current_time = datetime.datetime.now().strftime("%A %d.%m.%Y %H:%M:%S")
    PNL = f"盈亏计算结果(更新于{current_time}):示例值"
    return df, PNL

def update_gui():
    # 获取新数据
    df, pnl = get_crypto_data()
    # 更新时间标签
    current_time = datetime.datetime.now().strftime("%A %d.%m.%Y %H:%M:%S")
    time_label.config(text=current_time)
    # 更新数据标签,把DataFrame转成格式化字符串
    data_label.config(text=df.to_string())
    # 更新PNL标签
    pnl_label.config(text=pnl)

def setup_gui():
    mask = Tk()
    mask.wm_title("Live Portfolio Data")
    mask.geometry("800x600")
    mask.configure(bg='yellow')

    # 全局声明三个标签,方便在update_gui里直接访问修改
    global time_label, data_label, pnl_label

    # 标题标签
    title_label = Label(mask, bg='blue', text="Live Crypto Portfolio Data", font=('arial', 14, 'bold'))
    title_label.grid(row=0, column=0, padx=10, pady=5)

    # 时间标签
    current_time = datetime.datetime.now().strftime("%A %d.%m.%Y %H:%M:%S")
    time_label = Label(mask, bg='yellow', text=current_time, font=('arial', 10))
    time_label.grid(row=1, column=0, padx=10, pady=5)

    # 数据显示标签,用等宽字体保证对齐,左对齐更易读
    df, pnl = get_crypto_data()
    data_label = Label(mask, bg='yellow', text=df.to_string(), justify=LEFT, font=('monospace', 10))
    data_label.grid(row=2, column=0, padx=10, pady=5)

    # PNL标签
    pnl_label = Label(mask, bg='yellow', text=pnl, font=('arial', 12, 'bold'))
    pnl_label.grid(row=3, column=0, padx=10, pady=10)

    # 刷新按钮,点击后触发update_gui函数
    refresh_btn = Button(mask, padx=2, bd=2, fg="black", font=('arial', 16, 'bold'), 
                         text="刷新数据", bg="yellow", command=update_gui)
    refresh_btn.grid(row=4, column=0, padx=10, pady=10)

    return mask

def main():
    # 只创建一次窗口,启动Tk的事件循环即可
    root = setup_gui()
    root.mainloop()

if __name__ == '__main__':
    main()

关键修改点说明

  1. 重构get_crypto_data():修正了API参数的多余逗号,给DataFrame重命名列提升可读性,同时完善了PNL的示例格式。
  2. 新增update_gui()函数:这是核心逻辑,负责获取新数据后,直接通过config(text=...)修改已有Label的内容,实现界面刷新。
  3. 全局变量存储Label:在setup_gui()里把需要更新的Label声明为全局变量,让update_gui()可以直接访问并修改它们。
  4. 优化界面布局:调整窗口大小、字体、边距,用等宽字体显示DataFrame保证数据对齐,让整体显示更美观。
  5. 移除无效循环:main()里只创建一次窗口并启动mainloop(),Tk的事件循环会自动处理按钮点击等交互逻辑,不需要额外的while循环。

现在你点击“刷新数据”按钮时,就会重新调用CoinGecko API获取最新数据,然后实时更新界面上的价格、涨跌幅和PNL内容了。

内容的提问来源于stack exchange,提问作者MachuPichu92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:02:34