使用 PySimpleGUI 3 分鐘製作下單程式

December 20, 2023

img


券商 API 與 PySimpleGUI

PySimpleGUI1 顧名思義就是非常簡單,它是建立在 Tkinter 與 Qt 之上,更加簡便

由於台股大多數券商 API 都是提供 dll 接到 Python 中,因此都要自己起事件循環

最好的方式就是搭一個簡單的 GUI 程式來學習券商 API

如果不想要花太多時間學習 GUI 開發,PySimpleGUI 就非常方便


快速復刻超級贏家下單介面

超級贏家的下單介面類似這樣:


img


PySimpleGUI 就是一行就是一個 list,超贏這個就是兩個 list:

import PySimpleGUI as sg

# 選項設置
accounts = ["證-1234-5678901-王小明  "]
flags = ["普通   ", "盤後   "]
tradeTypes = ["ROD ", "IOC ", "FOK "]

# 建立每個控件
layout = [
    [
        sg.Button("證"),
        sg.Button("零"),
        sg.Button("期"),
        sg.Button("權"),
        sg.Button("興"),
        sg.Combo(accounts, default_value=accounts[0], key="-ACCOUNT-"),
        sg.Radio("買進", "RadioBuysell", key="-RADIO-BUY-"),
        sg.Radio("賣出", "RadioBuysell", key="-RADIO-SELL-"),
    ],
    [
        sg.Combo(flags, default_value=flags[0], key="-FLAG-"),
        sg.Button("現"),
        sg.Button("資"),
        sg.Button("券"),
        sg.Button("無券"),
        sg.Text("", size=(1, 1)),
        sg.Button("代碼"),
        sg.InputText(size=(7, 1), key="-SYMBOL-CODE-"),
        sg.InputText(
            size=(15, 1), disabled=True, background_color="gray", key="-SYMBOL-NAME-"
        ),
        sg.Text("張數:", size=(4, 1)),
        sg.InputText("0", key="-VOLUME-", size=(5, 1), justification="right"),
        sg.Button("+", key="-INCREASE-VOLUME-"),
        sg.Button("-", key="-DECREASE-VOLUME-"),
        sg.Text("價格:", size=(4, 1)),
        sg.InputText("0", key="-PRICE-", size=(5, 1), justification="right"),
        sg.Button("+", key="-INCREASE-PRICE-"),
        sg.Button("-", key="-DECREASE-PRICE-"),
        sg.Button("現", key="-PRICE-CURRENT-"),
        sg.Button("漲", key="-PRICE-UP-"),
        sg.Button("跌", key="-PRICE-DOWN-"),
        sg.Button("平", key="-PRICE-FLAT-"),
        sg.Button("市", key="-PRICE-MARKET-"),
        sg.Combo(tradeTypes, default_value=tradeTypes[0], key="-TRADE-TYPES-"),
        sg.Button("立即下單", key="-SEND-ORDER-"),
        sg.Button("清除", key="-CLEAR-ALL-"),
    ],
]

這邊我們使用到一些控件,例如按鈕 Button, 文字 Text, 輸入框 InputText, 下拉選單 Combo

最重要就是知道 sizekey ,分別設定大小和事件觸發時知道是哪裡來的

通常 key 的命名習慣是 -XXX-XXX- 這樣,顏色、預設值也是很直覺與通用的 kwargs


建立完控件之後,就可以建立視窗並啟動事件循環:

window = sg.Window("快速下單", layout, size=(1100, 80))

# 建立事件循環
while True:
    event, values = window.read()
    if event in (None, "Cancel"):
        break
    print(f"Event: {event}")
    print(str(values))
window.close()


img


當你點擊或在輸入框打字、下拉選單選取,就會觸發事件

會透過 window.read() 給你 event, values ,例如點擊 立即下單 就會觸發:


# Event: -SEND-ORDER-
# {'-ACCOUNT-': '證-1234-5678901-王小明  ', '-RADIO-BUY-': False,
#  '-RADIO-SELL-': False, '-FLAG-': '普通   ', '-SYMBOL-CODE-': '',
#  '-SYMBOL-NAME-': '', '-VOLUME-': '0', '-TRADE-TYPES-': 'ROD '}

就可以透過事件名稱來源(也就是 key )與當前視窗的輸入字典資料來完成相關操作


Footnotes

1 PySimpleGUI 到 2023 都仍然開發活躍
GitHub 請見: https://github.com/PySimpleGUI/PySimpleGUI

Tags: pysimplegui trading gui python