如何通过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
相关产品推荐
相关产品推荐

