You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

614 lines
29 KiB

11 months ago
# -*- coding:utf-8 -*-
import tkinter as tk
import tkinter.font as tf
import math
import pandas as pd
import pymysql
import os
from time import sleep
# Y形分形 Y_Fractal
# 参数初始化
FinishLevel_Y = 14
TreePercent_Y = 0.7
LeftAngle_Y = 30
RightAngle_Y = 30
InitPoint_Y = (420, 500)
InitAngle_Y = 90
InitLong_Y = 150
# Y形分形参数的字符串形式输出
params_Y = " 分形层数finishLevel={}\n" \
" 缩放比例treePercent={}\n" \
" 左枝倾角leftAngle={}\n" \
" 右枝倾角rightAngle={}\n" \
" 初始点initPoint={}\n" \
" 初始角initAngle={}\n" \
" 初始长度initLong={}".format(FinishLevel_Y, TreePercent_Y, LeftAngle_Y, RightAngle_Y,
InitPoint_Y, InitAngle_Y, InitLong_Y)
# Y形基本图案函数
def yPattern():
cv_small.delete("all") # 清除画布
cv_small.create_line(30, 10, 90, 70, fill='red', width=2) # 左臂
cv_small.create_line(150, 10, 90, 70, fill='red', width=2) # 右臂
cv_small.create_line(90, 140, 90, 70, fill='red', width=2) # 中心线
# Y形树执行函数
def run_Y_tree():
# Y形分形树函数
def Y_tree(depth, percent, left_angle, right_angle, start_point, angle, length, canvas):
if depth == 0:
return
end_point = (start_point[0] + length * math.cos(math.radians(angle)),
start_point[1] - length * math.sin(math.radians(angle)))
canvas.create_line(start_point, end_point, fill='LightBlue4', width=2)
Y_tree(depth - 1, percent, left_angle, right_angle, end_point, angle + right_angle, length * percent,
canvas) # 画右枝
Y_tree(depth - 1, percent, left_angle, right_angle, end_point, angle - left_angle, length * percent,
canvas) # 画左枝
canvas.update()
sleep(0.001)
# 清除画布
cv_big.delete("all")
# 将初始参数传入函数
Y_tree(FinishLevel_Y, TreePercent_Y, LeftAngle_Y, RightAngle_Y, InitPoint_Y, InitAngle_Y, InitLong_Y, cv_big)
output_text.delete("1.0", "end")
# 在底部的结果输出框输出分形树的绘制参数
text = " 结果输出:<分形绘制参数的字符串形式输出>\n finishLevel={}, treePercent={}," \
" leftAngle={}, rightAngle={}, initPoint={}, initAngle={}, initLong={}" \
.format(FinishLevel_Y, TreePercent_Y, LeftAngle_Y, RightAngle_Y, InitPoint_Y,
InitAngle_Y, InitLong_Y)
output_text.insert(tk.INSERT, text)
# Y形分形参数更新函数
def update_params_Y():
new_str = params_text.get("1.0", "end-1c") # 获取文本框中的分形参数字符串
new_params = new_str.split('\n')
new_params = [x.split('=')[1].strip() for x in new_params] # 获取参数值
# 参数更新
global FinishLevel_Y, TreePercent_Y, LeftAngle_Y, RightAngle_Y, InitPoint_Y, InitAngle_Y, InitLong_Y
FinishLevel_Y = int(new_params[0])
TreePercent_Y = float(new_params[1])
LeftAngle_Y = int(new_params[2])
RightAngle_Y = int(new_params[3])
InitPoint_Y = tuple(map(int, new_params[4][1:-1].split(',')))
InitAngle_Y = int(new_params[5])
InitLong_Y = int(new_params[6])
# 三角形分形 Triangle_Fractal
# 参数初始化
FinishLevel_tri = 14
TreePercent_tri = 0.7
InitPoint_tri = (420, 500)
InitAngle_tri = 30
InitLong_tri = 170
params_Triangle = " 分形层数finishLevel={}\n" \
" 缩放比例treePercent={}\n" \
" 初始点initPoint={}\n" \
" 初始角initAngle={}\n" \
" 初始长度initLong={}".format(FinishLevel_tri, TreePercent_tri, InitPoint_tri,
InitAngle_tri, InitLong_tri)
# 三角形分形参数设置
def update_params_Triangle():
new_str = params_text.get("1.0", "end-1c") # 获取文本框中的分形参数字符串
new_params = new_str.split('\n')
new_params = [x.split('=')[1].strip() for x in new_params] # 获取参数值
# 参数更新
global FinishLevel_tri, TreePercent_tri, InitPoint_tri, InitAngle_tri, InitLong_tri
FinishLevel_tri = int(new_params[0])
TreePercent_tri = float(new_params[1])
InitPoint_tri = tuple(map(int, new_params[2][1:-1].split(',')))
InitAngle_tri = int(new_params[3])
InitLong_tri = int(new_params[4])
# 三角形基本图案函数
def Triangle_Pattern():
cv_small.delete("all") # 清除画布
cv_small.create_polygon(80, 130, 20, 10, 140, 10, outline='red', fill='white', width=2)
# 三角形分形树执行函数(倒的坐标系)
def run_Triangle_tree():
# 三角形分形树函数
def Triangle_tree(depth, percent, start_point, angle, length, canvas):
if depth == 0:
return
# 左枝点
end_point1 = (start_point[0] - length * math.sin(math.radians(angle)),
start_point[1] - length * math.cos(math.radians(angle)))
# 右枝点
end_point2 = (start_point[0] + length * math.sin(math.radians(angle)),
start_point[1] - length * math.cos(math.radians(angle)))
# 画三角形
canvas.create_polygon(start_point, end_point1, end_point2, fill='LightBlue4', outline='white')
# 画左枝
Triangle_tree(depth - 1, percent, end_point1, angle, length * percent, canvas)
# 画右枝
Triangle_tree(depth - 1, percent, end_point2, angle, length * percent, canvas)
# 清除画布
cv_big.delete("all")
# 将初始参数传入函数
Triangle_tree(FinishLevel_tri, TreePercent_tri, InitPoint_tri, InitAngle_tri, InitLong_tri, cv_big)
# 在底部的结果输出框输出分形树的绘制参数
output_text.delete("1.0", "end")
text = " 结果输出:<分形绘制参数的字符串形式输出>\n finishLevel={}, treePercent={}, initPoint={}, initAngle={}, " \
"initLong={}".format(FinishLevel_tri, TreePercent_tri, InitPoint_tri,
InitAngle_tri, InitLong_tri)
output_text.insert(tk.INSERT, text)
# 方形分形 Rect_Fractal
# 参数初始化
FinishLevel_Rect = 10
LeftPoint_Rect = (350, 410)
RightPoint_Rect = (450, 410)
InitAngle_Rect = 45
params_Rect = " 分形层数finishLevel={}\n" \
" 左下点leftPoint={}\n" \
" 右下点rightPoint={}\n" \
" 初始角initAngle={}".format(FinishLevel_Rect, LeftPoint_Rect, RightPoint_Rect, InitAngle_Rect)
# 方形参数更新函数
def update_params_Rect():
new_str = params_text.get("1.0", "end-1c") # 获取文本框中的分形参数字符串
new_params = new_str.split('\n')
new_params = [x.split('=')[1].strip() for x in new_params] # 获取参数值
# 参数更新
global FinishLevel_Rect, LeftPoint_Rect, RightPoint_Rect, InitAngle_Rect
FinishLevel_Rect = int(new_params[0])
LeftPoint_Rect = tuple(map(int, new_params[1][1:-1].split(',')))
RightPoint_Rect = tuple(map(int, new_params[2][1:-1].split(',')))
InitAngle_Rect = int(new_params[3])
# 方形基本图案函数
def Rect_Pattern():
cv_small.delete("all") # 清空画布
cv_small.create_rectangle(35, 10, 155, 120, outline='red', fill='white', width=2)
# 方形分形树执行函数
def run_Rect_tree():
# 方形分形树函数
def Rect_tree(depth, point1, point2, angle, canvas):
# 直线的旋转point1是定点
def rotate(point1, point2, angle):
x1, y1 = point1[0], point1[1]
x2, y2 = point2[0], point2[1]
x = x1 + (x2 - x1) * math.cos(math.radians(angle)) + (y2 - y1) * math.sin(math.radians(angle))
y = y1 + (y2 - y1) * math.cos(math.radians(angle)) - (x2 - x1) * math.sin(math.radians(angle))
point = (x, y)
# print(point)
return point
# 直线的缩放point1是定点
def zoom(point1, point2, ratio):
x1, y1 = point1[0], point1[1]
x2, y2 = point2[0], point2[1]
x = x1 + (x2 - x1) * ratio
y = y1 + (y2 - y1) * ratio
point = (x, y)
return point
point3 = rotate(point1, point2, 90)
point4 = rotate(point2, point1, 270)
# print(point1,point2,point3,point4)
# 画正方形
canvas.create_polygon(point1, point2, point4, point3, fill='LightBlue4', outline='white')
if depth == 0:
return
point = rotate(point3, point4, angle) # 旋转
point = zoom(point3, point, math.cos(math.radians(angle))) # 缩放
Rect_tree(depth - 1, point, point4, angle, canvas) # 画左枝
Rect_tree(depth - 1, point3, point, angle, canvas) # 画右枝
# 清除画布
cv_big.delete("all")
# 将初始参数传入函数
Rect_tree(FinishLevel_Rect, LeftPoint_Rect, RightPoint_Rect, InitAngle_Rect, cv_big)
# 在底部的结果输出框输出分形树的绘制参数
output_text.delete("1.0", "end")
text = " 结果输出:<分形绘制参数的字符串形式输出>\n finishLevel={}, leftPoint={}, rightPoint={}, initAngle={}" \
.format(FinishLevel_Rect, LeftPoint_Rect, RightPoint_Rect, InitAngle_Rect)
output_text.insert(tk.INSERT, text)
# 按钮【删除选项】的回调函数
def delete_rb():
fractal_type = shape_var.get() # 获取用户选择的分形类型
# 遍历 Frame组件中的所有单选框
for radio_button in frame.pack_slaves():
# 如果选中对象是单选框且与单选框的值与 fractal_type相等删除单选框
if isinstance(radio_button, tk.Radiobutton) and radio_button["value"] == fractal_type:
radio_button.destroy()
# 文本框内的参数随着单选框的变化实时更新
def update_Text():
params_text.delete(1.0, tk.END) # 清空文本框中的内容
fractal_type = shape_var.get() # 获取用户选择的分形类型
if fractal_type == 'Y':
params_text.insert(tk.INSERT, params_Y)
elif fractal_type == 'Triangle':
params_text.insert(tk.INSERT, params_Triangle)
elif fractal_type == 'Rect':
params_text.insert(tk.INSERT, params_Rect)
conn = pymysql.connect(host='localhost', user='root', password='123456', database='ec')
df = pd.read_sql('select * from fractal', con=conn)
for i in df['fractal_e']:
# print(i)
if fractal_type == i:
code = df[df['fractal_e'] == i].params_initial.values[0]
exec(code)
code1 = df[df['fractal_e'] == i].str_params.values[0]
exec(code1)
conn.close()
def Y_pattern():
canvas.delete("all") # 清除画布
canvas.create_line(50, 30, 110, 90, fill='red', width=2) # 左臂
canvas.create_line(170, 30, 110, 90, fill='red', width=2) # 右臂
canvas.create_line(110, 160, 110, 90, fill='red', width=2) # 中心线
# 按钮【基本图案绘制】的回调函数
def draw_pattern():
fractal_type = shape_var.get() # 获取用户选择的分形类型
# 根据分形类型 绘制基本图案
if fractal_type == 'Y':
Y_pattern()
elif fractal_type == 'Triangle':
Triangle_Pattern()
elif fractal_type == 'Rect':
Rect_Pattern()
conn = pymysql.connect(host='localhost', user='root', password='123123', database='ec')
df = pd.read_sql('select * from fractal', con=conn)
for i in df['fractal_e']:
if fractal_type == i:
code = df[df['fractal_e'] == i].pattern.values[0]
exec(code)
conn.close()
# 按钮【绘制】的回调函数
def draw_tree():
fractal_type = shape_var.get() # 获取用户选择的分形类型
# 根据分形类型 绘制分形树
if fractal_type == 'Y':
run_Y_tree()
elif fractal_type == 'Triangle':
run_Triangle_tree()
elif fractal_type == 'Rect':
run_Rect_tree()
conn = pymysql.connect(host='localhost', user='root', password='123123', database='ec')
df = pd.read_sql('select * from fractal', con=conn)
for i in df['fractal_e']:
if fractal_type == i:
code = df[df['fractal_e'] == i].tree.values[0]
exec(code)
conn.close()
# 按钮【绘制参数设置】的回调函数
def update_params():
fractal_type = shape_var.get() # 获取用户选择的分形类型
# 根据分形类型 执行对应的参数更新函数
if fractal_type == 'Y':
update_params_Y()
elif fractal_type == 'Triangle':
update_params_Triangle()
elif fractal_type == 'Rect':
update_params_Rect()
conn = pymysql.connect(host='localhost', user='root', password='123456', database='ec')
df = pd.read_sql('select * from fractal', con=conn)
for i in df['fractal_e']:
if fractal_type == i:
code = df[df['fractal_e'] == i].updata_tree.values[0]
exec(code)
conn.close()
# 按钮【新增分形图案类型】的回调函数
def add_fractal():
# 按钮【添加】的回调函数,将分形图案对应的函数模块增加到相关字典
def add_function():
# 获取分形名称,更改单选框名字
name_fractal = text_name.get('1.0', 'end-1c') # 文本框控件中第一个字符的位置是 1.0,'end-1c'返回的输入中不包含换行符
# print(name_fractal)
# 获取分形单选框的值
fractal_type = text_radio.get('1.0', 'end-1c')
# print(fractal_type)
# 创建单选框
rb = tk.Radiobutton(frame, text=name_fractal, variable=shape_var, value=fractal_type, bg="white", font=ft1)
rb.pack(anchor='w')
# 执行参数初始化的代码
params_code = text_param.get('1.0', 'end-1c')
# exec(params_code)
global str_params_dict, pattern_dict, tree_dict, update_params_dict
# 分形参数输出字典
str_code = text_str.get('1.0', 'end-1c')
str_params_dict[fractal_type] = str_code
# 基本图案绘制函数字典
pattern_code = text_pattern.get('1.0', 'end-1c')
# pattern_dict[fractal_type] = pattern_code
# 分形树绘制函数字典
tree_code = text_tree.get('1.0', 'end-1c')
# tree_dict[fractal_type] = tree_code
# 参数更新字典
update_code = text_up.get('1.0', 'end-1c')
# update_params_dict[fractal_type] = update_code
# 添加后关闭窗口
small_root2.destroy()
list1 = [(name_fractal, fractal_type, params_code, str_code, pattern_code, tree_code, update_code)]
conn = pymysql.connect(host='localhost', user='root', password='123456', database='ec')
insert_query = "insert into fractal (name,fractal_e,params_initial,str_params,pattern,tree,updata_tree) " \
"values (%s,%s,%s,%s,%s,%s,%s)"
tree.insert_data(conn, insert_query, list1[0])
# 弹出一个添加分形代码的窗口
small_root2 = tk.Tk()
small_root2.geometry("1000x700+200+50")
small_root2.title("新增分形图案类型")
# 分形名称,读取为单选框的名字
lab_name = tk.Label(small_root2, text="分形名称:", font=ft1)
lab_name.place(x=40, y=10, width=100, height=30, anchor='nw')
text_name = tk.Text(small_root2, highlightthickness=1, highlightbackground="LightBlue")
text_name.configure(font=ft3)
text_name.place(x=140, y=10, width=340, height=30)
# 分形单选框的值,读取为单选框的值
lab_radio = tk.Label(small_root2, text="分形英文简写:", font=ft1)
lab_radio.place(x=520, y=10, width=140, height=30, anchor='nw')
text_radio = tk.Text(small_root2, highlightthickness=1, highlightbackground="LightBlue")
text_radio.configure(font=ft3)
text_radio.place(x=660, y=10, width=300, height=30)
# 分形参数初始化,读取的代码可以直接运行
lab_param = tk.Label(small_root2, text="请输入分形参数初始化的代码:", font=ft1)
lab_param.place(x=40, y=50, width=280, height=30, anchor='nw')
text_param = tk.Text(small_root2, highlightthickness=1, highlightbackground="LightBlue")
text_param.configure(font=ft3, spacing1=5)
text_param.place(x=40, y=85, width=440, height=140)
# 分形参数字符串形式输出后续读取代码到分形参数输出字典str_params_dict
lab_str = tk.Label(small_root2, text="请输入分形参数字符串形式输出的代码:", font=ft1)
lab_str.place(x=40, y=230, width=360, height=30, anchor='nw')
text_str = tk.Text(small_root2, highlightthickness=1, highlightbackground="LightBlue")
text_str.configure(font=ft3, spacing1=5)
text_str.place(x=40, y=265, width=440, height=140)
# print(text_str)
# 参数更新后续读取代码到参数更新字典update_params_dict
lab_up = tk.Label(small_root2, text="请输入分形参数更新的代码:", font=ft1)
lab_up.place(x=40, y=410, width=260, height=30, anchor='nw')
text_up = tk.Text(small_root2, highlightthickness=1, highlightbackground="LightBlue")
text_up.configure(font=ft3, spacing1=5)
text_up.place(x=40, y=445, width=440, height=145)
# 输入基本图案函数后续读取代码到基本图案绘制函数字典pattern_dict
lab_pattern = tk.Label(small_root2, text="请输入基本图案绘制函数:", font=ft1)
lab_pattern.place(x=520, y=50, width=240, height=30, anchor='nw')
text_pattern = tk.Text(small_root2, highlightthickness=1, highlightbackground="LightBlue")
text_pattern.configure(font=ft3, spacing1=5)
text_pattern.place(x=520, y=85, width=440, height=240)
# 输入分形树函数后续读取代码到分形树绘制函数字典tree_dict
lab_tree = tk.Label(small_root2, text="请输入分形树绘制函数:", font=ft1)
lab_tree.place(x=520, y=330, width=220, height=30, anchor='nw')
text_tree = tk.Text(small_root2, highlightthickness=1, highlightbackground="LightBlue")
text_tree.configure(font=ft3, spacing1=5)
text_tree.place(x=520, y=365, width=440, height=230)
# 按钮【添加】
button_add = tk.Button(small_root2, text="添加", command=add_function, font=ft2)
button_add.place(x=450, y=610, width=100, height=35, anchor='nw')
def main():
# 创建主窗口
root = tk.Tk()
w = root.winfo_screenwidth()
h = root.winfo_screenheight()
root.geometry("%dx%d" % (w, h))
root.title("分形树 电脑的分辨率是%dx%d" % (root.winfo_screenwidth(), root.winfo_screenheight()))
root.geometry('1270x650')
root.title('分形树')
# 创建新增分形图案类型所需的字典
str_params_dict = {}
pattern_dict = {}
tree_dict = {}
update_params_dict = {}
# 定义变量,用于存储用户选择的分形类型
shape_var = tk.StringVar()
# 设置字体
ft1 = tf.Font(family="黑体", size=21)
ft2 = tf.Font(family="黑体", size=21, weight=tf.BOLD)
ft3 = tf.Font(family="黑体", size=18)
ft4 = tf.Font(family="黑体", size=19)
# 创建一个标签
lab1 = tk.Label(root, text="分形图案类型", font=ft1)
lab1.place(x=20, y=10, width=180, height=50, anchor='nw')
# 创建一个按钮,用来新增分形图案类型
button_addPattern = tk.Button(root, text="新增分形图案类型", command=add_fractal, font=ft2)
button_addPattern.place(x=500, y=10, width=270, height=50, anchor='ne')
## 滚动框的设置
# 创建一个Canvas对象使用该对象作为滚动区域
canvas = tk.Canvas(root, width=445, height=160)
# 创建一个列表框对象Rlist并将其放入滚动区域中
Rlist = tk.Listbox(canvas, width=445, height=20, bg='white', highlightthickness=1, highlightbackground="LightBlue")
# 创建滚动条对象并与Canvas绑定实现滚动条功能
scrollbar = tk.Scrollbar(root, orient="vertical", command=Rlist.yview)
canvas.configure(yscrollcommand=scrollbar.set)
canvas.place(x=20, y=75, anchor='nw')
scrollbar.place(x=470, y=75, width=30, height=160, anchor='nw')
# 创建一个Frame组件用于放置单选框
frame = tk.Frame(Rlist, bg='white')
frame.place(anchor='nw')
# 将列表框放入Canvas中并设置Canvas窗口的大小
box_id = canvas.create_window((0, 0), window=Rlist, anchor="nw")
Rlist.update_idletasks() # 更新视图
canvas.config(scrollregion=canvas.bbox("all")) # 设置画布的滚动区域
# 添加单选框到 Frame组件
rb_Y = tk.Radiobutton(frame, text="Y形分形 Y_Fractal", variable=shape_var, value='Y', bg="white", font=ft1)
rb_Y.pack(anchor='w')
rb_Triangle = tk.Radiobutton(frame, text="三角形分形 Triangle_Fractal", variable=shape_var, value='Triangle',
bg="white", font=ft1)
rb_Triangle.pack(anchor='w')
rb_Rect = tk.Radiobutton(frame, text="矩形分形 Rect_Fractal", variable=shape_var, value='Rect', bg="white",
font=ft1)
rb_Rect.pack(anchor='w')
if os.path.exists('params.csv'):
df = pd.read_csv("params.csv")
for i in df["分型名称"]:
rb1 = tk.Radiobutton(frame, text=i, variable=shape_var, value=df[df['分型名称'] == i].分形英文.values[0],
bg="white", font=ft1)
rb1.pack(anchor='w')
# 将默认选项设置为 Y 形分形
rb_Y.select()
# 创建一个标签
lab2 = tk.Label(root, text="分形参数设置【参数含义:参量名=参量值】", font=ft4)
lab2.place(x=20, y=255, width=490, height=40, anchor='nw')
# 大画布的宽度和高度变量,方便后期调整
big_width = 880
big_height = 690
# 创建蓝色边框的大画布
cv_big = tk.Canvas(root, bg="white", highlightthickness=1, highlightbackground="LightBlue")
cv_big.config(width=big_width, height=big_height)
cv_big.place(x=530, y=10, anchor='nw')
# 创建红色边框的小画布宽高设置为大画布的1/4
cv_small = tk.Canvas(cv_big, bg="white", highlightthickness=1, highlightbackground="tomato")
cv_small.config(width=big_width * 0.25, height=big_height * 0.25)
cv_small.place(x=0, y=big_height, anchor='sw')
# 创建一个多行文本框
params_text = tk.Text(root, bg="white", highlightthickness=1, highlightbackground="LightBlue")
params_text.configure(font=ft3, spacing1=15)
params_text.place(x=20, y=300, width=480, height=310, anchor='nw')
# 初始化分形参数并输出
params_str = params_Y
params_text.insert(tk.INSERT, params_str)
# trace追踪变量w模式回调函数update_text
shape_var.trace('w', lambda *args, str_params_dict=str_params_dict: update_Text())
# 创建四个按钮
button_delete = tk.Button(root, text="删除\n选项", command=delete_rb, font=ft2)
button_delete.place(x=20, y=700, width=90, height=75, anchor='sw')
button_pattern = tk.Button(root, text="基本图\n案绘制", command=draw_pattern, font=ft2)
button_pattern.place(x=130, y=700, width=120, height=75, anchor='sw')
button_params = tk.Button(root, text="绘制参\n数设置", command=update_params, font=ft2)
button_params.place(x=270, y=700, width=120, height=75, anchor='sw')
button_drawTree = tk.Button(root, text="绘制", command=draw_tree, font=ft2)
button_drawTree.place(x=410, y=700, width=90, height=75, anchor='sw')
# 创建底部输出框
output_text = tk.Text(root, bg="white", highlightthickness=1, highlightbackground="LightBlue")
output_text.configure(font=ft3, spacing1=8)
text = " 结果输出:<分形绘制参数的字符串形式输出>"
output_text.insert(tk.INSERT, text)
output_text.place(x=20, y=800, width=1390, height=80, anchor='sw')
# 进入消息循环
root.mainloop()
if __name__ == '__main__':
# 创建主窗口
root = tk.Tk()
w = root.winfo_screenwidth()
h = root.winfo_screenheight()
root.geometry("%dx%d" % (w, h))
root.title("分形树 电脑的分辨率是%dx%d" % (root.winfo_screenwidth(), root.winfo_screenheight()))
root.geometry('1270x650')
root.title('分形树')
# 创建新增分形图案类型所需的字典
str_params_dict = {}
pattern_dict = {}
tree_dict = {}
update_params_dict = {}
# 定义变量,用于存储用户选择的分形类型
shape_var = tk.StringVar()
# 设置字体
ft1 = tf.Font(family="黑体", size=21)
ft2 = tf.Font(family="黑体", size=21, weight=tf.BOLD)
ft3 = tf.Font(family="黑体", size=18)
ft4 = tf.Font(family="黑体", size=19)
# 创建一个标签
lab1 = tk.Label(root, text="分形图案类型", font=ft1)
lab1.place(x=20, y=10, width=180, height=50, anchor='nw')
# 创建一个按钮,用来新增分形图案类型
button_addPattern = tk.Button(root, text="新增分形图案类型", command=add_fractal, font=ft2)
button_addPattern.place(x=500, y=10, width=270, height=50, anchor='ne')
## 滚动框的设置
# 创建一个Canvas对象使用该对象作为滚动区域
canvas = tk.Canvas(root, width=445, height=160)
# 创建一个列表框对象Rlist并将其放入滚动区域中
Rlist = tk.Listbox(canvas, width=445, height=20, bg='white', highlightthickness=1, highlightbackground="LightBlue")
# 创建滚动条对象并与Canvas绑定实现滚动条功能
scrollbar = tk.Scrollbar(root, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=scrollbar.set)
canvas.place(x=20, y=75, anchor='nw')
scrollbar.place(x=470, y=75, width=30, height=160, anchor='nw')
# 创建一个Frame组件用于放置单选框
frame = tk.Frame(Rlist, bg='white')
frame.place(anchor='nw')
# 将列表框放入Canvas中并设置Canvas窗口的大小
box_id = canvas.create_window((0, 0), window=Rlist, anchor="nw")
Rlist.update_idletasks() # 更新视图
canvas.config(scrollregion=canvas.bbox("all")) # 设置画布的滚动区域
# 添加单选框到 Frame组件
rb_Y = tk.Radiobutton(frame, text="Y形分形 Y_Fractal", variable=shape_var, value='Y', bg="white", font=ft1)
rb_Y.pack(anchor='w')
rb_Triangle = tk.Radiobutton(frame, text="三角形分形 Triangle_Fractal", variable=shape_var, value='Triangle',
bg="white", font=ft1)
rb_Triangle.pack(anchor='w')
rb_Rect = tk.Radiobutton(frame, text="矩形分形 Rect_Fractal", variable=shape_var, value='Rect', bg="white",
font=ft1)
rb_Rect.pack(anchor='w')
if os.path.exists('params.csv'):
df = pd.read_csv("params.csv")
for i in df["分型名称"]:
rb1 = tk.Radiobutton(frame, text=i, variable=shape_var, value=df[df['分型名称'] == i].分形英文.values[0],
bg="white", font=ft1)
rb1.pack(anchor='w')
# 将默认选项设置为 Y 形分形
rb_Y.select()
# 创建一个标签
lab2 = tk.Label(root, text="分形参数设置【参数含义:参量名=参量值】", font=ft4)
lab2.place(x=20, y=255, width=490, height=40, anchor='nw')
# 大画布的宽度和高度变量,方便后期调整
big_width = 880
big_height = 690
# 创建蓝色边框的大画布
cv_big = tk.Canvas(root, bg="white", highlightthickness=1, highlightbackground="LightBlue")
cv_big.config(width=big_width, height=big_height)
cv_big.place(x=530, y=10, anchor='nw')
# 创建红色边框的小画布宽高设置为大画布的1/4
cv_small = tk.Canvas(cv_big, bg="white", highlightthickness=1, highlightbackground="tomato")
cv_small.config(width=big_width * 0.25, height=big_height * 0.25)
cv_small.place(x=0, y=big_height, anchor='sw')
# 创建一个多行文本框
params_text = tk.Text(root, bg="white", highlightthickness=1, highlightbackground="LightBlue")
params_text.configure(font=ft3, spacing1=15)
params_text.place(x=20, y=300, width=480, height=310, anchor='nw')
# 初始化分形参数并输出
params_str = params_Y
params_text.insert(tk.INSERT, params_str)
# trace追踪变量w模式回调函数update_text
shape_var.trace('w', lambda *args, str_params_dict=str_params_dict: update_Text())
# 创建四个按钮
button_delete = tk.Button(root, text="删除\n选项", command=delete_rb, font=ft2)
button_delete.place(x=20, y=700, width=90, height=75, anchor='sw')
button_pattern = tk.Button(root, text="基本图\n案绘制", command=draw_pattern, font=ft2)
button_pattern.place(x=130, y=700, width=120, height=75, anchor='sw')
button_params = tk.Button(root, text="绘制参\n数设置", command=update_params, font=ft2)
button_params.place(x=270, y=700, width=120, height=75, anchor='sw')
button_drawTree = tk.Button(root, text="绘制", command=draw_tree, font=ft2)
button_drawTree.place(x=410, y=700, width=90, height=75, anchor='sw')
# 创建底部输出框
output_text = tk.Text(root, bg="white", highlightthickness=1, highlightbackground="LightBlue")
output_text.configure(font=ft3, spacing1=8)
text = " 结果输出:<分形绘制参数的字符串形式输出>"
output_text.insert(tk.INSERT, text)
output_text.place(x=20, y=800, width=1390, height=80, anchor='sw')
# 进入消息循环
root.mainloop()