From fb47d36048e94b9a506d5c153e3dd19a01e37df1 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期一, 30 十月 2023 16:30:27 +0800 Subject: [PATCH] bug修复 --- gui.py | 194 +++++++++++++++++++++++++++++------------------- 1 files changed, 116 insertions(+), 78 deletions(-) diff --git a/gui.py b/gui.py index 841765e..af2c0b4 100644 --- a/gui.py +++ b/gui.py @@ -3,29 +3,31 @@ """ from tkinter import * from tkinter.messagebox import * + +import numpy import tkintertable import win32gui -import constant -import data_export_util +from db.redis_manager_delegate import RedisUtils +from utils import data_export_util import multiprocessing -import log -from db import mysql_data, redis_manager +from log_module import log, log_export +from db import mysql_data_delegate as mysql_data, redis_manager_delegate as redis_manager import server -import settings -from juejin import JueJinManager -from l2_code_operate import L2CodeOperate -from trade import l2_trade_util +from config import settings +from ths.l2_code_operate import L2CodeOperate from trade.l2_trade_factor import L2TradeFactorUtil from ocr import ocr_server +from third_data import data_server, kpl_data_manager, kpl_util from server import * import l2.l2_data_util # 璇诲彇server杩涚▼鐨勬秷鎭� from trade.trade_data_manager import CodeActualPriceProcessor +from ui.my_widget import FlatButton def __read_server_pipe(pipe): @@ -58,6 +60,11 @@ t1.setDaemon(True) t1.start() + t1 = threading.Thread(target=createDataServer) + # 鍚庡彴杩愯 + t1.setDaemon(True) + t1.start() + laddr = "", 9001 tcpserver = MyThreadingTCPServer(laddr, MyBaseRequestHandle, pipe_juejin=pipe_juejin) # 娉ㄦ剰锛氬弬鏁版槸MyBaseRequestHandle # tcpserver.handle_request() # 鍙帴鍙椾竴涓鎴风杩炴帴 @@ -70,8 +77,12 @@ tcpserver.serve_forever() -def startJueJin(pipe): - juejin.JueJinManager(pipe).start() +def createDataServer(): + print("create OCRServer") + tcpserver = data_server.run("", 9004) + tcpserver.serve_forever() + + class GUI: @@ -81,7 +92,7 @@ gs_gui_pipe, gs_server_pipe = multiprocessing.Pipe() self.serverProcess = multiprocessing.Process(target=createServer, args=(p1, gs_server_pipe,)) - self.jueJinProcess = multiprocessing.Process(target=startJueJin, args=(p2,)) + self.jueJinTradeProcess = multiprocessing.Process(target=trade_juejin.run) self.ocrServerProcess = multiprocessing.Process(target=createOCRServer) self.p1 = p1 @@ -114,10 +125,10 @@ time.sleep(0.1) def run(self): - # TODO - self.jueJinProcess.start() self.serverProcess.start() self.ocrServerProcess.start() + self.jueJinTradeProcess.start() + L2CodeOperate.get_instance() # 瀹㈡埛绔槦鍒楁搷浣� process = multiprocessing.Process(target=L2CodeOperate.run()) @@ -142,22 +153,22 @@ for i in range(0, len(content)): text.tag_add('error', "{}.{}".format(line, i)) - def sync_target_codes(): - server.sync_target_codes_to_ths() - def click(): text.delete('1.0', END) # 楠岃瘉redis + redis = redis_manager.RedisManager().getRedis() try: - redis = redis_manager.RedisManager().getRedis() - redis.set("test", "1") - redis.delete("test") + + RedisUtils.set( redis,"test", "1",auto_free=False) + RedisUtils.delete(redis, "test", auto_free=False) text.insert(END, "redis杩炴帴鎴愬姛锛乗n") except: error = "redis杩炴帴澶辫触...\n" text.insert(END, error) _set_error_color(text, 1, error) + finally: + RedisUtils.realse(redis) # 楠岃瘉mongodb try: counts = mysql_data.Mysqldb().select_one("select count(*) from clients") @@ -204,23 +215,19 @@ text = Text(frame, height=100, undo=True) text.place(x=0, y=40) - btn = Button(frame, text="杩愯鐜妫�娴�", command=click) + btn = FlatButton(frame, text="杩愯鐜妫�娴�", command=click) btn.place(x=5, y=5) - - btn = Button(frame, text="鍚屾THS鐩爣鏍囩殑", command=sync_target_codes) - btn.place(x=100, y=5) frame.grid(row=1, column=2) # 缁樺埗寮�鐩樺墠鐨勬暟鎹噯澶囨儏鍐� def __draw_pre_data_check(self, frame): def refresh_close_price_data(): - redis = redis_manager.RedisManager(0).getRedis() - count = len(redis.keys("price-pre-*")) + count = len(RedisUtils.keys(redis_manager.RedisManager(0).getRedis(), "price-pre-*")) sv_num.set("鑾峰彇鍒版敹鐩樹环鏁伴噺锛歿}".format(count)) def re_get_close_price(): - juejin.re_set_price_pres(gpcode_manager.get_gp_list()) + inited_data.re_set_price_pres(gpcode_manager.get_gp_list()) def get_limit_up_codes_win(): width = 500 @@ -294,19 +301,26 @@ index += 1 table.redraw() + # 鍒锋柊寮�鐩樺暒鏁版嵁 + def refresh_kpl_data(): + kpl_data_manager.KPLDataManager().get_data(kpl_util.KPLDataType.LIMIT_UP) + kpl_data_manager.KPLDataManager().get_data(kpl_util.KPLDataType.OPEN_LIMIT_UP) + kpl_data_manager.KPLDataManager().get_data(kpl_util.KPLDataType.BEST_FENG_KOU) + kpl_data_manager.KPLDataManager().get_data(kpl_util.KPLDataType.FENG_KOU) + kpl_data_manager.KPLDataManager().get_data(kpl_util.KPLDataType.FENG_XIANG) + start_y = 225 - btn = Button(frame, text="鍒锋柊鏀剁洏浠�", command=refresh_close_price_data) + btn = FlatButton(frame, text="鍒锋柊鏀剁洏浠�", command=refresh_close_price_data) btn.place(x=5, y=start_y) sv_num = StringVar(value="鑾峰彇鍒版敹鐩樹环鏁伴噺锛氭湭鐭�") cl = Label(frame, textvariable=sv_num, bg="#DDDDDD", fg="#666666") cl.place(x=5, y=start_y + 30) - btn = Button(frame, text="閲嶆柊鑾峰彇鏀剁洏浠�", command=re_get_close_price) - btn.place(x=130, y=start_y) - - btn = Button(frame, text="浠婃棩娑ㄥ仠", command=get_limit_up_codes_win) - btn.place(x=250, y=start_y) + btn = FlatButton(frame, text="閲嶆柊鑾峰彇鏀剁洏浠�", command=re_get_close_price) + btn.place(x=80, y=start_y) + kpl_data = Label(text="娑ㄥ仠锛歕n鐐告澘锛歕n鏈�寮猴細\n椋庡悜锛歕n椋庡彛锛�", bg="#DDDDDD", fg="#666666") + kpl_data.place(x=190, y=start_y) trade_win_datas = [] # draw_trade_buy_win(360, 140) @@ -322,18 +336,23 @@ refresh_trade_buy_win_data() refresh_close_price_data() - btn = Button(frame, text="鍒锋柊", command=refresh_trade_buy_win_data, height=1) + btn = FlatButton(frame, text="鍒锋柊", command=refresh_trade_buy_win_data) btn.place(x=450 - 35, y=start_y) def re_distribute_buy_win(): try: - juejin.distribute_buy_win() + if tool.trade_time_sub(tool.get_now_time_str(), "09:30:00") > 0: + raise Exception("鍙兘9:30涔嬪墠閲嶆柊鍒嗛厤绐楀彛") + datas = HistoryKDatasUtils.get_codes_limit_rate(gpcode_manager.get_gp_list()) + matrix = numpy.array(datas) + codes = matrix[:, 0].tolist() + trade_gui.re_distribute_buy_win(codes) refresh_trade_buy_win_data() showinfo("鎻愮ず", "鍒嗛厤瀹屾垚") except Exception as e: showerror("鍒嗛厤鍑洪敊", str(e)) - btn = Button(frame, text="閲嶆柊鍒嗛厤绐楀彛", command=re_distribute_buy_win, height=1) + btn = FlatButton(frame, text="閲嶆柊鍒嗛厤绐楀彛", command=re_distribute_buy_win) btn.place(x=450 - 83, y=start_y + 30) # 缁樺埗浜ゆ槗鐘舵�� @@ -347,13 +366,14 @@ normal = False try: trade_gui.THSGuiTrade.checkEnv() - cl_win.configure(text="姝e父", foreground="#008000") + cancel_win_num = trade_gui.THSGuiTrade.getCancelBuyWins() + cl_win.configure(text=f"姝e父({len(cancel_win_num)})", foreground="#008000") except Exception as e: normal = False cl_win.configure(text="寮傚父:{}".format(str(e)), foreground="#FF7F27") try: - juejin_length = JueJinManager.get_listen_codes_lenth() + juejin_length = 0 codes_length = len(gpcode_manager.get_gp_list()) cl_codes.configure(text="{}/{}".format(juejin_length, codes_length), foreground="#008000") except Exception as e: @@ -401,7 +421,7 @@ # 鑾峰彇鏈夋晥鐨凩2瀹㈡埛绔暟閲� l2_client_count = client_manager.getValidL2Clients() - if len(l2_client_count) < 2: + if len(l2_client_count) < 6: normal = False # 鐘舵�佹湁闂锛岄渶瑕佹姤璀� @@ -420,7 +440,7 @@ start_y = 285 - btn = Button(frame, text="鍒锋柊鐘舵��", command=refresh_data) + btn = FlatButton(frame, text="鍒锋柊鐘舵��", command=refresh_data) btn.place(x=10, y=start_y) auo_refresh = IntVar() @@ -563,7 +583,7 @@ win.resizable(height=False, width=False) text = Text(win, height=100, undo=True) text.place(x=0, y=30) - btn = Button(win, text="涓�閿慨澶�", command=repair) + btn = FlatButton(win, text="涓�閿慨澶�", command=repair) btn.place(x=0, y=0) line = 0 @@ -582,7 +602,7 @@ win.mainloop() def init(): - juejin.everyday_init() + inited_data.everyday_init() def set_accept_l2(): settings.set_accept_l2(accept_l2.get()) @@ -610,7 +630,21 @@ width = 800 height = 360 frame = Frame(root, {"height": height, "width": width, "bg": "#DDDDDD"}) - cl = Label(frame, text="L2閲囬泦鐘舵��", bg="#DDDDDD") + trade_info = "" + for_color = "#008000" + if constant.TEST: + trade_info += "娴嬭瘯鐜" + for_color = "#FF7F27" + else: + trade_info += "姝e紡鐜" + trade_info += " " + if constant.TRADE_ENABLE: + trade_info += "鍒濆鍏佽浜ゆ槗" + else: + trade_info += "鍒濆绂佹浜ゆ槗" + for_color = "#FF7F27" + + cl = Label(frame, text=f"{trade_info}", bg="#DDDDDD", foreground=f"{for_color}") cl.place(x=5, y=5) accept_l2 = IntVar() @@ -622,10 +656,10 @@ else: accept_l2.set(0) - btn = Button(frame, text="姣忔棩鍒濆鍖�", command=init) + btn = FlatButton(frame, text="姣忔棩鍒濆鍖�", command=init) btn.place(x=width - 250, y=5) - btn = Button(frame, text="鍒锋柊鏁版嵁", command=refresh_data) + btn = FlatButton(frame, text="鍒锋柊鏁版嵁", command=refresh_data) btn.place(x=width - 150, y=5) auo_refresh = IntVar() ch1 = Checkbutton(frame, text='鑷姩鍒锋柊', variable=auo_refresh, onvalue=1, offvalue=0, background="#DDDDDD", @@ -646,16 +680,17 @@ menu.add_command(label="鐜妫�娴�", command=check_env) menu.add_command(label="鍚岃姳椤烘祴閫�", command=ths_test_speed) + device_index = 0 for key in self.l2_codes: - - client_lb = Label(frame, text="璁惧:{}".format(key), background="#DDDDDD") + device_index += 1 + client_lb = Label(frame, text="璁惧:{} ID:{}".format(device_index, key), background="#DDDDDD") client_lb.place(x=38, y=40 + l2_client_count * 30) - btn = Button(frame, text="妫�娴�", command=key) + btn = FlatButton(frame, text="妫�娴�", command=key) btn.bind('<Button-3>', lambda event: pop_menu(event)) btn.place(x=5, y=35 + l2_client_count * 30) client_state_lb = Label(frame, text="(鏈煡)", padx=0, pady=0, background="#DDDDDD", font=('寰蒋闆呴粦', 8)) - client_state_lb.place(x=82, y=40 + l2_client_count * 30) + client_state_lb.place(x=112, y=40 + l2_client_count * 30) client_state[key] = client_state_lb code_sv_map[key] = [] code_labels[key] = [] @@ -667,7 +702,7 @@ code_labels[key].append(code_label) code_label.place(x=0, y=0) - cframe.place(x=200 + i * 85, y=40 + l2_client_count * 30) + cframe.place(x=250 + i * 85, y=40 + l2_client_count * 30) l2_client_count += 1 # 娣诲姞鏇存柊绾跨▼ t1 = threading.Thread(target=lambda: update_data()) @@ -688,7 +723,7 @@ time.sleep(1) def refresh_data(): - money = trade_manager.get_available_money() + money = trade_manager.AccountAvailableMoneyManager().get_available_money() if money is not None: sv_trade_money.set(money) else: @@ -727,16 +762,17 @@ index = 0 for data in datas: table_trade.model.addRow() - table_trade.model.setValueAt(data["code"], index, 0) - table_trade.model.setValueAt(data["time"], index, 1) - table_trade.model.setValueAt(data["num"], index, 2) - table_trade.model.setValueAt(data["price"], index, 3) - table_trade.model.setValueAt(data["money"], index, 4) - table_trade.model.setValueAt(data["trade_num"], index, 5) if int(data["type"]) > 0: - table_trade.model.setValueAt("鍗栧嚭", index, 6) + table_trade.model.setValueAt("鍗栧嚭", index, 0) else: - table_trade.model.setValueAt("涔板叆", index, 6) + table_trade.model.setValueAt("涔板叆", index, 0) + table_trade.model.setValueAt(data["code"], index, 1) + table_trade.model.setValueAt(data["time"], index, 2) + table_trade.model.setValueAt(data["num"], index, 3) + table_trade.model.setValueAt(data["price"], index, 4) + table_trade.model.setValueAt(data["money"], index, 5) + table_trade.model.setValueAt(data["trade_num"], index, 6) + index += 1 table_trade.redraw() @@ -764,7 +800,7 @@ cl = Label(frame, textvariable=sv_trade_money, bg="#DDDDDD", fg="#666666") cl.place(x=190, y=5) - btn = Button(frame, text="鍒锋柊鏁版嵁", command=refresh_data) + btn = FlatButton(frame, text="鍒锋柊鏁版嵁", command=refresh_data) btn.place(x=width - 150, y=5) auo_refresh = IntVar() ch1 = Checkbutton(frame, text='鑷姩鍒锋柊', variable=auo_refresh, onvalue=1, offvalue=0, background="#DDDDDD", @@ -807,12 +843,12 @@ cl.place(x=width - 70, y=30) trade_datas = {} - trade_datas["row{}".format(0)] = {'璇佸埜浠g爜': '', '鎴愪氦鏃堕棿': '', '鎴愪氦鏁伴噺': '', '鎴愪氦鍧囦环': '', '鎴愪氦閲戦': '', - '鍚堝悓缂栧彿': '', '鎿嶄綔': ''} + trade_datas["row{}".format(0)] = {'鏂瑰悜': '', '璇佸埜浠g爜': '', '鎴愪氦鏃堕棿': '', '鎴愪氦鏁伴噺': '', '鎴愪氦鍧囦环': '', '鎴愪氦閲戦': '', + '鍚堝悓缂栧彿': ''} table_frame = Frame(frame, {"height": table_height, "width": table_width, "bg": "#DDDDDD"}) table_frame.place(x=width / 2, y=52) - table_trade = create_table(table_frame, trade_datas, 90) + table_trade = create_table(table_frame, trade_datas, 70) table_trade.show() frame.grid(row=2, column=1, padx=5, pady=5, rowspan=2) @@ -831,7 +867,7 @@ if len(account.strip()) < 1 or len(sid.strip()) < 1 or len(token.strip()) < 1: showinfo('鎻愮ず', "鏁版嵁涓嶅畬鏁�") return - juejin.setAccountInfo(account, sid, token) + inited_data.setAccountInfo(account, sid, token) showinfo('鎻愮ず', "璁剧疆鎴愬姛") # 璁剧疆鎺橀噾淇℃伅 @@ -857,13 +893,13 @@ entry = Entry(frame, textvariable=token_var, width=30) entry.place(x=left + 60, y=top + 60) - btn = Button(frame, text="璁剧疆鎺橀噾鍙傛暟", command=click) + btn = FlatButton(frame, text="璁剧疆鎺橀噾鍙傛暟", command=click) btn.place(x=left + 60, y=top + 90) # frame.place(x=260,y=10) frame.grid(row=0, column=2, pady=5, padx=5) # 璁剧疆鍙傛暟 - account, sid, token = juejin.getAccountInfo() + account, sid, token = inited_data.getAccountInfo() account_var.set(account) sid_var.set(sid) token_var.set(token) @@ -908,10 +944,10 @@ def export_l2_data_origin(code): redis = redis_manager.RedisManager(1).getRedis() - keys = redis.keys("big_data-{}-*".format(code)) try: + keys = RedisUtils.keys(redis, "big_data-{}-*".format(code), auto_free=False) for k in keys: - datas = redis.get(k) + datas = redis.get(k, auto_free=False) datas = json.loads(datas) _t = k.split("-")[2] k = time.strftime("%Y_%m_%d_%H_%M_%S_", time.localtime(float(_t) / 1000)) @@ -919,6 +955,8 @@ data_export_util.export_l2_data_origin(code, datas, k) except Exception as e1: showerror("瀵煎嚭澶辫触", str(e1)) + finally: + RedisUtils.realse(redis) showinfo("鎻愮ず", "瀵煎嚭瀹屾垚") @@ -961,40 +999,40 @@ code = Entry(frame) code.place(x=50, y=70) - btn = Button(frame, text="璁剧疆浠g爜", command=lambda: setGPCode(ep_client.get(), ep.get(), code.get()), ) + btn = FlatButton(frame, text="璁剧疆浠g爜", command=lambda: setGPCode(ep_client.get(), ep.get(), code.get()), ) btn.place(x=10, y=100) - btn = Button(frame, text="淇L2鏁版嵁", command=lambda: L2CodeOperate.get_instance().repaire_l2_data(code.get())) + btn = FlatButton(frame, text="淇L2鏁版嵁", command=lambda: L2CodeOperate.get_instance().repaire_l2_data(code.get())) btn.place(x=70 , y=100) - btn = Button(frame, text="瀵煎嚭L2鏁版嵁", command=lambda: export_l2_data(code.get())) + btn = FlatButton(frame, text="瀵煎嚭L2鏁版嵁", command=lambda: export_l2_data(code.get())) btn.place(x=145, y=100) - btn = Button(frame, text="瀵煎嚭L2鍘熷鏁版嵁", command=lambda: export_l2_data_origin(code.get())) + btn = FlatButton(frame, text="瀵煎嚭L2鍘熷鏁版嵁", command=lambda: export_l2_data_origin(code.get())) btn.place(x=220, y=100) - btn = Button(frame, text="鑾峰彇m鍊�", command=lambda: compute_m(code.get())) + btn = FlatButton(frame, text="鑾峰彇m鍊�", command=lambda: compute_m(code.get())) btn.place(x=10, y=130) - btn = Button(frame, text="瀵煎嚭浜ゆ槗鏃ュ織", command=lambda: log.export_l2_log(code.get())) + btn = FlatButton(frame, text="瀵煎嚭浜ゆ槗鏃ュ織", command=lambda: log_export.export_l2_log(code.get())) btn.place(x=80, y=130) - btn = Button(frame, text="娓呯┖l2鏁版嵁", command=lambda: clear_l2(code.get())) + btn = FlatButton(frame, text="娓呯┖l2鏁版嵁", command=lambda: clear_l2(code.get())) btn.place(x=150, y=130) - btn = Button(frame, text="鎾ら攢鎸傚崟", command=lambda: cancel_order(code.get())) + btn = FlatButton(frame, text="鎾ら攢鎸傚崟", command=lambda: cancel_order(code.get())) btn.place(x=230, y=130) # 浜ゆ槗鎸夐挳 - btn = Button(frame, textvariable=btntext, command=startJueJinGui) + btn = FlatButton(frame, textvariable=btntext, command=startJueJinGui) btn.place(x=10, y=160) btntext.set("鍚姩鎺橀噾") - btn = Button(frame, text="閲嶆柊璁㈤槄琛屾儏", command=resub) + btn = FlatButton(frame, text="閲嶆柊璁㈤槄琛屾儏", command=resub) btn.place(x=10, y=190) - btn = Button(frame, text="鍒锋柊绐楀彛鍙ユ焺", command=refresh_hwnds) + btn = FlatButton(frame, text="鍒锋柊绐楀彛鍙ユ焺", command=refresh_hwnds) btn.place(x=200, y=190) def create_gui(self): -- Gitblit v1.8.0