用通义千问写的懒人股价计算器

5次阅读
没有评论

我比较懒,炒股的时候对计算股价的时候不喜欢心算,打开windows自带的计算器又比较慢,对做T目标价格管理不太友好,so,利用AI做了个小工具
由于北证的涨跌幅是上下30%,所以结果显示也是30%。

工具使用图。

代码。
[Python] 纯文本查看 复制代码

import tkinter as tkfrom tkinter import ttk, messagebox
class OfflineTradingTool:
def __init__(self, root):
self.root = root
root.title("懒人股价计算器 v1.0 作者:雪狼湖仔")
root.geometry("680x750")
# 模式切换
self.mode_var = tk.StringVar(value="A") # 默认模式是A
mode_frame = ttk.Frame(root, padding=10)
mode_frame.pack(pady=10)
ttk.Radiobutton(mode_frame, text="模式A:成本价→目标价", variable=self.mode_var,
value="A", command=self.update_ui).pack(side=tk.LEFT, padx=5)
ttk.Radiobutton(mode_frame, text="模式B:成本价←目标价", variable=self.mode_var,
value="B", command=self.update_ui).pack(side=tk.LEFT, padx=5)
ttk.Radiobutton(mode_frame, text="模式C:手动输入成本价和涨跌幅", variable=self.mode_var,
value="C", command=self.update_ui).pack(side=tk.LEFT, padx=5)
# 输入验证函数
self.validate_decimal = root.register(self.validate_two_decimal)

# 初始化UI
self.main_frame = ttk.Frame(root, padding=20)
self.main_frame.pack(fill=tk.X)

# 公共输入项
self.create_input("成本价:", "price", 0)

# 初始化模式专用输入项
self.create_mode_specific_input()
self.update_ui() # 初始化时根据默认模式更新UI

# 计算按钮
self.calculate_button = ttk.Button(self.main_frame, text="开始计算", command=self.calculate)
self.calculate_button.grid(row=3, columnspan=2, pady=15)

# 结果展示
self.setup_result_table()
def validate_two_decimal(self, value):
"""严格验证两位小数输入"""
if value in ("", ".", "-"):
return True
try:
parts = value.split('.')
if len(parts) > 2 or (len(parts)==2 and len(parts[1])>2):
return False
float(value)
return True
except:
return False
def create_input(self, label, field, row):
"""创建带标签的输入框"""
ttk.Label(self.main_frame, text=label).grid(row=row, column=0, sticky=tk.W)
entry = ttk.Entry(self.main_frame,
validate="key",
validatecommand=(self.validate_decimal, '%P'),
width=18)
entry.grid(row=row, column=1, padx=5)
setattr(self, f"{field}_entry", entry)
def create_mode_specific_input(self):
"""创建模式专用输入组件"""
# 模式A:涨跌幅方向
self.direction_combo = ttk.Combobox(self.main_frame,
values=["涨", "跌"],
state="readonly",
width=16)
# 模式B:目标价输入
self.target_entry = ttk.Entry(self.main_frame,
validate="key",
validatecommand=(self.validate_decimal, '%P'),
width=18)
# 模式C:涨跌幅输入
self.percent_entry = ttk.Entry(self.main_frame,
validate="key",
validatecommand=(self.validate_decimal, '%P'),
width=18)
def update_ui(self):
"""更新界面布局"""
# 清除旧组件(除了公共输入项和计算按钮)
for widget in self.main_frame.grid_slaves():
if int(widget.grid_info()["row"]) >= 1 and int(widget.grid_info()["row"]) <= 2:
widget.grid_forget()
# 更新模式相关输入
if self.mode_var.get() == "A":
ttk.Label(self.main_frame, text="方向:").grid(row=1, column=0, sticky=tk.W)
self.direction_combo.grid(row=1, column=1, padx=5)
self.direction_combo.set("涨")
elif self.mode_var.get() == "B":
ttk.Label(self.main_frame, text="目标价:").grid(row=1, column=0, sticky=tk.W)
self.target_entry.grid(row=1, column=1, padx=5)
else: # C模式
ttk.Label(self.main_frame, text="涨跌幅(%):").grid(row=1, column=0, sticky=tk.W)
self.percent_entry.grid(row=1, column=1, padx=5)
def setup_result_table(self):
"""配置结果表格"""
result_frame = ttk.Frame(self.root)
result_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)

columns = ('序号', '成本价', '涨跌幅', '目标价')

self.tree = ttk.Treeview(result_frame,
columns=columns,
show='headings',
selectmode='browse')

# 动态配置列
for col in columns:
self.tree.heading(col, text=col)
self.tree.column(col, width=120, anchor=tk.CENTER)

vsb = ttk.Scrollbar(result_frame, orient="vertical", command=self.tree.yview)
self.tree.configure(yscrollcommand=vsb.set)

self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
vsb.pack(side=tk.RIGHT, fill=tk.Y)
def calculate(self):
"""执行计算逻辑"""
try:
self.tree.delete(*self.tree.get_children())

if self.mode_var.get() == "A":
self.calc_mode_a()
elif self.mode_var.get() == "B":
self.calc_mode_b()
else: # C模式
self.calc_mode_c()

except ValueError as e:
messagebox.showerror("输入错误", str(e))
def calc_mode_a(self):
"""模式A计算:成本价→目标价"""
base_price = float(self.price_entry.get())
direction = self.direction_combo.get()

step = 1 if direction == "涨" else -1
percentages = [round(i*step, 2) for i in range(1, 31)]

for idx, pct in enumerate(percentages, 1):
target = round(base_price * (1 + pct/100), 2)
self.tree.insert('', 'end', values=(
idx,
f"{base_price:.2f}",
f"{pct:.2f}%",
f"{target:.2f}"
))
def calc_mode_b(self):
"""模式B计算:目标价→成本价"""
target_price = float(self.target_entry.get())
base_price = float(self.price_entry.get())

pct = round((target_price/base_price - 1)*100, 2)
self.tree.insert('', 'end', values=(
1,
f"{base_price:.2f}",
f"{pct:.2f}%",
f"{target_price:.2f}"
))
def calc_mode_c(self):
"""模式C计算:通过手动输入成本价和涨跌幅计算目标价"""
base_price = float(self.price_entry.get())
percent = float(self.percent_entry.get())

target = round(base_price * (1 + percent / 100), 2)
self.tree.insert('', 'end', values=(
1,
f"{base_price:.2f}",
f"{percent:.2f}%",
f"{target:.2f}"
))
def main():
root = tk.Tk()
app = OfflineTradingTool(root)
root.mainloop()
if __name__ == "__main__":
main()

成品地址:
通过网盘分享的文件:懒人股价计算器.exe
链接: https://pan.baidu.com/s/1H3eMe9PKoAh6Ro43qeBIiw?pwd=52pj 提取码: 52pj
--来自百度网盘超级会员v8的分享

正文完
 0
116博客
版权声明:本篇文章由 116博客 于2025-04-30发表,共计4663字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码