From c082b525b5e501dfa24038e3a85e444d88bfb1d0 Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期五, 28 四月 2023 19:33:15 +0800 Subject: [PATCH] 开盘啦采集工具/看盘页面优化 --- main.py | 317 +++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 250 insertions(+), 67 deletions(-) diff --git a/main.py b/main.py index d6c0a4d..5af81d3 100644 --- a/main.py +++ b/main.py @@ -5,8 +5,11 @@ import time from multiprocessing import freeze_support +import cv2 +import torch import win32con import win32gui +from matplotlib.lines import Line2D import ocr_util import opencv_util @@ -23,17 +26,20 @@ from matplotlib.widgets import Button import wx -import wx.html +import wx.html2 as webview from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas from matplotlib.figure import Figure import code_data_manager import juejin_core import tool -import dateutil +import requests APP_TITLE = "鍗栫エ鐪嬫澘" APP_ICON = "" +SERVER_HOST = "192.168.3.252" +SOCKET_PORT = 9001 +HTTP_PORT = 9004 def show_warning(content, click): @@ -184,7 +190,7 @@ def __request(self, codes): client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = ("192.168.3.252", 9001) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� + ip_port = (SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� client.connect(ip_port) data = {"type": 201, "data": {"codes": codes}} client.send(json.dumps(data).encode("utf-8")) @@ -292,6 +298,10 @@ toastone.Destroy() +last_ocr_code = ["000000"] + +import log + def ocr_ths_code(): hwnd = ths_util.get_ths_main_content_hwnd() if not hwnd: @@ -301,21 +311,34 @@ # hwnd_width = (rect[2] - rect[0]) * 15 // 10 rect_ = setting.get_ths_auto_code_rect() img = win32_util.window_capture(hwnd, (0, rect_[0], rect_[1], rect_[0] + rect_[2])) - code = ocr_util.recognize_code(opencv_util.clip_ths_code_area(img)) + clip_img, details = opencv_util.clip_ths_code_area(img) + start_time = time.time() + code = ocr_util.recognize_code(clip_img) + use_time =round( (time.time()-start_time)*1000) if code is None: code = ocr_util.recognize_code(img) + if code != last_ocr_code[0]: + print("淇濆瓨鍥剧墖", code) + log.debug_logger.info(f"浠g爜璇嗗埆缁撴灉:{code} 璇嗗埆鏃堕棿锛歿use_time}ms") + last_ocr_code[0] = code + cv2.imwrite(f"datas/test/{code}.png", opencv_util.gray_img(img)) + return code # 鎮诞妗� class FloatFrame(wx.Frame): - def __init__(self, position): + def __init__(self): wx.Frame.__init__(self, None, -1, "鎮诞鐩洏", style=wx.CAPTION ^ wx.MINIMIZE_BOX ^ wx.CLOSE_BOX ^ wx.STAY_ON_TOP, size=(320, 195)) self.SetBackgroundColour(wx.Colour(224, 224, 224)) self.SetTransparent(230) - if position: - self.SetPosition(wx.Point(position[0], position[1])) + self.Bind(wx.EVT_CLOSE, self.OnExit) + # 璇诲彇閰嶇疆淇℃伅 + window_info = setting.get_float_watch_window_info() + if window_info: + self.SetPosition(wx.Point(window_info[0], window_info[1])) + self.Size = wx.Size(window_info[2], window_info[3]) boxsier = wx.FlexGridSizer(5, 2, 2, 5) bs1 = wx.BoxSizer(wx.HORIZONTAL) self.btn_remove_black = wx.Button(self, label="绉婚櫎榛戝悕鍗�", size=(70, 30)) @@ -364,7 +387,7 @@ boxsier.Add(self.edit_code) self.notify_text = wx.StaticText(self, label="", size=(80, -1)) - boxsier.Add(self.notify_text) + boxsier.Add(self.notify_text, 0, wx.LEFT, -45) # 浠g爜 bs1 = wx.BoxSizer(wx.HORIZONTAL) @@ -466,8 +489,12 @@ try: code = self.__get_code() print("鍔犲叆鐧藉悕鍗�", code) - self.__request([code], 202) - self.show_info(f"{code}鍔犲叆鐧藉悕鍗曟垚鍔�") + result = self.__request([code], 202) + result = json.loads(result) + if result["code"] == 0: + self.show_info(f"{code}鍔犲叆鐧藉悕鍗曟垚鍔�") + else: + self.show_warning(f"鍔犲叆澶辫触锛歿result['msg']}") self.edit_code.SetValue("") except Exception as e: self.show_warning(str(e)) @@ -563,6 +590,22 @@ self.check_auto_refresh.SetValue(True) else: self.check_auto_refresh.SetValue(False) + self.__init_trade_state() + + def __init_trade_state(self): + # 鑾峰彇浜ゆ槗鐘舵�� + try: + result = self.__request_buy_state() + result = json.loads(result) + if result["code"] == 0: + if result["data"]["can_buy"]: + self.btn_open_buy.SetLabelText("寮�鍚氦鏄�*") + self.btn_close_buy.SetLabelText("鍏抽棴浜ゆ槗") + else: + self.btn_open_buy.SetLabelText("寮�鍚氦鏄�") + self.btn_close_buy.SetLabelText("鍏抽棴浜ゆ槗*") + except: + pass def __auto_click_check(self, event): if event.Selection: @@ -578,15 +621,17 @@ def __request(self, codes, type): client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = ("192.168.3.252", 9001) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� + ip_port = (SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� client.connect(ip_port) data = {"type": type, "data": {"codes": codes}} client.send(json.dumps(data).encode("utf-8")) + result = client.recv(1024) client.close() + return result.decode("gbk") def __request_list(self, type): client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = ("192.168.3.252", 9001) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� + ip_port = (SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� client.connect(ip_port) data = {"type": type, "data": {}} client.send(json.dumps(data).encode("utf-8")) @@ -597,12 +642,24 @@ def __request_buy(self, is_open): client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = ("192.168.3.252", 9001) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� + ip_port = (SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� client.connect(ip_port) data = {"type": 501, "data": {"open": is_open}} client.send(json.dumps(data).encode("utf-8")) # 璇诲彇鍐呭 result = client.recv(10240) + client.close() + return result.decode("gbk") + + # 鑾峰彇涔板叆鐘舵�� + def __request_buy_state(self): + client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver + ip_port = (SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� + client.connect(ip_port) + data = {"type": 502, "data": {}} + client.send(json.dumps(data).encode("utf-8")) + # 璇诲彇鍐呭 + result = client.recv(1024) client.close() return result.decode("gbk") @@ -613,6 +670,7 @@ result = self.__request_buy(True) msg = json.loads(result)["msg"] show_info(msg, None) + self.__init_trade_state() except Exception as e: show_warning(str(e), None) @@ -625,15 +683,23 @@ result = self.__request_buy(False) msg = json.loads(result)["msg"] show_info(msg, None) + self.__init_trade_state() except Exception as e: show_warning(str(e), None) show_sure("鏄惁鍏抽棴浜ゆ槗", close_buy) + def OnExit(self, e): + try: + setting.set_float_watch_window_info((self.Position[0], self.Position[1], self.Size[0], self.Size[1])) + except Exception as e: + print("") + self.Hide() + # 浠g爜鏁版嵁 class CodeDataFrame(wx.Frame): - def __init__(self, set_codes_success_callback): + def __init__(self, set_codes_success_callback, show_float_callback, show_main_callback): # style=wx.CAPTION | wx.Frame.__init__(self, None, -1, "鏁版嵁", style=wx.CAPTION | wx.STAY_ON_TOP | wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.CLOSE_BOX | wx.RESIZE_BORDER, @@ -642,12 +708,36 @@ self.SetBackgroundColour(wx.Colour(224, 224, 224)) # self.SetTransparent(230) boxsier = wx.BoxSizer(wx.VERTICAL) - self.data_text = wx.html.HtmlWindow(self, size=wx.Size(self.Size[0], self.Size[ - 1])) - self.data_text.SetBackgroundColour(wx.Colour(224, 224, 224)) + # ---閰嶇疆娴忚鍣�---- + webview.WebView.MSWSetEmulationLevel() + backend = None + backends = [ + (webview.WebViewBackendEdge, 'WebViewBackendEdge'), + (webview.WebViewBackendIE, 'WebViewBackendIE'), + (webview.WebViewBackendWebKit, 'WebViewBackendWebKit'), + (webview.WebViewBackendDefault, 'WebViewBackendDefault'), + ] + for id, name in backends: + available = webview.WebView.IsBackendAvailable(id) + if available and backend is None: + backend = id + + self.wv = webview.WebView.New(self, size=wx.Size(self.Size[0], self.Size[ + 1]), backend=backend) + self.wv.SetZoomType(wx.html2.WEBVIEW_ZOOM_TYPE_TEXT) + self.Bind(webview.EVT_WEBVIEW_NAVIGATING, self.OnWebViewNavigating, self.wv) + self.Bind(webview.EVT_WEBVIEW_LOADED, self.OnWebViewLoaded, self.wv) + + # 鎵ц瀹氭椂鏇存柊 + self.timer = wx.Timer(self) # 鍒涘缓瀹氭椂鍣� + self.Bind(wx.EVT_TIMER, self.__update_kpl, self.timer) + self.timer.Start(3000) + self.count = 0 + + self.wv.SetBackgroundColour(wx.Colour(224, 224, 224)) if "gtk2" in wx.PlatformInfo: - self.data_text.SetStandardFonts() - boxsier.Add(self.data_text) + self.wv.SetStandardFonts() + boxsier.Add(self.wv, 1, wx.EXPAND) self.latest_code = '' self.SetSizer(boxsier) window_info = setting.get_xgb_window_info() @@ -656,11 +746,66 @@ self.Size = wx.Size(window_info[2], window_info[3]) self.Bind(wx.EVT_CLOSE, self.OnExit) self.Bind(wx.EVT_SIZE, self.OnResize) - self.data_text.SetPage("") + self.wv.SetPage("", "") self.__menu() + self.show_float_callback = show_float_callback + self.show_main_callback = show_main_callback + + def OnWebViewNavigating(self, evt): + # this event happens prior to trying to get a resource + if evt.GetURL().find("cancel_order://") >= 0: + code__ = evt.GetURL().split("cancel_order://")[1] + # if wx.MessageBox("鏄惁瑕佹挙鍗曪紵", + # style=wx.YES_NO | wx.ICON_QUESTION) == wx.YES: + self.__cancel_order(code__) + evt.Veto() + + def OnWebViewLoaded(self, evt): + # pass + # 鍔犺浇寮�鐩樺暒鏁版嵁 + self.__update_kpl(None) + + # 鏇存柊寮�鐩樺暒鏁版嵁 + def __update_kpl(self, evt): + response = requests.get(f"http://{SERVER_HOST}:{HTTP_PORT}/get_kpl_data") + if response.status_code == 200: + print(response.text) + with open("res/kpl.js", mode="r", encoding="utf-8") as f: + lines = f.readlines() + script = "\n".join(lines) + script = script.replace("{}", response.text) + self.wv.RunScript(script) + + def __cancel_order(self, code): + client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver + ip_port = (SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� + try: + client.connect(ip_port) + data = {"type": 80, "data": {"code": code}} + client.send(json.dumps(data).encode("utf-8")) + result = client.recv(1024) + result = result.decode("utf-8") + result = json.loads(result) + if result["code"] == 0: + # show_info("鎾ゅ崟澶勭悊鎴愬姛", None) + # 鍒锋柊鏁版嵁 + self.__init_data(self.latest_code) + else: + show_warning(result["msg"], None) + + client.close() + except Exception as e: + show_warning(str(e), None) + + def OnWebViewError(self, evt): + # The full document has loaded + print("缃戦〉鍑洪敊") + + def handleMessage(self, event): + print("鏁版嵁鍥炶皟") def set_data(self, code, data): - self.data_text.SetPage(data) + self.wv.SetPage(data, "") # 璁剧疆浠g爜 def set_code(self, code): @@ -684,7 +829,7 @@ def __request(self, code, type=71): client = socket.socket() # 鐢熸垚socket锛岃繛鎺erver - ip_port = ("192.168.3.252", 9001) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� + ip_port = (SERVER_HOST, SOCKET_PORT) # server鍦板潃鍜岀鍙e彿锛堟渶濂芥槸10000浠ュ悗锛� client.connect(ip_port) data = {"type": type, "data": {"code": code}} client.send(json.dumps(data).encode("utf-8")) @@ -703,7 +848,7 @@ def OnResize(self, e): print("鍙樺寲鍚庣殑灏哄", e.Size) - self.data_text.Size = e.Size + self.wv.Size = e.Size def __menu(self): self.mainmenu = wx.MenuBar() @@ -715,19 +860,36 @@ setting_.AppendSeparator() setting_.Append(103, '&浠g爜绠$悊', 'Open a new document') setting_.Append(102, '&涓嬭浇娑ㄥ仠浠g爜', 'Open a new document') + setting_.AppendSeparator() + setting_.Append(104, '&GPU妫�娴�', 'Open a new document') self.mainmenu.Append(setting_, '&璁剧疆') auto_help = wx.Menu() auto_help.Append(202, '&鍚岃姳椤鸿缃�', '') self.mainmenu.Append(auto_help, '&鑷姩鍖�') + + view = wx.Menu() + view.Append(301, '&鎵撳紑鎮诞鐩洏', '') + view.Append(302, '&鎵撳紑鍒嗘椂鐪嬬洏', '') + self.mainmenu.Append(view, '&瑙嗗浘') + # 璁剧疆浜嬩欢 self.Bind(wx.EVT_MENU, self.__set_juejin_params, id=101) self.Bind(wx.EVT_MENU, self.__download_codes, id=102) self.Bind(wx.EVT_MENU, self.__manage_code, id=103) + self.Bind(wx.EVT_MENU, self.__gpu_is_avaiable, id=104) self.Bind(wx.EVT_MENU, self.__manage_ths_pos, id=202) + self.Bind(wx.EVT_MENU, self.__show_float_callback, id=301) + self.Bind(wx.EVT_MENU, self.__show_main_callback, id=302) self.SetMenuBar(self.mainmenu) + + def __gpu_is_avaiable(self,event): + if torch.cuda.is_available(): + show_info("GPU鍙敤", None) + else: + show_warning("GPU涓嶅彲鐢�", None) def __set_juejin_params(self, event): ps = self.GetPosition() @@ -764,8 +926,14 @@ size = self.GetSize() THSPositionSettingFrame((ps[0] + size[0] / 2, ps[1] + size[1] / 2)).Show() + def __show_float_callback(self, event): + self.show_float_callback() -class MainFrame(wx.Frame): + def __show_main_callback(self, event): + self.show_main_callback() + + +class TickFrame(wx.Frame): def __init__(self): '''鏋勯�犲嚱鏁�''' wx.Frame.__init__(self, None, -1, APP_TITLE, style=wx.DEFAULT_FRAME_STYLE, @@ -773,7 +941,12 @@ # ^ wx.RESIZE_BORDER ^ wx.STAY_ON_TOP # 榛樿style鏄笅鍒楅」鐨勭粍鍚堬細wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN self.SetBackgroundColour(wx.Colour(0, 0, 0)) - self.Center() + win_info = setting.get_tick_window_info() + if win_info: + self.SetPosition(wx.Point(win_info[0], win_info[1])) + self.Size = wx.Size(win_info[2], win_info[3]) + else: + self.Center() # 浠ヤ笅浠g爜澶勭悊鍥炬爣 # if hasattr(sys, "frozen") and getattr(sys, "frozen") == "windows_exe": @@ -789,7 +962,7 @@ self.scroll = None self.mark_lines = {} self.col = 1 - self.ratio = 0.76 + self.ratio = 0.63 self.__re_draw() self.timer = wx.Timer(self) # 鍒涘缓瀹氭椂鍣� @@ -802,15 +975,6 @@ # boxsier.Add(mainBoxsier, 1, wx.EXPAND | wx.ALL, 5) # self.SetSizer(boxsier) # mainBoxsier.Fit(self) - - window_info = setting.get_window_info() - float_pos = None - if window_info: - float_pos = window_info[1] - self.SetPosition(wx.Point(window_info[0][0], window_info[0][1])) - self.Size = wx.Size(window_info[0][2], window_info[0][3]) - self.floatFrame = FloatFrame(float_pos) - self.floatFrame.Show() if setting.is_stay_on_top(): self.WindowStyle = wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN | wx.STAY_ON_TOP @@ -894,8 +1058,9 @@ print("鍏抽棴", title) close_callback(title) - width_dpi = self.Size[0] / (100 * self.col) - figure_score = Figure(figsize=(width_dpi, round(width_dpi * (self.ratio), 2))) + dpi = 100 + width_dpi = self.Size[0] / (dpi * self.col) + figure_score = Figure(figsize=(width_dpi, round(width_dpi * (self.ratio), 2)), dpi=dpi) # 璁剧疆澶栬竟璺� right_padding_px = 85 right = round((self.Size[0] - right_padding_px) / self.Size[0], 4) @@ -950,11 +1115,11 @@ max_rate = round((limit_up_price - price) / price, 4) * 100 print("娑ㄥ仠鏈�澶ф瘮渚�", max_rate) yticks2 = [] - for i in range(0, 21): - if i >= 10: - yticks2.append(0 - round(max_rate * (10 - i) / 10, 4)) + for i in range(0, 41): + if i >= 20: + yticks2.append(0 - round(max_rate * (20 - i) / 20, 4)) else: - yticks2.append(round(max_rate * (i - 10) / 10, 4)) + yticks2.append(round(max_rate * (i - 20) / 20, 4)) yticks2_labels = [] yticks = [] yticks_labels = [] @@ -968,7 +1133,7 @@ if i % 2 == 0: yticks_labels.append("") # yticks_labels.append(round(yticks[i], 2)) - if i == 10: + if i == 20: axes2.axhline(yticks2[i], linestyle='-', color='firebrick', lw=2) else: axes2.axhline(yticks2[i], linestyle='-', color='firebrick', lw=1.2) @@ -985,17 +1150,19 @@ axes.set_yticks(yticks) axes.set_yticklabels(yticks_labels) # 璁剧疆绾靛潗鏍囨暟鍊奸鑹� - for i in range(0, 9): + for i in range(0, 19): axes.get_yticklabels()[i].set_color("green") axes2.get_yticklabels()[i].set_color("green") - for i in range(10, 10): + for i in range(20, 20): axes.get_yticklabels()[i].set_color("white") axes2.get_yticklabels()[i].set_color("white") - for i in range(11, 21): + for i in range(21, 41): axes.get_yticklabels()[i].set_color("red") axes2.get_yticklabels()[i].set_color("red") line = axes2.plot([], [], color='white', linewidth=1) - average_line = axes2.plot([], [], color='yellow', linewidth=1) + average_line = axes2.plot([], [], color='green', linewidth=1, linestyle='-') + average_line_1m = axes2.plot([], [], color='yellow', linewidth=1, linestyle='-') + # axes2.legend(loc='upper left') cannvas = FigureCanvas(pannel, -1, figure_score) axes2.text(1, 11.5, r'鐜颁环锛�0.0 娑ㄥ箙锛�0.00% \n鐣欐牸灞�锛�0%', fontsize=10, color='white') axes2.text(-1, -11.5, r'鐜颁环锛�0.0 娑ㄥ箙锛�0.00% \n鐣欐牸灞�锛�0%', fontsize=10, color='white') @@ -1004,7 +1171,7 @@ axes.spines['top'].set_visible(False) axes2.spines['bottom'].set_visible(False) axes.spines['bottom'].set_visible(False) - return (axes2, line, average_line) + return (axes2, line, average_line_1m, average_line) def __show_top(self, event): if event.Selection: @@ -1016,14 +1183,10 @@ def OnExit(self, e): try: - self.floatFrame.Close(True) - setting.set_window_info((self.Position[0], self.Position[1], self.Size[0], self.Size[1]), ( - self.floatFrame.Position[0], self.floatFrame.Position[1], self.floatFrame.Size[0], - self.floatFrame.Size[1])) + setting.set_tick_window_info((self.Position[0], self.Position[1], self.Size[0], self.Size[1])) except Exception as e: print("") - jueJinProcess.terminate() - sys.exit(0) + self.Hide() def post_redraw(self, evt): @@ -1053,6 +1216,8 @@ # 缁樺浘绠$悊鍣� class DrawManager: + X_RANGE_MINIUTES = 60 + X_DATA_MINIUTES = 56 def __load_lack_datas(self, code, time_ranges): codeDataManager = code_data_manager.CodeDataManager() @@ -1100,7 +1265,15 @@ code_datas[code] = [] old_datas = codeDataManager.get_datas(code) # 鑾峰彇缂哄け鐨勬暟鎹� - ranges = codeDataManager.get_lack_datas_time_range(old_datas) + min_time = tool.get_now_time_str() + if int(min_time.replace(":", "")) > int("150000"): + min_time = "15:00:00" + elif int("113000") < int(min_time.replace(":", "")) < int("130000"): + min_time = "11:30:00" + + min_time = tool.trade_time_add_second(min_time, 0 - DrawManager.X_DATA_MINIUTES * 60) + + ranges = codeDataManager.get_lack_datas_time_range(old_datas, min_time) if len(ranges) > 0: self.__load_lack_datas(code, ranges) old_datas = codeDataManager.get_datas(code) @@ -1136,29 +1309,31 @@ # 鍒犻櫎9:30浠ュ墠鐨勬暟鎹� for i in range(0, len(datas)): time_ = datas[i]["created_at"][-8:] - if int(time_.replace(":", "")) >= int("093000"): + if int(time_.replace(":", "")) >= int("092600"): datas = datas[i:] break - # 鍙栨渶杩�12鍒嗛挓鐨勬暟鎹� + # 鍙栨渶杩�14鍒嗛挓鐨勬暟鎹� for i in range(len(datas) - 1, -1, -1): time_ = datas[i]["created_at"][-8:] - if tool.trade_time_sub(datas[-1]["created_at"][-8:], time_) >= 14 * 60: + if tool.trade_time_sub(datas[-1]["created_at"][-8:], time_) >= self.X_DATA_MINIUTES * 60: datas = datas[i:] break xs = [] ys_rate = [] + ys_average_rate_1m = [] ys_average_rate = [] for data in datas: xs.append(get_time_as_seconds(data["created_at"])) ys_rate.append(data["rate"] * 100) + ys_average_rate_1m.append(data["average_rate"] * 100 + 1.5) ys_average_rate.append(data["average_rate"] * 100) xticks = [] xticklabels = [] # 璁剧疆X杞磋寖鍥翠负09:30:00 鍒�15:00:00 # x杞磋寖鍥翠负0-15鍒嗛挓 - end_x = "0000-00-00 " + tool.trade_time_add_second(datas[0]["created_at"][-8:], 15 * 60) + end_x = "0000-00-00 " + tool.trade_time_add_second(datas[0]["created_at"][-8:], self.X_RANGE_MINIUTES * 60) axes[0].set_xlim(get_time_as_seconds(datas[0]["created_at"]), get_time_as_seconds(end_x)) # if len(xs) < 2 or xs[-1] - xs[0] < 30 * 60: @@ -1176,7 +1351,9 @@ axes[0].set_xticklabels(xticklabels) axes[1][0].set_data(xs, ys_rate) - axes[2][0].set_data(xs, ys_average_rate) + axes[2][0].set_data(xs, ys_average_rate_1m) + if axes[3]: + axes[3][0].set_data(xs, ys_average_rate) texts = axes[0].texts texts[0].set_text("{}% \n鐣欐牸灞�锛�0%".format(round(datas[-1]["rate"] * 100, 2))) texts[1].set_text("{}".format(datas[-1]["created_at"].split(" ")[1])) @@ -1228,7 +1405,7 @@ min_rate = rate # 灞曠ず鏈�杩戠殑600涓� - datas = datas[-450:] + datas = datas[0 - self.X_DATA_MINIUTES * 20:] # 淇閲忔暟鎹� last_info = None for i in range(1, len(datas)): @@ -1237,7 +1414,8 @@ last_info = datas[i] if int(datas[i]["created_at"][-2:]) - int(datas[i - 1]["created_at"][-2:]) < 0: last_info = datas[i] - datas[i]['average_rate'] = last_info['average_rate'] + datas[i]['average_rate_1m'] = last_info['average_rate'] + datas[0]['average_rate_1m'] = datas[0]['average_rate'] for i in range(0, len(self.codes_info)): if self.codes_info[i][0] == code: @@ -1266,19 +1444,25 @@ last_time = round(time.time()) for index in range(0, len(codes)): if codes[index] == code: - self.Frame.scrollTo(index) + self.frame.scrollTo(index) break except Exception as e: # print(str(e)) pass time.sleep(0.005) + def __show_float_frame(self): + self.floatFrame.Show() + + def __show_main_frame(self): + self.frame.Show() + def OnInit(self): self.SetAppName(APP_TITLE) - self.frame = MainFrame() - self.frame.Show() + self.frame = TickFrame() + self.floatFrame = FloatFrame() # 浼犻�掍唬鐮佽缃垚鍔熺殑鍥炶皟 - self.xgb = CodeDataFrame(self.frame.set_codes_success) + self.xgb = CodeDataFrame(self.frame.set_codes_success, self.__show_float_frame, self.__show_main_frame) self.xgb.Show() t1 = threading.Thread(target=lambda: self.__refresh()) # 鍚庡彴杩愯 @@ -1364,8 +1548,7 @@ if __name__ == "__main__1": - code = ocr_util.recognize_code("C:\\Users\\Administrator\\Desktop\\test.png.bmp") - print(code) + print(webview.WebView.IsBackendAvailable(webview.WebViewBackendEdge)) # 鎵撳寘鍛戒护 # cd D:\workspace\GP\trade_desk -- Gitblit v1.8.0