Home
Software Programming Learning
EDA & IP & IC
Goodies
News
Contact Us
Article
Contents Of Article
Previous Article
SNO:
Writer:
No Next Article
Title:
""" To run this program, users need to put a file stockList.txt in the same directory of this program. stockList.txt contains a list of stock ID & the associated number of shares. An example of stockList.txt and the corresponding dictionary, stockList, are shown below. stockList.txt 2330, 1000 0050, 5000 stockList = {"2330":1000,"0050":5000} """ import time import requests from bs4 import BeautifulSoup import tkinter as tk stockList = {} with open("stockList.txt","r") as f: for item in f.readlines(): i = item.strip().split(",") stockList[i[0]]=int(i[1]) window = tk.Tk() longInterval = tk.IntVar() longInterval.set(60000) shortInterval = tk.IntVar() shortInterval.set(10000) intervalVar = tk.StringVar() intervalVar.set("5") messageChange = "Change Interval" messageDone = "Change Done" messageEnter = "<< Enter Digits" windowTitle = "myStockTk v4" def btnEndClick(): window.destroy() def btnUpdateClick(): global jobScrapStockPrice, jobScrapGoldPrice, jobScrapGCK99Price, jobScrapBoTGoldPrice global jobScrapUSDRate, jobScrap30YearBondYield def messageBack(): buttonUpdate["text"]=messageChange try: intervalBase = int(intervalVar.get()) if intervalBase <= 0: buttonUpdate["text"] = messageEnter return longInterval.set(6000 * intervalBase) shortInterval.set(1000 * intervalBase) except: buttonUpdate["text"]= messageEnter return window.after_cancel(jobScrapStockPrice) window.after_cancel(jobScrapGoldPrice) window.after_cancel(jobScrapGCK99Price) window.after_cancel(jobScrapBoTGoldPrice) window.after_cancel(jobScrapUSDRate) window.after_cancel(jobScrap30YearBondYield) scrapStockPrice() scrapGoldPrice() scrapGCK99Price() scrapBoTGoldPrice() scrapUSDRate() scrap30YearBondYield() buttonUpdate["text"]= messageDone window.after(2000,messageBack) window.geometry("800x800") window.title(windowTitle) myFrame = tk.Frame(window,bg="#007F00",width=800,height=900) myFrame.pack() listboxStockPrice = tk.Listbox(myFrame,font=("MS Gothic", 16),width=60,height=20) listboxStockPrice.place(relx=0.1,rely=0.62,anchor="w") labelGoldPrice = tk.Label(myFrame, width=60, anchor="w", font=("MS Gothic",16), text="Gold Price Information will be shown here.") labelGoldPrice.place(relx=0.1,rely=0.05,anchor="w") labelGCK99GoldPrice = tk.Label(myFrame, width=60, anchor="w", font=("MS Gothic",16), text="GCK99 Gold Price Information will be shown here.") labelGCK99GoldPrice.place(relx=0.1,rely=0.1,anchor="w") labelBoTGoldPrice = tk.Label(myFrame, width=60, anchor="w", font=("MS Gothic",16), text="BoT Gold Price Information will be shown here.") labelBoTGoldPrice.place(relx=0.1,rely=0.15,anchor="w") labelUSDRate = tk.Label(myFrame, width=60, anchor="w", font=("MS Gothic",16), text="Exchange Rate of NTD/USD will be shown here.") labelUSDRate.place(relx=0.1,rely=0.2,anchor="w") label30YearBondYield = tk.Label(myFrame, width=60, anchor="w", font=("MS Gothic",16), text="US 30-Year Bond Yield will be shown here.") label30YearBondYield.place(relx=0.1,rely=0.25,anchor="w") labelUpdate = tk.Label(myFrame, font=("MS Gothic", 16), text="Update Interval(sec)") labelUpdate.place(relx=0.1, rely=0.30, anchor="w") entryInterval = tk.Entry(myFrame, bg="#00FF00", width=20, justify=tk.RIGHT, textvariable=intervalVar, font=("MS Gothic",16)) entryInterval.place(relx=0.4, rely=0.30,anchor="w") buttonEnd = tk.Button(myFrame, bg="#FFFF00", font=("MS Gothic",16), text="END", command=btnEndClick) buttonEnd.place(relx=0.5,rely=0.95,anchor="w") buttonUpdate = tk.Button(myFrame, bg="#FFFF00", font=("MS Gothic",16), text=messageChange, command=btnUpdateClick) buttonUpdate.place(relx=0.7,rely=0.30,anchor="w") def scrapStockPrice(): global jobScrapStockPrice list2Display = [] earning = 0 flag = 0 for myStock in stockList: try: page = requests.get("https://tw.stock.yahoo.com/q/q?s="+myStock) bs = BeautifulSoup(page.text,"lxml") targetTable = bs.find_all("table")[2] targetTd = targetTable.find_all("td") todayPrice = float(targetTd[2].text) yesterdayPrice = float(targetTd[7].text) changePrice = todayPrice - yesterdayPrice earning += stockList[myStock] * changePrice list2Display.append([myStock,todayPrice,yesterdayPrice,changePrice,stockList[myStock]*changePrice]) except: if stockList[myStock] != 0: flag = 1 print(f"Warning: Could not find {myStock}-related information.") listboxStockPrice.delete(0,tk.END) listboxStockPrice.insert(tk.END, f"{time.asctime(time.localtime(time.time()))}, Currency: NTD") listboxStockPrice.insert(tk.END,"") listboxStockPrice.insert(tk.END,"Stock ID | Now Price | Pre. Price | Change | Earning") for row in list2Display: zzz = f"{row[0]:9s}:{row[1]:10.2f} | {row[2]:10.2f} | {row[3]:8.2f} | {row[4]:9.1f}" listboxStockPrice.insert(tk.END,zzz) listboxStockPrice.insert(tk.END,"") if flag == 1: listboxStockPrice.insert(tk.END, f"Warning: Some stock information is missing !") listboxStockPrice.insert(tk.END, f" Total Earning Today: {float(earning):.1f}") else: listboxStockPrice.insert(tk.END, f"Total Earning Today: {float(earning):.1f}") jobScrapStockPrice = window.after(shortInterval.get(),scrapStockPrice) def scrapGoldPrice(): global jobScrapGoldPrice try: page = requests.get("https://www.goldlegend.com/") bs = BeautifulSoup(page.text, "lxml") targetH3 = bs.select("h3")[0] labelGoldPrice["text"]="Gold Price : USD " + targetH3.text + " / Ounce" except: print("Warning: Could not find gold price information.") jobScrapGoldPrice = window.after(shortInterval.get(), scrapGoldPrice) def scrapGCK99Price(): global jobScrapGCK99Price try: page = requests.get("https://www.gck99.com.tw/gold.php") bs = BeautifulSoup(page.text, "lxml") targetTd = bs.select("td") labelGCK99GoldPrice["text"]="GCK99 Gold Ingot Purchase Price : NTD " + f"{int(targetTd[14].text)*10+2900:,d}" + " / Tael" except: print("Warning: Could not find GCK99 gold price information.") jobScrapGCK99Price = window.after(longInterval.get(), scrapGCK99Price) def scrapBoTGoldPrice(): global jobScrapBoTGoldPrice try: page = requests.get("https://rate.bot.com.tw/gold?Lang=zh-TW") bs = BeautifulSoup(page.text, "lxml") targetTd = bs.find_all("td") labelBoTGoldPrice["text"] = "BoT Gold Price : NTD " + targetTd[5].text + " / g" except: print("Warning: Could not find BoT gold price information.") jobScrapBoTGoldPrice = window.after(longInterval.get(), scrapBoTGoldPrice) def scrapUSDRate(): global jobScrapUSDRate try: page = requests.get("https://rate.bot.com.tw/xrt?Lang=zh-TW") bs = BeautifulSoup(page.text, "lxml") targetTd = bs.find_all("td", attrs={"data-table":"本行即期買入"}) labelUSDRate["text"]="BoT Exchange Rate : " + targetTd[0].text + " NTD/USD" except: print("Warning: Could not find NTD/USD exchange rate information.") jobScrapUSDRate = window.after(longInterval.get(), scrapUSDRate) def scrap30YearBondYield(): global jobScrap30YearBondYield try: headers = {"user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"} page = requests.get("https://www.investing.com/rates-bonds/u.s.-30-year-bond-yield", headers=headers) bs = BeautifulSoup(page.text, "lxml") targetId = bs.select("#last_last") label30YearBondYield["text"] = "US 30-Year Bond Yield : " + targetId[0].text + "%" except: print("Warning: Could not find 30-year bond yield information.") jobScrap30YearBondYield = window.after(shortInterval.get(),scrap30YearBondYield) scrapStockPrice() scrapGoldPrice() scrapGCK99Price() scrapBoTGoldPrice() scrapUSDRate() scrap30YearBondYield() window.mainloop()
Previous Article