|  |  |  | @ -0,0 +1,613 @@ | 
			
		
	
		
			
				
					|  |  |  |  | # -*- 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() |