import tkinter as tk
from tkinter import ttk
import pandas as pd
from prettytable import PrettyTable
'''号码投注方案计算器'''
# 程序界面
class AppWindow(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.grid(row=0, column=0, sticky="nsew")
self.setupUI()
def setupUI(self):
leftwidth = 5
rightwidth = 15
mainframe = tk.Frame(self)
mainframe.pack(fill="x")
# 第一行:特码毛赔率
rowframe1 = tk.Frame(mainframe)
rowframe1.pack(fill="x", ipadx=3, ipady=3)
self.peilv = tk.DoubleVar()
self.peilv.set(42)
tk.Entry(rowframe1, textvariable=self.peilv).pack(side=tk.RIGHT)
tk.Label(rowframe1, text="赔率").pack(side=tk.RIGHT)
# 第二行:起始倍数
rowframe2 = tk.Frame(mainframe)
rowframe2.pack(fill="x", ipadx=3, ipady=3)
self.start_beishu = tk.IntVar()
self.start_beishu.set(1)
tk.Entry(rowframe2, textvariable=self.start_beishu).pack(side=tk.RIGHT)
tk.Label(rowframe2, text="起始倍数").pack(side=tk.RIGHT)
# 第三行:注数
rowframe3 = tk.Frame(mainframe)
rowframe3.pack(fill="x", ipadx=3, ipady=3)
self.zhushu = tk.IntVar()
self.zhushu.set(10)
tk.Entry(rowframe3, textvariable=self.zhushu).pack(side=tk.RIGHT)
tk.Label(rowframe3, text="注数").pack(side=tk.RIGHT)
# 第四行:最小收益率
rowframe4 = tk.Frame(mainframe)
rowframe4.pack(fill="x", ipadx=3, ipady=3)
self.min_shouyilv = tk.DoubleVar()
self.min_shouyilv.set(0.5)
tk.Entry(rowframe4, textvariable=self.min_shouyilv).pack(side=tk.RIGHT)
tk.Label(rowframe4, text="最小收益率").pack(side=tk.RIGHT)
# 第五行:按钮
rowframe5 = tk.Frame(mainframe)
rowframe5.pack(fill="x", ipadx=3, ipady=3)
ttk.Button(rowframe5, text='确定', command=self.calc).pack(side=tk.RIGHT)
def calc_a_row(self, index, last_beishu, last_cumsumtouru):
'''根据上期倍数、上期累计投入,计算本期'''
zhushu, peilv, min_shouyilv = self.zhushu.get(), self.peilv.get(), self.min_shouyilv.get()
bs = last_beishu
while True:
cumsumtouru = last_cumsumtouru + bs * zhushu # 累计投入
cumsumshouyi = bs * peilv - cumsumtouru # 累计收益
if cumsumshouyi/cumsumtouru < min_shouyilv:
bs += 1
else:
break
# ['期数','倍数','注数','本期投入','累计投入','本期收益','累计收益','累计收益率']
return [index+1, bs, zhushu, bs*zhushu, cumsumtouru, round(bs*peilv, 2), round(cumsumshouyi, 2), round(cumsumshouyi/cumsumtouru, 4)]
def calc_n_row(self, n=10):
'''计算n期'''
res = []
for i in range(n):
if i == 0:
res.append(self.calc_a_row(i, self.start_beishu.get(), 0))
elif i > 0:
res.append(self.calc_a_row(i, res[-1][1], res[-1][4]))
return res
def calc(self):
'''倍投计算(用prettytable显示结果)'''
n = 10
res = self.calc_n_row(n)
table = PrettyTable(['期数','倍数','注数','本期投入','累计投入','本期收益','累计收益','累计收益率'])
for i in range(n):
table.add_row(res[i])
print(table)
def calc2(self):
'''倍投计算(用pandas显示结果)'''
n = 10
res = self.calc_n_row(n)
df = pd.DataFrame(res, columns=['期数','倍数','注数','本期投入','累计投入','本期收益','累计收益','累计收益率'])
print(df)
def main():
root = tk.Tk()
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1) # Grid管理器允许通过几个方法来控制组件在容器中的位置。weight选项指出一个行或列的相对缩放比例,针对一个行,如果将weight设为3,那么他将以三倍于weight值为1的比例伸展。默认值是0,表明当用户改变窗口大小时,单元格的大小保持不变。
#root.geometry('640x360') # 主窗口大小
root.resizable(width=False, height=False) # 禁止改变大小
root.title("计算器")
app = AppWindow(root)
app.mainloop()
if __name__ == "__main__":
main()
pass