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