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 | 594 +++++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 477 insertions(+), 117 deletions(-) diff --git a/gui.py b/gui.py index 56ca360..af2c0b4 100644 --- a/gui.py +++ b/gui.py @@ -3,59 +3,132 @@ """ from tkinter import * from tkinter.messagebox import * -import tkintertable +import numpy +import tkintertable import win32gui -import data_export_util +from db.redis_manager_delegate import RedisUtils +from utils import data_export_util import multiprocessing - -import redis_manager -import mongo_data +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 trade_gui -from l2_code_operate import L2CodeOperate -from l2_trade_factor import L2TradeFactorUtil +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 createServer(pipe): +def __read_server_pipe(pipe): + while True: + value = pipe.recv() + if value is not None: + value = json.loads(value) + if value.get("type") == "clear_l2": + code = value["data"]["code"] + print("娓呴櫎l2鏁版嵁", code) + if len(code) != 6: + continue + l2_data_manager.clear_l2_data(code) + # 鍒犻櫎level2鐨勬暟鎹� + if l2.l2_data_util.local_today_datas and code in l2.l2_data_util.local_today_datas: + l2.l2_data_util.local_today_datas.pop(code) + if l2.l2_data_util.local_latest_datas and code in l2.l2_data_util.local_latest_datas: + l2.l2_data_util.local_latest_datas.pop(code) + + time.sleep(0.1) + + +def createServer(pipe_juejin, pipe_gui): print("create SocketServer") # 鍒濆鍖栧弬鏁� - global_util.init() + global_data_loader.init() + + t1 = threading.Thread(target=lambda: __read_server_pipe(pipe_gui)) + # 鍚庡彴杩愯 + t1.setDaemon(True) + t1.start() + + t1 = threading.Thread(target=createDataServer) + # 鍚庡彴杩愯 + t1.setDaemon(True) + t1.start() + laddr = "", 9001 - tcpserver = MyThreadingTCPServer(laddr, MyBaseRequestHandle, pipe=pipe) # 娉ㄦ剰锛氬弬鏁版槸MyBaseRequestHandle + tcpserver = MyThreadingTCPServer(laddr, MyBaseRequestHandle, pipe_juejin=pipe_juejin) # 娉ㄦ剰锛氬弬鏁版槸MyBaseRequestHandle # tcpserver.handle_request() # 鍙帴鍙椾竴涓鎴风杩炴帴 tcpserver.serve_forever() # 姘镐箙寰幆鎵ц,鍙互鎺ュ彈澶氫釜瀹㈡埛绔繛鎺� -def startJueJin(pipe): - juejin.JueJinManager(pipe).start() +def createOCRServer(): + print("create OCRServer") + tcpserver = ocr_server.run("", 9002) + tcpserver.serve_forever() + + +def createDataServer(): + print("create OCRServer") + tcpserver = data_server.run("", 9004) + tcpserver.serve_forever() + + class GUI: + def __init__(self): p1, p2 = multiprocessing.Pipe() + gs_gui_pipe, gs_server_pipe = multiprocessing.Pipe() - self.serverProcess = multiprocessing.Process(target=createServer, args=(p1,)) - self.jueJinProcess = multiprocessing.Process(target=startJueJin, args=(p2,)) + self.serverProcess = multiprocessing.Process(target=createServer, args=(p1, gs_server_pipe,)) + self.jueJinTradeProcess = multiprocessing.Process(target=trade_juejin.run) + self.ocrServerProcess = multiprocessing.Process(target=createOCRServer) + + self.p1 = p1 + self.p2 = p2 + self.gs_gui_pipe = gs_gui_pipe + self.thsBuy1VolumnManager = THSBuy1VolumnManager() + self.codeActualPriceProcessor = CodeActualPriceProcessor() # L2鏄剧ず self.l2_codes = {} + self.selected_client = {} # 鑾峰彇l2鐨勫鎴风鍒楄〃 clients = authority.get_l2_clients() for client_id in clients: self.l2_codes[client_id] = [] - for i in range(0, 8): + for i in range(0, constant.L2_CODE_COUNT_PER_DEVICE): code = gpcode_manager.get_listen_code_by_pos(client_id, i) self.l2_codes[client_id].append(code) + # 璇诲彇server杩涚▼鐨勬秷鎭� + def __read_gui_server_pipe(self, pipe): + while True: + value = pipe.recv() + if value is not None: + value = json.loads(value) + if value.get("type") == "l2_data_notify": + code = value["data"]["code"] + count = value["data"]["count"] + print("l2鏁版嵁閫氱煡锛歿}-{}", code, count) + + 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()) @@ -63,6 +136,11 @@ # 瀹㈡埛绔痵erver杩炴帴 t1 = threading.Thread(target=lambda: server.test_client_server()) + # 鍚庡彴杩愯 + t1.setDaemon(True) + t1.start() + + t1 = threading.Thread(target=lambda: self.__read_gui_server_pipe(self.gs_gui_pipe)) # 鍚庡彴杩愯 t1.setDaemon(True) t1.start() @@ -75,30 +153,30 @@ 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: - count = mongo_data.count("clients", {}) - if count < 1: + counts = mysql_data.Mysqldb().select_one("select count(*) from clients") + if counts[0] < 1: raise Exception("") - text.insert(END, "mongodb杩炴帴鎴愬姛锛乗n") + text.insert(END, "mysql杩炴帴鎴愬姛锛乗n") except: - error = "mongodb杩炴帴澶辫触...\n" + error = "mysql杩炴帴澶辫触...\n" text.insert(END, error) _set_error_color(text, 2, error) pass @@ -137,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 @@ -163,7 +237,7 @@ win.resizable(height=False, width=False) limit_up_datas = {} - limit_up_datas["row{}".format(0)] = {'浠g爜': '', '棣栨娑ㄥ仠鏃堕棿': '', '鐜颁环': '','娑ㄥ箙':'', '娑ㄥ仠灏佸崟棰�': ''} + limit_up_datas["row{}".format(0)] = {'浠g爜': '', '棣栨娑ㄥ仠鏃堕棿': '', '鐜颁环': '', '娑ㄥ箙': '', '娑ㄥ仠灏佸崟棰�': ''} cl = Label(win, text="鏇存柊鏃堕棿锛�", bg="#DDDDDD", fg="#666666") cl.place(x=10, y=10) @@ -184,7 +258,7 @@ table_limit_up.show() # 鑾峰彇鏁版嵁 - time_str, datas = gpcode_manager.get_limit_up_list(); + time_str, datas = gpcode_manager.get_limit_up_list() limit_up_datas_time.set(time_str) # 鍒犻櫎鎵�鏈夌殑琛� # table_limit_up.model.deleteRows() @@ -205,18 +279,214 @@ win.geometry("{}x{}".format(width, height)) win.mainloop() - btn = Button(frame, text="鍒锋柊鏀剁洏浠�", command=refresh_close_price_data) - btn.place(x=5, y=150) + # 缁樺埗浠g爜浜ゆ槗绐楀彛鍒嗛厤 + def refresh_trade_buy_win_data(): + code_wins = trade_gui.THSBuyWinManagerNew.get_distributed_code_wins() + # 鑾峰彇浠g爜娑ㄥ箙 + codeActualPriceProcessor = trade_data_manager.CodeActualPriceProcessor() + datas = [] + for data in code_wins: + rate = codeActualPriceProcessor.get_current_rate(data[0]) + datas.append((data[0], rate, data[1])) + datas.sort(key=lambda tup: tup[1] if tup[1] is not None else 1) + datas.reverse() + index = 0 + table.model.deleteRows() + for data in datas: + table.model.addRow() + table.model.setValueAt(data[0], index, 0) + table.model.setValueAt(f"{data[1]}%", index, 1) + table.model.setValueAt(data[2], index, 2) + # table.model.setValueAt(data["apply_time"], index, 2) + 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 = 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=180) + cl.place(x=5, y=start_y + 30) - btn = Button(frame, text="閲嶆柊鑾峰彇鏀剁洏浠�", command=re_get_close_price) - btn.place(x=150, y=150) + 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) - btn = Button(frame, text="浠婃棩娑ㄥ仠", command=get_limit_up_codes_win) - btn.place(x=300, y=150) + trade_win_datas = [] + # draw_trade_buy_win(360, 140) + table_width = 300 + table_height = 95 + _frame = Frame(frame, {"height": table_height, "width": table_width, "bg": "#DDDDDD"}) + + table = tkintertable.TableCanvas(_frame, data={"row0": {'浠g爜': '', '娑ㄥ箙': '', '绐楀彛鍙ユ焺': ''}}, read_only=True, + width=table_width, height=table_height, thefont=('寰蒋闆呴粦', 9), cellwidth=100, + rowheaderwidth=20) + table.show() + _frame.place(x=450, y=start_y) + refresh_trade_buy_win_data() + refresh_close_price_data() + + btn = FlatButton(frame, text="鍒锋柊", command=refresh_trade_buy_win_data) + btn.place(x=450 - 35, y=start_y) + + def re_distribute_buy_win(): + try: + 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 = FlatButton(frame, text="閲嶆柊鍒嗛厤绐楀彛", command=re_distribute_buy_win) + btn.place(x=450 - 83, y=start_y + 30) + + # 缁樺埗浜ゆ槗鐘舵�� + def __draw_trade_state(self, frame): + def refresh_data(): + normal = True + if l2_code_operate.L2CodeOperate.is_read_queue_valid(): + cl_queue.configure(text="姝e父", foreground="#008000") + else: + cl_queue.configure(text="寮傚父", foreground="#FF7F27") + normal = False + try: + trade_gui.THSGuiTrade.checkEnv() + 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 = 0 + codes_length = len(gpcode_manager.get_gp_list()) + cl_codes.configure(text="{}/{}".format(juejin_length, codes_length), foreground="#008000") + except Exception as e: + pass + + # 鑾峰彇鏉垮潡鐘舵�� + try: + ths_dead = client_manager.getTHSState(7) + if ths_dead is None: + cl_block.configure(text="绂荤嚎", foreground="#FF7F27") + elif ths_dead: + normal = False + cl_block.configure(text="绂荤嚎", foreground="#FF7F27") + else: + cl_block.configure(text="鍦ㄧ嚎", foreground="#008000") + except: + pass + + try: + codes = self.thsBuy1VolumnManager.get_current_codes() + count = 0 + if codes: + count = len(codes) + if count < 1: + normal = False + cl_buy_1.configure(text="{}".format(count), foreground="#FF7F27") + else: + cl_buy_1.configure(text="{}".format(count), foreground="#008000") + except: + pass + + try: + count = self.codeActualPriceProcessor.get_current_price_codes_count() + if count is None or int(count) < 1: + normal = False + cl_price_count.configure( + text="{}".format(count), + foreground="#FF7F27") + else: + cl_price_count.configure( + text="{}".format(count), + foreground="#008000") + except: + pass + + # 鑾峰彇鏈夋晥鐨凩2瀹㈡埛绔暟閲� + l2_client_count = client_manager.getValidL2Clients() + if len(l2_client_count) < 6: + normal = False + + # 鐘舵�佹湁闂锛岄渶瑕佹姤璀� + if not normal: + alert_util.alarm() + + def update_data(): + while True: + # 鍒锋柊鏁版嵁 + try: + if auo_refresh.get() > 0: + refresh_data() + except: + pass + time.sleep(2) + + start_y = 285 + + btn = FlatButton(frame, text="鍒锋柊鐘舵��", command=refresh_data) + btn.place(x=10, y=start_y) + + auo_refresh = IntVar() + ch1 = Checkbutton(frame, text='鑷姩鍒锋柊', variable=auo_refresh, onvalue=1, offvalue=0, background="#DDDDDD", + activebackground="#DDDDDD") + # 榛樿鑷姩鍒锋柊 + auo_refresh.set(1) + ch1.place(x=100, y=start_y) + + y_ = start_y + 30 + cl = Label(frame, text="鎿嶄綔闃熷垪鐘舵�侊細", bg="#DDDDDD") + cl.place(x=10, y=y_) + cl_queue = Label(frame, text="鏈煡", bg="#DDDDDD") + cl_queue.place(x=100, y=y_) + + cl = Label(frame, text="浜ゆ槗绐楀彛鐘舵�侊細", bg="#DDDDDD") + cl.place(x=170, y=y_) + cl_win = Label(frame, text="鏈煡", bg="#DDDDDD") + cl_win.place(x=270, y=y_) + + cl = Label(frame, text="鏉垮潡鐘舵�侊細", bg="#DDDDDD") + cl.place(x=320, y=y_) + cl_block = Label(frame, text="鏈煡", bg="#DDDDDD") + cl_block.place(x=380, y=y_) + + cl = Label(frame, text="鎺橀噾浠g爜鍥炶皟鏁伴噺锛�", bg="#DDDDDD") + cl.place(x=300, y=y_ + 20) + cl_codes = Label(frame, text="鏈煡", bg="#DDDDDD") + cl_codes.place(x=410, y=y_ + 20) + + cl = Label(frame, text="涔�1浠g爜鏁伴噺锛�", bg="#DDDDDD") + cl.place(x=10, y=y_ + 20) + cl_buy_1 = Label(frame, text="鏈煡", bg="#DDDDDD") + cl_buy_1.place(x=10 + 90, y=y_ + 20) + + cl = Label(frame, text="鐜颁环浠g爜鏁伴噺锛�", bg="#DDDDDD") + cl.place(x=170, y=y_ + 20) + cl_price_count = Label(frame, text="鏈煡", bg="#DDDDDD") + cl_price_count.place(x=170 + 100, y=y_ + 20) + + refresh_data() + # 娣诲姞鏇存柊绾跨▼ + t1 = threading.Thread(target=lambda: update_data()) + # 鍚庡彴杩愯 + t1.setDaemon(True) + t1.start() # 缁樺埗l2鏁版嵁鐘舵�� def __draw_l2_state(self, root): @@ -232,8 +502,8 @@ def refresh_data(): for client_id in code_sv_map: - ip = data_process.getActiveClientIP(client_id) - ths_dead=data_process.getTHSState(client_id) + ip = client_manager.getActiveClientIP(client_id) + ths_dead = client_manager.getTHSState(client_id) if ip is not None and len(ip) > 0: if ths_dead: client_state[client_id].configure(text="(鍦ㄧ嚎锛歿})".format(ip), foreground="#FF7F27") @@ -242,9 +512,11 @@ else: client_state[client_id].configure(text="(绂荤嚎锛氭湭鐭P)", foreground="#999999") - for i in range(0, 8): + for i in range(0, constant.L2_CODE_COUNT_PER_DEVICE): code = gpcode_manager.get_listen_code_by_pos(client_id, i) - data_count = l2_data_manager.get_l2_data_latest_count(code) + data_count = l2_data_util.get_l2_latest_data_number(code) + if data_count is None: + data_count = 0 if code is not None and len(code) > 0: code_sv_map[client_id][i].set(code + "({})".format(data_count)) else: @@ -255,8 +527,7 @@ else: code_labels[client_id][i].configure(foreground="#999999") - def check(event): - client = (event.widget["command"]) + def check(client): msg_list = [] try: result = get_client_env_state(client) @@ -312,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 @@ -330,46 +601,108 @@ win.geometry("300x300") win.mainloop() + def init(): + inited_data.everyday_init() + + def set_accept_l2(): + settings.set_accept_l2(accept_l2.get()) + + def pop_menu(event): + self.selected_client = event.widget["command"] + menu.post(event.x_root, event.y_root) + + def ths_test_speed(): + if self.selected_client is None: + showwarning("璀﹀憡", "鏈�変腑瀹㈡埛绔�") + return + try: + server.repair_ths_main_site(self.selected_client) + showinfo("鎻愮ず", "鍚岃姳椤烘祴閫熷畬鎴�") + except Exception as e: + showerror("閿欒", str(e)) + + def check_env(): + if self.selected_client is None: + showwarning("璀﹀憡", "鏈�変腑瀹㈡埛绔�") + return + check(self.selected_client) + width = 800 - height = 290 + 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) - btn = Button(frame, text="鍒锋柊鏁版嵁", command=refresh_data) + accept_l2 = IntVar() + ch_accept_l2 = Checkbutton(frame, text='鎺ュ彈l2鏁版嵁', variable=accept_l2, onvalue=1, offvalue=0, + background="#DDDDDD", activebackground="#DDDDDD", command=set_accept_l2) + ch_accept_l2.place(x=width - 350, y=5) + if settings.is_accept_l2_data(): + accept_l2.set(1) + else: + accept_l2.set(0) + + btn = FlatButton(frame, text="姣忔棩鍒濆鍖�", command=init) + btn.place(x=width - 250, y=5) + + 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", activebackground="#DDDDDD") ch1.place(x=width - 80, y=5) + auo_refresh.set(1) l2_client_count = 0 code_sv_map = {} code_labels = {} client_state = {} + + # 鍙抽敭鑿滃崟 + menu = Menu(frame, + tearoff=False, + # bg="black", + ) + menu.add_command(label="鐜妫�娴�", command=check_env) + menu.add_command(label="鍚岃姳椤烘祴閫�", command=ths_test_speed) + + device_index = 0 for key in self.l2_codes: + 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 = 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_lb = Label(frame, text="璁惧:{}".format(key), background="#DDDDDD") - client_lb.place(x=30, y=40 + l2_client_count * 30) - btn = Button(frame, text="妫�娴�", command=key) - btn.bind('<Button-1>', check) - btn.place(x=0, y=35 + l2_client_count * 30) - - client_state_lb = Label(frame, text="(鏈煡)", background="#DDDDDD", font=('寰蒋闆呴粦', 8)) - client_state_lb.place(x=75, y=40 + l2_client_count * 30) + client_state_lb = Label(frame, text="(鏈煡)", padx=0, pady=0, background="#DDDDDD", font=('寰蒋闆呴粦', 8)) + 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] = [] - for i in range(0, 8): + for i in range(0, constant.L2_CODE_COUNT_PER_DEVICE): sv = StringVar(value=self.l2_codes[key][i]) code_sv_map[key].append(sv) - cframe = Frame(frame, {"height": 23, "width": 70, "bg": "#FFFFFF"}) + cframe = Frame(frame, {"height": 23, "width": 80, "bg": "#FFFFFF"}) code_label = Label(cframe, textvariable=sv, background="#FFFFFF", foreground="#FF0000") code_labels[key].append(code_label) code_label.place(x=0, y=0) - cframe.place(x=200 + i * 75, 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()) @@ -390,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: @@ -408,14 +741,15 @@ table_delegate.model.addRow() table_delegate.model.setValueAt(data["time"], index, 0) table_delegate.model.setValueAt(data["code"], index, 1) - table_delegate.model.setValueAt(data["num"], index, 2) - table_delegate.model.setValueAt(data.get("price"), index, 3) - table_delegate.model.setValueAt(data.get("trade_price"), index, 4) - table_delegate.model.setValueAt(data.get("trade_num"), index, 5) + table_delegate.model.setValueAt(data["apply_time"], index, 2) + table_delegate.model.setValueAt(data["num"], index, 3) + table_delegate.model.setValueAt(data.get("price"), index, 4) + table_delegate.model.setValueAt(data.get("trade_price"), index, 5) + table_delegate.model.setValueAt(data.get("trade_num"), index, 6) if int(data["type"]) > 0: - table_delegate.model.setValueAt("鍗栧嚭", index, 6) + table_delegate.model.setValueAt("鍗栧嚭", index, 7) else: - table_delegate.model.setValueAt("涔板叆", index, 6) + table_delegate.model.setValueAt("涔板叆", index, 7) index += 1 table_delegate.redraw() @@ -428,22 +762,23 @@ 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() pass - def create_table(_frame, data, cell_width=70): + def create_table(_frame, data, cell_width=75): table = tkintertable.TableCanvas(_frame, data=data, read_only=True, width=table_width, height=table_height, thefont=('寰蒋闆呴粦', 10), cellwidth=cell_width, rowheaderwidth=20) @@ -465,20 +800,21 @@ 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", activebackground="#DDDDDD") ch1.place(x=width - 80, y=5) - + auo_refresh.set(1) # ------琛ㄥご缁撴潫------ # 濮旀墭琛ㄦ牸 cl = Label(frame, text="浠婃棩濮旀墭锛�", bg="#DDDDDD", fg="#666666") cl.place(x=5, y=30) delegate_datas = {} - delegate_datas["row{}".format(0)] = {'濮旀墭鏃堕棿': '', '浠g爜': '', '濮旀墭鏁伴噺': '', '濮旀墭浠锋牸': '', '鎴愪氦鍧囦环': '', '鎴愪氦鏁伴噺': '', + delegate_datas["row{}".format(0)] = {'濮旀墭鏃堕棿': '', '浠g爜': '', '鐢虫姤鏃堕棿': '', '濮旀墭鏁伴噺': '', '濮旀墭浠锋牸': '', '鎴愪氦鍧囦环': '', + '鎴愪氦鏁伴噺': '', '鎿嶄綔': ''} cl = Label(frame, text="鏇存柊鏃堕棿锛�", bg="#DDDDDD", fg="#666666") @@ -507,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) @@ -531,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('鎻愮ず', "璁剧疆鎴愬姛") # 璁剧疆鎺橀噾淇℃伅 @@ -557,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) @@ -597,35 +933,49 @@ showwarning('璀﹀憡', e) def export_l2_data(code): - if code not in l2_data_manager.local_today_datas: - l2_data_manager.load_l2_data(code) - datas = l2_data_manager.local_today_datas[code] + if code not in l2.l2_data_util.local_today_datas: + l2.l2_data_util.load_l2_data(code) + datas = l2.l2_data_util.local_today_datas[code] try: - path=data_export_util.export_l2_data(code,datas) - showinfo("鎻愮ず","瀵煎嚭鎴愬姛锛岃矾寰勪负锛�"+path) + path = data_export_util.export_l2_data(code, datas) + showinfo("鎻愮ず", "瀵煎嚭鎴愬姛锛岃矾寰勪负锛�" + path) except Exception as e1: - showerror("瀵煎嚭澶辫触",str(e1)) + showerror("瀵煎嚭澶辫触", str(e1)) 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=json.loads(datas) - datas=datas["data"]["data"] + 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)) - k = "{}{}".format(k,_t[-3:]) - data_export_util.export_l2_data_origin(code, datas,k) + k = time.strftime("%Y_%m_%d_%H_%M_%S_", time.localtime(float(_t) / 1000)) + k = "{}{}".format(k, _t[-3:]) + data_export_util.export_l2_data_origin(code, datas, k) except Exception as e1: - showerror("瀵煎嚭澶辫触", str(e1)) + showerror("瀵煎嚭澶辫触", str(e1)) + finally: + RedisUtils.realse(redis) showinfo("鎻愮ず", "瀵煎嚭瀹屾垚") def compute_m(code): - m = L2TradeFactorUtil.compute_m_value(code) + m, msg = L2TradeFactorUtil.compute_m_value(code) showinfo("鎻愮ず", "{}".format(m)) + + def clear_l2(code): + self.gs_gui_pipe.send(json.dumps({"type": "clear_l2", "data": {"code": code}})) + pass + + # 绂佹浠g爜 + def cancel_order(code_): + try: + l2.l2_data_util.load_l2_data(code_, True) + l2_data_manager_new.L2TradeDataProcessor.cancel_buy(code_, "鎵嬪姩鎾ら攢") + showinfo("鎻愮ず", "鎾ゅ崟鎴愬姛") + except Exception as e: + showwarning("鎻愮ず", "鎾ゅ崟鎴愬姛寮傚父" + str(e)) frame = Frame(root, {"height": 280, "width": 300, "bg": "#DDDDDD"}) frame.grid(row=2, column=2, rowspan=2, pady=5) @@ -649,31 +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.place(x=10, y=120) + btn = FlatButton(frame, text="鑾峰彇m鍊�", command=lambda: compute_m(code.get())) + btn.place(x=10, y=130) + + btn = FlatButton(frame, text="瀵煎嚭浜ゆ槗鏃ュ織", command=lambda: log_export.export_l2_log(code.get())) + btn.place(x=80, y=130) + + btn = FlatButton(frame, text="娓呯┖l2鏁版嵁", command=lambda: clear_l2(code.get())) + btn.place(x=150, y=130) + + btn = FlatButton(frame, text="鎾ら攢鎸傚崟", command=lambda: cancel_order(code.get())) + btn.place(x=230, y=130) # 浜ゆ槗鎸夐挳 - btn = Button(frame, textvariable=btntext, command=startJueJinGui) - btn.place(x=10, y=150) + 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): @@ -685,10 +1044,11 @@ self.__draw_juejin(root) self._draw_check(root) self.__draw_l2_state(root) + self.__draw_trade_state(root) self.__draw_trade_data(root) self.__draw_test(root) - root.geometry("1120x600") + root.geometry("1120x660") root.mainloop() -- Gitblit v1.8.0