You need to enable JavaScript to run this app. 如何通过Tkinter按钮传参启动Binance交易Bot的Python文件
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Tkinter按钮传参启动Binance交易Bot的Python文件

交易机器人GUI传参实现方案

现有代码的核心问题定位

  • 无参数通道:bot.py中ticker值的获取逻辑是硬编码的终端阻塞输入,没有预留外部传值的入口,GUI启动程序时无法把界面上的输入值传进去
  • 变量名错配:GUI中定义的输入框变量为ticker_entry,后续代码错误引用不存在的ticker变量执行布局、绑定按钮,运行时会直接触发命名错误
  • 启动逻辑空转:原start_bot函数仅无参调用bot.py,没有任何拼接、传递ticker值的逻辑

第一步:改造bot.py,兼容外部传参和原终端使用习惯

新增命令行参数读取逻辑,优先取启动时传入的ticker值,无参数时自动回到原有的终端手动输入流程,不破坏原有终端运行的功能:

import websocket
import json
import sys  # 新增:读取系统命令行参数
from colorama import Fore, Back, Style
import numpy as np
tmp = [1]

# 替换原硬编码的input逻辑
# 优先级1:读取命令行传入的第一个参数作为ticker,自动转小写适配Binance接口格式
# 优先级2:无传入参数时,走原终端手动输入流程兜底
if len(sys.argv) > 1:
    ticker = sys.argv[1].strip().lower()
else:
    print("eg. ethusdt = ETH/USDT")
    ticker = input(Fore.YELLOW + "Enter ticker here: ")
    print(Style.RESET_ALL)

SOCKET="wss://stream.binance.com:9443/ws/"+ ticker +"@kline_1m"

# 以下原有业务逻辑完全保留,不需要修改
def on_open(ws):
   print('Connection established')

def on_close(ws):
   print("Connection closed")

def on_message(ws, message):
   global tmp
   print("waiting for candle to close..")
   json_message = json.loads(message)
   candle = json_message['k']
   is_candle_closed = candle['x']
   close = candle['c']
   
   if is_candle_closed:
       print("\n")
       print(Fore.RED + "Last candle closed at: ")
       print(*tmp, sep= ' , ')
       print(Style.RESET_ALL)
       print("\n")
       print(Fore.GREEN +"New candle closed at: \n{}".format(close))
       print("\n")
       print(Style.RESET_ALL)
       tmp.pop(0)
       tmp.append(float(close))

ws = websocket.WebSocketApp(SOCKET, on_open=on_open, on_close=on_close, on_message=on_message)
ws.run_forever()

这里对ticker值做自动转小写处理,是因为Binance WebSocket接口要求路径中的交易对为小写格式,避免用户输入大写格式导致连接失败。


第二步:改造GUI启动逻辑,修正变量错误并传递ticker值

替换原有的os.system启动方式为更安全的subprocess,从输入框读取ticker值后直接作为参数拼接启动命令,同时修复所有之前的变量名错配问题:

from tkinter import *
import subprocess  # 替换os.system,避免参数转义问题,启动更稳定

root = Tk()
WIDTH = 396
HEIGHT = 594
root.title('CheckBot')
root.geometry("396x594")

bg = PhotoImage(file = "rocket.png")

def start_bot():
    # 从ticker输入框读取用户填写的值,去空格、转小写
    input_ticker = ticker_entry.get().strip().lower()
    # 空值做拦截,避免无参启动后卡在终端输入环节
    if not input_ticker:
        print("请先填写需要交易的ticker值")
        return
    # 以参数列表的形式启动bot.py,自动处理所有特殊字符的转义,不需要手动拼接命令
    subprocess.Popen(["python", "bot.py", input_ticker])

my_canvas = Canvas(root, width=WIDTH, height=HEIGHT)
my_canvas.pack(fill="both", expand=True)
my_canvas.create_image(0,0, image=bg, anchor="nw")
my_canvas.create_text(200,30, text="Enter the ticker to trade", font=("Bembo Bold Italic", 15), fill="#cc5200")

# 修正原来的变量名错误,把错误的ticker改为实际定义的ticker_entry
ticker_entry = Entry(my_canvas, bg='white')
ticker_entry.pack(pady=50)

my_canvas.create_text(200,100, text="Enter amount to trade", font=("Bembo Bold Italic", 15), fill="#cc5200")
amount_entry = Entry(my_canvas, bg='white')
amount_entry.pack(pady=10)

# 修正按钮绑定逻辑,不需要额外传递参数,函数内部直接读取输入框值即可
trade_button = Button(my_canvas, text='Start trading', bg='#00b359', fg='#000099', command=start_bot)
trade_button.pack(pady=70)

root.mainloop()

实现效果

  • GUI中填写ticker值(如ethusdt、btcusdt)后点击启动,会自动执行带参数的启动命令,bot.py直接读取传入的ticker建立WebSocket连接,不会再弹出终端手动输入提示
  • 保留了原有bot.py的终端运行兼容性,直接在终端执行python bot.py时,还是会走原来的手动输入ticker流程,原有功能不受影响
  • 自动对用户输入的ticker做格式适配,避免大小写问题导致的Binance接口连接失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 19:36:04