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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# -*- 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()