import tkinter as tk
from tkinter import ttk
from datetime import datetime
from tkinter import messagebox
import tkinter.filedialog as filedialog
import random
import time
import pickle
import os
# 将权重字典提取出来作为全局变量
YEAR_WEIGHTS = {
"鼠": [1.2, 1.6, 1.5, 0.7, 0.5],
"牛": [0.9, 0.8, 0.7, 0.7, 0.7],
"虎": [0.6, 0.8, 0.9, 0.9, 1.2],
"兔": [0.7, 1.9, 1.2, 1.2, 0.8],
"龙": [1.2, 1.2, 1.0, 0.8, 0.8],
"蛇": [0.5, 0.6, 0.7, 0.7, 0.6],
"马": [0.9, 0.8, 1.5, 1.3, 1.9],
"羊": [0.8, 0.7, 0.6, 0.5, 0.6],
"猴": [0.7, 0.5, 0.5, 1.4, 0.8],
"鸡": [0.8, 1.5, 1.4, 0.5, 1.6],
"狗": [1.5, 0.6, 1.4, 0.9, 1.0],
"猪": [0.9, 1.6, 0.9, 1.7, 0.6]
}
MONTH_WEIGHTS = {
"正月": 0.6, "二月": 0.7, "三月": 1.8, "四月": 0.9, "五月": 0.5, "六月": 1.6,
"七月": 0.9, "八月": 1.5, "九月": 1.8, "十月": 0.8, "十一月": 0.9, "十二月": 0.5
}
DAY_WEIGHTS = {
"初一": 0.5, "初二": 1.0, "初三": 0.8, "初四": 1.5, "初五": 1.6, "初六": 1.5,
"初七": 0.8, "初八": 1.6, "初九": 0.8, "初十": 1.6, "十一": 0.9, "十二": 1.7,
"十三": 0.8, "十四": 1.7, "十五": 1.0, "十六": 0.8, "十七": 0.9, "十八": 1.8,
"十九": 0.5, "二十": 1.5, "廿一": 1.0, "廿二": 0.9, "廿三": 0.8, "廿四": 0.9,
"廿五": 1.5, "廿六": 1.8, "廿七": 0.7, "廿八": 0.8, "廿九": 1.6, "三十": 0.6
}
HOUR_WEIGHTS = {
"子时(23:00-00:59)": 1.6, "丑时(01:00-02:59)": 0.6, "寅时(03:00-04:59)": 0.7,
"卯时(05:00-06:59)": 1.0, "辰时(07:00-08:59)": 0.9, "巳时(09:00-10:59)": 1.6,
"午时(11:00-12:59)": 1.0, "未时(13:00-14:59)": 0.8, "申时(15:00-16:59)": 0.8,
"酉时(17:00-18:59)": 0.9, "戌时(19:00-20:59)": 0.6, "亥时(21:00-22:59)": 0.6
}
def load_results(filepath):
results = {}
with open(filepath, 'r', encoding='utf-8') as file: # 尝试使用utf-8编码打开文件
next(file) # Skip the header line
bones_weight, result = None, ''
for line in file:
parts = line.strip().split('\t')
if len(parts) == 2:
# 如果当前行可以被分割成两部分,那么它是一个新的记录
if bones_weight is not None:
# 如果之前已经有一个记录,那么将它添加到结果中
results[bones_weight] = result
bones_weight, result = parts
else:
# 如果当前行不能被分割成两部分,那么它是上一个记录的一部分
result += '\n' + line.strip()
if bones_weight is not None:
# 将最后一个记录添加到结果中
results[bones_weight] = result
return results
# 定义一个列表来存储十二个属相
ZODIAC = ["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"]
def calculate_weight(year, month, day, hour):
# 计算出生年份与基准年份的差值
diff = int(year[:-1]) - 1924
# 计算出生年份在60年循环中的位置
position = diff % 60
# 计算属相和天干
zodiac = ZODIAC[position // 5]
heavenly_stem = position % 10 // 2
# 在字典中查找对应的骨重
year_weight = YEAR_WEIGHTS[zodiac][heavenly_stem]
month_weight = MONTH_WEIGHTS.get(month, 0)
day_weight = DAY_WEIGHTS.get(day, 0)
hour_weight = HOUR_WEIGHTS.get(hour, 0)
total_weight = year_weight + month_weight + day_weight + hour_weight
liang = int(total_weight)
qian = int((total_weight - liang) * 10)
return f"{liang}两{qian}钱"
def hide_error_message():
error_label.config(text="")
def load_history():
if os.path.exists('history.pkl'):
with open('history.pkl', 'rb') as f:
return pickle.load(f)
else:
return {}
def save_history(history):
with open('history.pkl', 'wb') as f:
pickle.dump(history, f)
def show_result(name, age, gender, weight, result):
# 创建一个新的顶级窗口
result_window = tk.Toplevel(root)
# 设置窗口标题
result_window.title("算命结果 *参考唐代玄学家袁天罡称骨算命法* ")
# 创建一个Frame
frame = tk.Frame(result_window)
frame.pack(fill="both", expand=True)
# 创建一个Text控件
text = tk.Text(frame, font=("Microsoft Yahei", 12), wrap="word", padx=18, pady=12) # 设置边距为18像素
text.pack(side="left", fill="both", expand=True)
# 创建一个Style对象
style = ttk.Style()
# 配置滚动条的样式
style.configure("Vertical.TScrollbar", gripcount=0,
background="#C4C4C4", darkcolor="#C4C4C4", lightcolor="#C4C4C4",
troughcolor="#C4C4C4", bordercolor="#C4C4C4", arrowcolor="black", width=25 )
# 创建一个滚动条,并应用样式
scrollbar = ttk.Scrollbar(frame, style="Vertical.TScrollbar")
scrollbar.pack(side="right", fill="y")
# 将滚动条和Text控件关联起来
text.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=text.yview)
# 根据性别选择对应的结果
if "男命" in result and "女命" in result:
if gender == "男":
result = result.split("女命")[0]
else:
result = result.split("女命")[1]
# 插入文本
text.insert("end", f"姓名:{name}\n", "bold")
text.insert("end", f"年龄:{age}\n", "bold")
text.insert("end", f"性别:{gender}\n", "bold")
text.insert("end", f"骨重:{weight}\n\n", "bold")
text.insert("end", result)
# 设置标签样式
text.tag_config("bold", foreground="blue", font=("Microsoft Yahei", 13, "bold"))
# 禁止用户编辑文本
text.config(state="disabled")
# 更新窗口的大小
result_window.update_idletasks()
# 获取主窗口的位置和大小
window_info = root.geometry().split('+')
root_x = int(window_info[1])
root_y = int(window_info[2])
root_width = root.winfo_width()
root_height = root.winfo_height()
# 计算新窗口的位置
result_window_x = root_x + (root_width - result_window.winfo_width()) // 2
result_window_y = root_y + (root_height - result_window.winfo_height()) // 2
# 设置新窗口的位置
result_window.geometry(f"+{result_window_x}+{result_window_y}")
# 创建一个菜单栏
menubar = tk.Menu(result_window)
result_window.config(menu=menubar)
def export_result():
file_path = filedialog.asksaveasfilename(defaultextension="result.txt", filetypes=[("文本文件", "*.txt")])
if file_path:
with open(file_path, "w", encoding="utf-8") as f:
# 导出更多信息
f.write(text.get("1.0", "end"))
messagebox.showinfo("提示", "导出成功!")
# 创建一个Frame用于放置姓名、年龄等信息和导出按钮
info_frame = tk.Frame(result_window)
info_frame.pack(fill="x", padx=18, pady=12)
# 创建导出按钮
export_button = ttk.Button(info_frame, text="导出结果", command=export_result)
export_button.pack(side="right")
# 插入姓名、年龄等信息
info_label = tk.Label(info_frame, text="“本软件算命结果仅供娱乐参考,请勿过于迷信,人生仍需自身努力。”", font=("Microsoft Yahei", 12,"bold"))
info_label.pack(side="left")
# 设置新窗口的位置
result_window.geometry(f"+{result_window_x}+{result_window_y}")
def get_info(event=None):
name = entry_name.get()
year = year_var.get()
month = month_var.get()
day = day_var.get()
hour = hour_var.get()
gender = gender_var.get()
if not name:
error_label.config(text="请输入姓名")
root.after(2000, hide_error_message)
return
if year == "选择年份" or month == "选择月份" or day == "选择日期" or hour == "选择时辰" or gender == "选择性别":
error_label.config(text="请完整填写所有信息")
root.after(2000, hide_error_message)
return
# 获取当前脚本所在的目录
script_dir = os.path.dirname(os.path.abspath(__file__))
# 构建 ming.txt 文件的相对路径
relative_path = "ming.txt"
file_path = os.path.join(script_dir, relative_path)
# 在结果标签和错误标签之间添加一个进度条
progress_var = tk.DoubleVar() # 进度条的值
progress_bar = ttk.Progressbar(root, variable=progress_var, length=400)
progress_bar.grid(row=8, column=0, columnspan=2, padx=5, pady=5)
# 显示进度条
progress_bar.grid()
result_label.config(text="分析中...", fg="green")
weight = calculate_weight(year[:-1], month, day, hour)
results = load_results(file_path)
result = results.get(weight, "未找到对应的算命结果")
# 模拟一个耗时的操作,更新进度条的值
progress = 0
while progress < 100:
increment = random.randint(1, 24) # 随机生成进度增量
progress += increment
if progress > 100:
progress = 100
progress_var.set(progress) # 更新进度条的值
root.update_idletasks() # 强制更新界面
time.sleep(0.6) # 暂停0.1秒
# 隐藏进度条
progress_bar.grid_remove()
# 计算年龄
birth_year = int(year[:-1])
current_year = datetime.now().year
age = current_year - birth_year
show_result(name, age, gender, weight, result)
result_label.config(text="算命完成!", fg="green")
root.after(2500, lambda: result_label.config(text="")) # 2.5秒后清空结果标签
# 保存历史记录
history = load_history()
history[name] = (gender, year, month, day, hour)
save_history(history)
if __name__ == "__main__":
root = tk.Tk()
root.title("李氏算命 V1.1")
# 设置窗口的大小和位置
width = 500 # 窗口的宽度
height = 440 # 窗口的高度,使得长宽比为5:4
screen_width = root.winfo_screenwidth() # 屏幕的宽度
screen_height = root.winfo_screenheight() # 屏幕的高度
x = (screen_width - width) // 2 # 窗口的横坐标,使得窗口在屏幕中居中
y = (screen_height - height) // 2 # 窗口的纵坐标,使得窗口在屏幕中居中
root.geometry(f"{width}x{height}+{x}+{y}") # 设置窗口的大小和位置
# 设置字体大小和样式
font = ("Microsoft Yahei", 14)
style = ttk.Style()
style.configure("TCombobox", fieldbackground="white", background="white", arrowcolor="black", selectbackground="#3399fe", selectforeground="white")
def on_name_changed(*args):
name = name_var.get()
history = load_history()
if name in history:
gender, year, month, day, hour = history[name]
gender_var.set(gender)
year_var.set(year)
month_var.set(month)
day_var.set(day)
hour_var.set(hour)
label_name = tk.Label(root, text="姓 名:", font=font)
label_name.grid(row=0, column=0, padx=5, pady=5, sticky='ew')
name_var = tk.StringVar(root)
name_var.trace('w', on_name_changed)
entry_name = ttk.Entry(root, textvariable=name_var, width=20, font=font)
entry_name.grid(row=0, column=1, padx=5, pady=5, sticky='ew')
# 定义一个字典来存储每个年份对应的闰月
LEAP_MONTHS = {
1903: "闰五月", 1906: "闰四月", 1909: "闰二月", 1911: "闰六月", 1914: "闰五月", 1917: "闰二月", 1919: "闰七月",
1922: "闰五月", 1925: "闰四月", 1928: "闰二月", 1930: "闰六月", 1933: "闰五月", 1936: "闰三月", 1938: "闰七月",
1941: "闰六月", 1944: "闰四月", 1947: "闰二月", 1949: "闰七月", 1952: "闰五月", 1955: "闰三月", 1957: "闰八月",
1960: "闰六月", 1963: "闰四月", 1966: "闰三月", 1968: "闰七月", 1971: "闰五月", 1974: "闰四月", 1976: "闰八月",
1979: "闰六月", 1982: "闰四月", 1984: "闰十月", 1987: "闰六月", 1990: "闰五月", 1993: "闰三月", 1995: "闰八月",
1998: "闰五月", 2001: "闰四月", 2004: "闰二月", 2006: "闰七月", 2009: "闰五月", 2012: "闰四月", 2014: "闰九月",
2017: "闰六月", 2020: "闰四月", 2023: "闰二月", 2025: "闰六月", 2028: "闰五月", 2031: "闰三月", 2033: "闰十一月",
2036: "闰六月", 2039: "闰五月", 2042: "闰二月", 2044: "闰七月", 2047: "闰五月", 2050: "闰三月", 2052: "闰八月",
2055: "闰六月", 2058: "闰四月", 2061: "闰三月", 2063: "闰七月", 2066: "闰五月", 2069: "闰四月", 2071: "闰八月",
2074: "闰六月", 2077: "闰四月", 2080: "闰三月", 2082: "闰七月", 2085: "闰五月", 2088: "闰四月", 2090: "闰八月",
2093: "闰六月", 2096: "闰四月", 2099: "闰二月"
}
# 定义年份变量
year_var = tk.StringVar(root)
# 更新月份选项的函数
def update_month_options(*args):
year = year_var.get()
if year.endswith("年"):
year = int(year[:-1])
months = ["正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"]
if year in LEAP_MONTHS:
leap_month = LEAP_MONTHS[year]
# 找到闰月对应的月份,并插入闰月
for i, month in enumerate(months):
if leap_month.endswith(month):
months.insert(i + 1, leap_month)
break
month_combobox['values'] = months
# 绑定年份选择事件
year_var.trace('w', update_month_options)
# 在其他输入框下面添加一个新的输入框
label_gender = tk.Label(root, text="性 别:", font=font)
label_gender.grid(row=1, column=0, padx=5, pady=5, sticky='ew')
gender_var = tk.StringVar(root)
gender_combobox = ttk.Combobox(root, textvariable=gender_var, values=["男", "女"], state="readonly", width=18, font=font)
gender_combobox.set("选择性别")
gender_combobox.grid(row=1, column=1, padx=5, pady=5, sticky='ew')
# 更新月份选项
update_month_options()
label_year = tk.Label(root, text="出生年份:", font=font)
label_year.grid(row=2, column=0, padx=5, pady=5, sticky='ew')
year_combobox = ttk.Combobox(root, textvariable=year_var, values=[f"{i}年" for i in range(2027, 1939, -1)], state="readonly", width=18, font=font)
year_combobox.set("选择年份")
year_combobox.grid(row=2, column=1, padx=5, pady=5, sticky='ew')
label_month = tk.Label(root, text="出生月份:", font=font)
label_month.grid(row=3, column=0, padx=5, pady=5, sticky='ew')
month_var = tk.StringVar(root)
month_combobox = ttk.Combobox(root, textvariable=month_var, values=["正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], state="readonly", width=18, font=font)
month_combobox.set("选择月份")
month_combobox.grid(row=3, column=1, padx=5, pady=5, sticky='ew')
label_day = tk.Label(root, text="出生日期:", font=font)
label_day.grid(row=4, column=0, padx=5, pady=5, sticky='ew')
month_var = tk.StringVar(root)
month_combobox = ttk.Combobox(root, textvariable=month_var, values=["正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], state="readonly", width=18, font=font)
month_combobox.set("选择月份")
month_combobox.grid(row=3, column=1, padx=5, pady=5, sticky='ew')
label_day = tk.Label(root, text="出生日期:", font=font)
label_day.grid(row=4, column=0, padx=5, pady=5, sticky='ew')
day_var = tk.StringVar(root)
day_combobox = ttk.Combobox(root, textvariable=day_var, values=["初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十"], state="readonly", width=18, font=font)
day_combobox.set("选择日期")
day_combobox.grid(row=4, column=1, padx=5, pady=5, sticky='ew')
label_hour = tk.Label(root, text="具体时间:", font=font)
label_hour.grid(row=5, column=0, padx=5, pady=5, sticky='ew')
hour_var = tk.StringVar(root)
hour_combobox = ttk.Combobox(root, textvariable=hour_var, values=["子时(23:00-00:59)", "丑时(01:00-02:59)", "寅时(03:00-04:59)", "卯时(05:00-06:59)", "辰时(07:00-08:59)", "巳时(09:00-10:59)", "午时(11:00-12:59)", "未时(13:00-14:59)", "申时(15:00-16:59)", "酉时(17:00-18:59)", "戌时(19:00-20:59)", "亥时(21:00-22:59)"], state="readonly", width=18, font=font)
hour_combobox.set("选择时辰")
hour_combobox.grid(row=5, column=1, padx=5, pady=5, sticky='ew')
# 创建一个Frame作为按钮的容器,设置背景颜色为蓝色
button_frame = tk.Frame(root, bg="black")
button_frame.grid(row=6, column=0, columnspan=2, padx=5, pady=5, sticky='ew')
# 创建一个按钮,设置背景颜色为白色,放入Frame中
button_submit = tk.Button(button_frame, text="开始算命", command=get_info, font=("Microsoft Yahei", 14), bg="white", width=140)
button_submit.pack(padx=1.5, pady=1.5) # 设置边框宽度为2像素
notice_label = tk.Label(root, text="*注意:出生日期为农历", fg="red", font=font)
notice_label.grid(row=7, column=0, columnspan=2, padx=5, pady=5, sticky='ew')
root.bind('<Return>', get_info)
# 将结果标签放置在第8行
result_label = tk.Label(root, text="", wraplength=400, font=font)
result_label.grid(row=8, column=0, columnspan=2, padx=5, pady=5, sticky='ew')
# 将错误标签放置在第9行
error_label = tk.Label(root, text="", fg="red", font=font)
error_label.grid(row=9, column=0, columnspan=2, padx=5, pady=5, sticky='ew')
# 使用sticky选项将标签框架填充满整个单元格
root.grid_rowconfigure(8, weight=1)
root.grid_rowconfigure(9, weight=1) # 添加这一行以确保错误标签也可以填充满单元格
root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=1)
def show_version_info():
# 创建一个新的顶级窗口
version_window = tk.Toplevel(root)
# 设置窗口标题
version_window.title("更多信息")
# 设置窗口的大小
version_window.geometry("380x320")
# 创建一个Notebook控件
notebook = ttk.Notebook(version_window)
notebook.pack(fill="both", expand=True)
# 创建几个Frame控件作为选项卡的内容
frame1 = tk.Frame(notebook)
frame2 = tk.Frame(notebook)
frame3 = tk.Frame(notebook)
frame4 = tk.Frame(notebook)
frame5 = tk.Frame(notebook)
# 将Frame控件添加到Notebook控件中
notebook.add(frame1, text="算命说明")
notebook.add(frame2, text="称骨算命")
notebook.add(frame3, text="运行需求")
notebook.add(frame4, text="了解帮助")
notebook.add(frame5, text="反馈提交")
# 在每个Frame控件中添加一些内容,并设置anchor和side选项
tk.Label(frame1, text="称骨算命是一种传统文化中的算命方式,其科学性存疑。使用该程序进行算命仅供娱乐参考,请勿过于迷信。", font=("KaiTi", 13), wraplength=350).pack(ipadx=100,ipady=60)
tk.Label(frame2, text="称骨算命是由袁天罡创立,根据每个人的生辰八字,年、月、日、时分别的重量计算总合。得出八字重量:称骨重量。然后根据袁天罡称骨算法进行称骨算命。\n 1两=10钱,每一个重量都有详细分析算命结果。", font=("KaiTi", 13), wraplength=350).pack(ipadx=100,ipady=60)
tk.Label(frame3, text="建议使用 Windows 10 及以上版本系统", font=("KaiTi", 13, "bold"), wraplength=350).pack(ipadx=100,ipady=60)
tk.Label(frame5, text="如果您有任何问题或建议,欢迎在本帖子下回复或评分。\nhttps://www.52pojie.cn/", font=("KaiTi", 13), wraplength=350).pack(ipadx=10,ipady=10)
# 更新窗口的大小
version_window.update_idletasks()
# 获取主窗口的位置和大小
window_info = root.geometry().split('+')
root_x = int(window_info[1])
root_y = int(window_info[2])
root_width = root.winfo_width()
root_height = root.winfo_height()
# 计算新窗口的位置
version_window_x = root_x + (root_width - version_window.winfo_width()) // 2
version_window_y = root_y + (root_height - version_window.winfo_height()) // 2
# 设置新窗口的位置
version_window.geometry(f"+{version_window_x}+{version_window_y}")
import webbrowser
def open_link_baidu(event):
webbrowser.open_new(r"https://www.52pojie.cn/")
def open_link_ref(event):
webbrowser.open_new(r"https://www.52pojie.cn/home.php?mod=follow&uid=2260954")
# 在frame4中添加一些内容
tk.Label(frame4, text="如果想了解后续更新信息,请点击查看: 吾爱破解:", wraplength=245).pack(ipadx=10,ipady=10)
# 创建一个Text控件
text_widget_baidu = tk.Text(frame4, height=1, wrap="none") # height=1表示只显示一行文本
text_widget_baidu.insert("1.0", "https://www.52pojie.cn/")
text_widget_baidu.tag_add("link", "1.0", "end")
text_widget_baidu.tag_config("link", foreground="blue", underline=True)
text_widget_baidu.tag_bind("link", "<Button-1>", open_link_baidu)
text_widget_baidu.configure(state="disabled") # 设置为只读模式
text_widget_baidu.pack(ipadx=10, ipady=10)
tk.Label(frame4, text="个人主页:").pack(ipadx=10,ipady=10)
# 创建一个Text控件
text_widget_ref = tk.Text(frame4, height=1, wrap="none") # height=1表示只显示一行文本
text_widget_ref.insert("1.0", "https://www.52pojie.cn/home.php?mod=follow&uid=2260954")
text_widget_ref.tag_add("link", "1.0", "end")
text_widget_ref.tag_config("link", foreground="blue", underline=True)
text_widget_ref.tag_bind("link", "<Button-1>", open_link_ref)
text_widget_ref.configure(state="disabled") # 设置为只读模式
text_widget_ref.pack(ipadx=10, ipady=10)
# 显示关于信息的函数
def show_version1_info():
version_text = (
"李氏算命 V1.1\n\n"
"原创作者: LjhaiDj\n"
"最近更新:2024年8月1日\n\n"
"Copyright © 2024 LjhaiDj(吾爱破解). All rights reserved. "
)
messagebox.showinfo("关于李氏算命", version_text)
# 显示软件声明信息的函数
def show_declaration():
declaration_text = (
"软件声明:\n"
"信息参考网上资源以及AI生成,请注意分辨。\n"
"特别注意: 称骨算命是一种传统文化中的算命方式,其科学性存疑。使用该程序进行算命仅供娱乐参考,请勿过于迷信。\n"
"如果您有任何问题,请联系开发者。"
)
messagebox.showinfo("声明", declaration_text)
# 显示隐私声明信息的函数
def show_declaration_pra():
declaration_text = (
"隐私声明:\n"
"本软件不会收集您的任何个人信息,请放心输入。\n"
"本软件不会要求获取设备隐私权限。\n"
"本程序算命结果仅供参考!"
)
messagebox.showinfo("声明", declaration_text)
# 显示权限声明信息的函数
def show_declaration_power():
declaration_text = (
"权限声明:\n"
"本程序着重在于学习,不要使用本程序做违法乱纪坑蒙拐骗的行为!\n"
"禁止商用,违者必究!\n"
"如果转载,请注明出处!谢谢!"
)
messagebox.showinfo("声明", declaration_text)
# 显示更新内容的函数
def show_update_info():
declaration_text = (
"最近更新:2024年8月1日\n"
"软件版本: 李氏算命 V1.1\n"
"更新内容:\n"
"1. 更新算法,修复无算命结果错误\n"
"2. 增加性别选项,结果更清晰\n"
"3. 补充闰月选项,丰富算命结果\n"
"4. 添加导出功能,导出算命结果\n"
"—————————————————————————————\n"
"后续更新考虑使用新的架构、现代UI和新的算法,并加入更多更专业的内容(八字五行摆盘、星座、婚配、运势等)\n"
"请大家持续关注,谢谢。"
)
messagebox.showinfo("更新内容", declaration_text)
# 创建一个菜单栏
menu_bar = tk.Menu(root)
root.config(menu=menu_bar)
# 创建“更新信息”菜单
help_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="更新信息", menu=help_menu)
help_menu.add_command(label="软件版本", command=show_version1_info)
help_menu.add_command(label="更新内容", command=show_update_info)
# 创建“声明”菜单
help_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="声明", menu=help_menu)
help_menu.add_command(label="软件声明", command=show_declaration)
help_menu.add_command(label="隐私声明", command=show_declaration_pra)
help_menu.add_command(label="权限声明", command=show_declaration_power)
# 创建“帮助”菜单
help_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="帮助", menu=help_menu)
help_menu.add_command(label="关于", command=show_version1_info)
help_menu.add_command(label="更多", command=show_version_info)
# 创建“语言”菜单
help_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="语言", menu=help_menu)
help_menu.add_command(label="中文(简体)")
help_menu.add_command(label="Chinese (Simplified)")
help_menu.add_command(label="중국어 (간체)")
help_menu.add_command(label="Vereinfachtes Chinesisch")
help_menu.add_command(label="الصينية المبسطة")
help_menu.add_command(label="......")
root.mainloop()
分类: 软件收藏
-
算命软件【李氏算命V1.1】(称骨算命法)源码
-
Apache HTTP Server 2.2.34 最终维护版
The Apache HTTP Server Project announces the release of version 2.2.34, the final release of the Apache httpd 2.2 series. This version will be the last release of the 2.2 legacy branch. (Version number 2.2.33 was not released.)
The Apache HTTP Server Project has long committed to providing maintenance releases of the 2.2.x flavor through June of 2017, and may continue to publish some security source code patches beyond this date through December of 2017. No further maintenance patches nor releases of 2.2.x are anticipated. Any final security patches will be published to www.apache.org/dist/httpd/patches/apply_to_2.2.34/
-
Opera传统版更新至12.18 最后一个Presto引擎版
收购传闻基本被证实之后,Opera针对Windows平台上的旧产品发布了安全更新,包括Opera浏览器和Opera Mail。根据官方博客的介绍,本次安全更新将是最后一个稳定的Presto引擎版本(the last, stable Presto version)。
下载地址:
-
利用XCOPY命令局域网内快速拷贝大容量数据
一、Xcopy参数介绍
命令格式:XCOPY source [destination] 一堆可选的参数
参数介绍source 指定要复制的文件。
destination 指定新文件的位置和/或名称。/A 只复制有存档属性集的文件, 但不改变属性。
/M 只复制有存档属性集的文件, 并关闭存档属性。
/D:m-d-y 复制在指定日期或指定日期以后改变的文件。如果没有提供日期,只复制那些源时间比目标时间新的文件。
/EXCLUDE:file1[+file2][+file3]… 指定含有字符串的文件列表。如果有任何字符串与要被复制的文件的绝对路径相符,那个文件将不会得到复制。
例如,指定如 \obj\ 或 .obj 的字符串会排除目录 obj 下面的所有文件或带有 .obj 扩展名的文件。
/P 创建每个目标文件前提示。
/S 复制目录和子目录,除了空的。
/E 复制目录和子目录,包括空的。 与 /S /E 相同。可以用来修改 /T。
/V 验证每个新文件。
/W 提示您在复制前按键。
/C 即使有错误,也继续复制。
/I 如果目标不存在,又在复制一个以上的文件, 则假定目标一定是一个目录。
/Q 复制时不显示文件名。
/F 复制时显示完整的源和目标文件名。
/L 显示要复制的文件。
/G 允许将没有经过加密的文件复制到不支持加密的目标。
/H 也复制隐藏和系统文件。
/R 改写只读文件。
/T 创建目录结构,但不复制文件。不包括空目录或子目录。/T /E 包括空目录和子目录。
/U 只复制已经存在于目标中的文件。
/K 复制属性。一般的 Xcopy 会重设只读属性。
/N 用生成的短名复制。
/O 复制文件所有权和 ACL 信息。
/X 复制文件审核设置(隐含 /O)。
/Y 禁止提示以确认改写一个现存目标文件。
/-Y 导致提示以确认改写一个现存目标文件。
/Z 用重新启动模式复制网络文件。二、Xcopy命令实例介绍
①本机复制文件或文件夹的实例
Xcopy d:\UpdateFiles e:\123 /s /e /y命令解释:将D盘的UpdateFiles文件夹中包含的所有东西,全部复制到E盘的123文件夹内;/s /e /y 参数说明:在复制文件的同时也复制空目录或子目录,如果目标路径已经有相同文件了,使用覆盖方式而不进行提示。
②在局域网中的应用实例
Xcopy \\192.168.0.168\UpdateFiles e:\123 /s /e /y命令解释:将192.168.0.168这台计算机的名称为UpdateFiles的文件夹内的所有东西,全部复制到本机的e:\123 文件夹;参数说明:在复制文件的同时也复制空目录或子目录,如果目标路径已经有相同文件了,使用覆盖方式而不进行提示。
-
OFFICE 2016 简体中文版
- 文件名
- cn_office_professional_plus_2016_x86_x64_dvd_6969182.iso
- SHA1
- 277926A41B472EE38CA0B36ED8F2696356DCC98F
- 文件大小
- 2.41GB
- 发布时间
- 2015-09-22
ed2k://|file|cn_office_professional_plus_2016_x86_x64_dvd_6969182.iso|2588266496|27EEA4FE4BB13CD0ECCDFC24167F9E01|/
-
Windows 10 技术预览版Build 9926
下载地址[含中文]:
http://windows.microsoft.com/en-us/windows/preview-iso测试专用序列号:
NKJFK-GPHP7-G8C3J-P6JXR-HQRJR -
火狐Firefox浏览器所有历史版本下载地址
Mozilla Firefox 频繁的更新,导致许多好用的插件在更新后不能兼容,而且想换回低版本还不容易啊,官网上只看到最新版本和前一个版本的下载。
这里为大家提供了一个下载链接,是来自Mozilla官方的服务器,里面包括了Firefox所有的历史版本(包括不同的语言,不同的平台,应有尽有)
Firefox全历史版本下载:
http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ -
windows常用运行库
常用运行库行列表:
1、常用运行库
Visual Basic 6.0 公共控件
Visual C++ 2003 运行库(VC7)
Visual C++ 2005 运行库(VC8)
Visual C++ 2008 运行库(VC9)
Visual C++ 2010 运行库(VC10)
Visual C++ 2012 运行库(VC11)
Visual C++ 2013 运行库(VC12)
Microsoft Core XML Services 6.0 SP2(MSXML)
Microsoft .NET Framework 3.5 SP1(含2.0/3.0)
Microsoft .NET Framework 4.0
2、游戏运行库
DirectX 9.0C (2010.6)
Open Audio Library 2.07(OpenAL)
NVIDIA PhysX System 9.10.0514
Microsoft XNA Framework 3.1
3、其他运行库
Java 运行库 7 Update25(JRE)
微软 ActiveX 公共控件
微软标准C运行库(VC1)
Visual Basic 1 运行库(VB1)
Visual Basic 2 运行库(VB2)
Visual Basic 3 运行库(VB3)
Visual Basic 4 运行库(VB4) -
自制Chrome_28.0.1500.5便携版
chrome追求速度、简约和安全的网络浏览器,被很多人钟爱的浏览器,但是他的安装方式简化到不让选择安装路径。
那么我这里提取了最新版本的chrome,chrome从28开始使用了新的内核blink,大家可以用这个版本感受一下,与之前的版本存在的不同。
自制版本解压后即可使用,但是运行后的数据文件会存储到用户的目录下,我们可以使用快捷方式来定义用户数据的目录,方法如下:
X:\XX\Chrome\chrome.exe –user-data-dir=userdata
本站提供下载地址:Chrome_28.0.1500.5便携版
-
Fastcopy(快速文件拷贝)V2.11绿色汉化版
简介
Fastcopy是日本的最快的文件拷贝工具。磁盘间相互拷贝文件是司空见惯的事情,通常情况都是利用WINDOWS自带的复制粘贴功能来实现的。这样做在数目较小的情况下倒也没什么问题,但是数目较大时,系统自带的复制功能就有些力不从心了。这时就需要FASTCOPY。一个424MB的电影其拷贝时间仅为21秒,传输速度达到了21MB/秒,不知比TotalCopy之流快了多少倍。
为什么这么快
所有的复制操作都是通过“从介质(硬盘)读数据→写入数据→从缓存中读出→向介质(硬盘)写入数据”这几项步骤来完成的,并且这些步骤都是多个线程同时进行的,如果线程之间的协同运作不够完美,那速度就会大打折扣,有些线程忙得要命,而有些却必须等待,FASTCOPY就是优化了它们之间的工作顺序,大大提高了速度。基本参数
/cmd=(noexist_only|diff|update|
sync|force_copy|move|delete)
noexist_only 复制-如重名,则不复制
diff 复制-如重名,则公复制大小与时间不同的文件
update 复制-如重名,则复制较新的源文件
sync 同步-如重名,则复制大小与时间不同的文件
force_copy 复制-覆盖重名文件
move 移动-覆盖重名文件并强行删除源文件
delete 删除-强行删除指定的文件与目录
/auto_close 拷贝结束后,自动关闭
/force_close 如果拷贝结束后,发生错误,也强行关闭
/open_window 显示Fastcopy窗口界面
/estimate 预测拷贝完成时间
/no_exec 对Fastcopy窗口界面设置参数,但是不执行
/no_confirm_del 当用/delete参数时,不显示确认界面
/error_stop 发生错误时中止动作(在/error_stop=FALSE抑制)
/bufsize=N(MB) 用MB单位来指定缓冲器大小
/speed=(full|autoslow|9-1(90%-10%)|suspend) 速度限制
/log 输出记录文件(fastcopy.log) (在/log=FALSE抑制)
/skip_empty_dir 启用过滤,不拷贝空文件夹(在/skip_empty_dir=FALSE抑制)
/job=任务名称 执行指定的任务
/force_start 在其他的FastCopy拷贝,并且正执行的时候,执行立即也(在/force_start=FALSE抑制)
/disk_mode=(auto|same|diff) 指定自动/恒等性/其他HDD方式。
/include=“…” 指定Include过滤器
/exclude=“…“指定Exclude过滤器
/overwrite_del 在删除文件之前,删掉方式时,重新取名给重复&,使复原无效(在/overwrite_del=FALSE抑制)
/acl 拷贝存取支配清单(ACL)(只NTFS有效)(在/acl=FALSE抑制)
/stream 拷贝副其次线流(只NTFS有效)(在/stream=FALSE抑制)
/junction 复制junction•mount point(不是属下)junction•mount point自己(/junction=FALSE 拷贝属下)
/symlink 用象征性连接(而不是本质)拷贝象征性连接其本身(在/symlink=FALSE拷贝本质)本站提供下载地址:Fastcopy(快速文件拷贝)V2.11绿色汉化版
-
packet_tracer5.0全攻略
这是一款思科路由器交换机模拟软件,可以模拟真实的网络环境,我这里找了一个教程,内容比较详尽,有用得到的朋友可以自行下载。
本站提供下载地址1:packet_tracer5.0全攻略(上).doc
本站提供下载地址2:packet_tracer5.0全攻略(下).doc
-
ghost explorer 简体中文版 ghost编辑软件
硬盘备份工具,它可以把一个磁盘上的全部内容复制到另外一个磁盘上,也可以把磁盘内容复制为一个磁盘的镜像文件,以后你可以用镜像文件创建一个原始磁盘的拷贝。它可以最大限度地减少你每次安装 Win95、WinNT 和 OS/2 等操作系统的时间,如果你有好几台配置相似的机器需要安装Win95,你会发现使用 GHOST 使事情变得十分简单。GHOST在DOS下运行,并且可以从一张 DOS 引导盘上运行。支持从 NFTS中恢复镜像文件(但不要将程序安装在 NTFS 分区内,否则在 DOS下无法运行 Ghost);Ghost.exe 在 Dos/Win9x 下使用;Ghost32.exe 在 Win2000/XP 下使用。
注:本站提供的是Windows界面下的版本。点击下载:ghost explorer -
BitTorrent服务器
BitComet Tracker 简介:
BitCometTracker是一个高性能增强型BitTorrent服务器。BitCometTracker同时支持HTTP和UDP的Tracker协议,采用高性能服务器技术, 支持多端口同时监听,数据更新插件。BitCometTracker通过了8万个文件和80万个在线用户的高强度测试。用户可根据需要自行改写数据库通信插件, 打造属于自己的服务器, 配合服务器端脚本可实现一个功能完备的BT服务器。BitComet Tracker 的特点:
C++编写,采用高性能网络通信技术, 高效稳定。
配置简单容易。
支持HTTP和UDP两种连接模式, 与BitComet客户端完美配合。
可针对用户数量, 进行性能调节。
用浏览器进行远程状态监视。
支持自定义的数据库插件, 并提供一个SDK开发示例。 -
Panabit标准版v11.11(核心代号“西汉”R11)正式版
Panabit定位于研发最专业的网络应用层流量监控和管理引擎,依托自主研发的协议识别和管理平台,成为网络应用层基础设备OS供应商;实现基于应用层的流量控制到应用路由、内容路由的产品战略,打造国内网络应用层流量管理第一品牌。
协议特征库是网络应用层流量管理产品的生命力,Panabit率先提出”协议特征库”概念并创新开发了动态的”协议特征描述语言”—PSDL(Protocol Signature Description Language),辅助专用的机器人分析特征码工具,使Panabit对协议特征库的更新速度和识别精度始终处于最高水准;通过Panabit标准版的免费市场策略,第一时间获得更广泛的未知协议采集样本,使得特征库的更新形成了良好的生态环境。Panabit特征库引领国内流控产品协议库更新。
研发始于2004年,专注、专业、锐意进取、脚踏实地,已经成为誉满业界的专家。北京派网软件有限公司是为Panabit应运而生的新派网络公司。
本站提供下载地址:Panabit标准版
特征库下载地址:http://www.rayfile.com/zh-cn/files/d9af85cf-1bef-11e1-bf11-0015c55db73d/
-
AirKen远程程序
关于远程软件的说明
1.这是给有网络维护经验的人用的,所以必须具备基本网络知识才用
2.不会用不要找我咨询了,有时候太没时间了.
3.我只简单说一下部署方法,看不懂我也没办法了.以前经常用QQ远程给朋友和客户处理问题,QQ远程有时候真的很不好用,太慢,使用专业的远程又需要教用户下载不小的客户端,还有想办法让他设置好了,好让我连接到他.实在是痛苦极了.现在做这个程序就是为了在QQ远程不能用的情况下怎么最简单的能远程并处理好他电脑的故障.为达到这个目的,我必须把所有设置在本机上完成,给用户只需要运行客户端就行了,为了透过对方的普通防火墙,采用的反向链接,由客户端连接我,所以软件控制方面的可操作性比较差,这到不要紧,我只要能排除他的电脑故障,这才是我的目的.
好了,到底如何设置呢?现在我来简单的说一下
首先客户端文件夹下有客户端程序和设置文件Set.ini,我需要替用户设置好设置,打开这个文件,
IP: 这个填写我现在这台电脑的外网IP,如果不知道装个花生壳,填写你的花生壳域名也行,如果不想装那就在google搜索一下 外网IP ,然后可以查到你的外网IP.
端口和自动运行不用改
本机标识是对客户端的一个识别,如果同时远程几个客户端那这个标识要不同才行
说到这里客户端就设置玩了,我们可以把整个客户端文件夹打成rar包,然后发给用户,让他运行里面的 AirKen远程.exe 程序.
我自己这里怎么设置呢?就是使互联网上的那个客户端能访问到你就行了,一般你的防火墙要放行 AirKen远程协助.exe 这个程序,不能让自己的防火墙给拦截了.如果是直接ADSL拨号那就可以了,如果是路由上网,那还必须在路由上设置端口映射,把默认9019这个端口的数据映射到你的这台电脑上就行了.完了,使用愉快!
-
Panabit流控系统
Panabit是以DPI、DFI为基础,融合多项独有的识别技术,专业打造的基于应用层流量管理的软件引擎,是市场上可见的最精确、识别率最高的流控系统。Panabit专注应用层的识别与流量管理,围绕应用层网络基础设施产品持续完善和努力,功能上由目前的控为主导的向应用路由、内容路由发展。
Panabit标准版第1版发布是随同Panabit网站开始发布,于2007年4月30日,首次在Panabit网站公开发布,相比专业版,在性能、功能和服务三个方面有所区别,标准版可处理并发连接数是64K,特征库与专业版完全相同,即纯流控部分的功能是一致的,相比其他商用软件的免费版本,开放度在国内是最高的,多数环境下能承载百兆链路的流控能力。
Panabit定位于专业流控引擎软件产品,网关位置处的设备级OS,所以需要安装在一台独立硬件中,原则上不能与其他系统混装;Panabit总体对硬件配置要求偏低,标准版硬件配置要求P3 800Mhz或以上、512M内存或以上、3块网卡(推荐Intel芯片系列网卡,百兆、千兆均可),512M以上电子盘或硬盘均可。
Panabit软件运行在坚如磐石的FreeBSD操作系统之上,早期安装Panabit时,需要先安装好FreeBSD和对FreeBSD或Unix比较熟悉的用户才能顺利完成安装。为了简化安装,自Panabit V7.09起,同步发布Live CD版,既可使用Live CD直接运行在内存中也可以利用Live CD参照文档手动的快速安装。自2010年期,在Live CD上运行setup脚本,实现了自动安装,Panabit的安装已经是无比简单了(推荐新用户和重装用户选择一键自动安装)。