From a7c6c48d28aa9965f550d1191e8df03e321a1c5a Mon Sep 17 00:00:00 2001 From: lintaogood Date: Fri, 11 Apr 2025 13:09:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加显示合格的个股数量,新增数据列,流通盘,和 开盘涨幅。 --- 监控个股.py | 60 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/监控个股.py b/监控个股.py index cc226f4..0abd6b7 100644 --- a/监控个股.py +++ b/监控个股.py @@ -18,6 +18,8 @@ class StockMonitor: self.create_widgets() self.monitor_active = True self.start_monitor() + self.trigger_count = 0 + #self.trigger_count_label = None # 新增Label变量 # 构建界面 @@ -31,21 +33,23 @@ class StockMonitor: # 创建Treeview self.tree = ttk.Treeview( tree_frame, - columns=('code', 'name', 'price', 'target', 'status', 'alert_time'), + columns=('code', 'name', 'open_zf', 'lt_pan', 'price', 'target', 'status', 'alert_time'), show='headings', height=20 # 设置默认显示行数 ) - # self.tree.tag_configure('triggered', background='red') # 新增样式配置 - self.tree.tag_configure('triggered', foreground='red', font=('Verdana', 12, 'bold')) # 修改样式配置 + # 新增样式配置 + self.tree.tag_configure('triggered', foreground='red', font=('Verdana', 11, 'bold')) # 修改样式配置 # 配置列属性 columns = [ ('code', '代码', 80), ('name', '名称', 80), + ('open_zf', '开盘涨幅', 80), + ('lt_pan', '流通盘', 80), ('price', '当前价', 80), ('target', '目标价', 80), ('status', '状态', 60), - ('alert_time', '预警时间', 180) + ('alert_time', '预警时间', 200) ] for col_id, col_text, col_width in columns: @@ -68,6 +72,7 @@ class StockMonitor: control_frame = ttk.Frame(self.master) control_frame.pack(pady=10) + # 文件选择按钮(原有代码保持不变) self.btn_load = ttk.Button( control_frame, @@ -86,6 +91,17 @@ class StockMonitor: ) self.auto_push_cb.pack(side=tk.LEFT, padx=5) + status_frame = ttk.Frame(self.master) + status_frame.pack(pady=5, fill=tk.X) + # 创建数量显示Label + self.trigger_count_label = ttk.Label( + status_frame, + text="已触发股票数量:0", + font=('微软雅黑', 14), + foreground='red' + ) + self.trigger_count_label.pack(padx=10, pady=5, anchor=tk.W) + def select_file(self): filepath = filedialog.askopenfilename( title="选择监控列表文件", @@ -176,8 +192,9 @@ class StockMonitor: def add_stock(self, code, name, target): """添加股票到监控列表""" codes = self.format_code(str(code)) - self.tree.insert('', 'end', values=(codes, name, '-', target, '监控中', '')) + self.tree.insert('', 'end', values=(codes, name, '-', '-', '-', target, '监控中', '')) + # 格式化代码 def format_code(self, code): # 为股票代码添加后缀 code = f"{code:0>6}" # 确保代码是6位,不足前面补零 @@ -199,21 +216,27 @@ class StockMonitor: batch = codes[i:i+batch_size] print(f"更新批次:{batch}") df = ts.realtime_quote(ts_code=','.join(batch)) - # print("所有列名:", df.columns.tolist()) - # print(df[required_columns]) for _, row in df.iterrows(): code = row['TS_CODE'] - # print(code) - # current_price = row['close'] current_price = row['PRICE'] - # print(current_price) + # 计算开盘涨幅 / (OPEN-PRE_CLOSE)/PRE_CLOSE*100 + open_price = row['OPEN'] + pre_close = row['PRE_CLOSE'] + open_zf = round((float(open_price) - float(pre_close)) / float(pre_close) * 100, 2) + + # 计算流通盘 + lt_pan = row['VOLUME'] / 100000000 # 转换为亿 + item = self.find_tree_item(code) if item: self.tree.set(item, 'price', f"{current_price:.2f}") - target = float(self.tree.item(item)['values'][3]) + target = float(self.tree.item(item)['values'][5]) + # 设置开盘涨幅/ (OPEN-PRE_CLOSE)* + self.tree.set(item, 'open_zf', f"{open_zf:.2f}%") + self.tree.set(item, 'lt_pan', f"{lt_pan:.2f}亿") # print(current_price) # print(target) - if current_price >= target and self.tree.item(item)['values'][4] != '已触发': + if current_price >= target and self.tree.item(item)['values'][6] != '已触发': now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") self.master.after(0, self.tree.set, item, 'alert_time', now) @@ -227,8 +250,19 @@ class StockMonitor: "价格提醒", f"{code} 已达到目标价!当前价:{current_price}" ) + # 使用系统命令播放音频(Windows) + #os.system('start example.mp3') # 替换为你的音频文件路径 except Exception as e: print(f"更新失败:{str(e)}") + # 在遍历完所有股票后统计数量 + triggered_count = 0 + for item in self.tree.get_children(): + if self.tree.item(item)['values'][6] == '已触发': + triggered_count += 1 + # 更新Label显示(确保在主线程更新) + #self.master.after(0, self.trigger_count_label.config, "text", f"已触发股票数量:{triggered_count}") + # 正确写法: + self.master.after(0, lambda: self.trigger_count_label.config(text=f"已触发股票数量:{triggered_count}")) def find_tree_item(self, code): for item in self.tree.get_children(): @@ -247,7 +281,7 @@ class StockMonitor: self.monitor_active = False self.master.destroy() - # 扩展自动下单: + # 扩展自动下单---------------------------------------------------------- def autopush(self, item): code = self.tree.item(item)['values'][0] current_price = float(self.tree.item(item)['values'][2])