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.

782 lines
28 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.

# -*- encoding: utf-8 -*-
"""
@Author: packy945
@FileName: main.py
@DateTime: 2023/5/11 11:34
@SoftWare: PyCharm
"""
from data import *
import tkinter.messagebox
from collections import Counter
from PIL import Image, ImageTk
from TreeNode import *
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from ttkbootstrap import *
sz = []
A = Aexp([0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0])
img_open = []
img_png = []
def change_card():
card = []
for n in tree.Node:
if n[1] == 'Value':
if n[5] == 1:
card.append([n[6], 'A'])
else:
card.append([n[6], str(n[5])])
# print(card)
if len(card) == 4:
show(card)
else:
tk.messagebox.showinfo('', '无法显示卡牌')
def TorF(flag):
'''
显示答案是否正确
:param flag: 答案是否正确
:return:
'''
if flag == 1:
clo1 = MARK
clo2 = NOMARK
elif flag == 0:
clo1 = NOMARK
clo2 = NOMARK
else:
clo1 = NOMARK
clo2 = MARK
label3 = tk.Label(window, text='', fg=clo1, font=('宋体', 10, 'bold italic'), borderwidth=5, relief="sunken")
label4 = tk.Label(window, text='×', fg=clo2, font=('宋体', 10, 'bold italic'), borderwidth=5, relief="sunken")
label3.place(x=625, y=240, width=30, height=25)
label4.place(x=625, y=270, width=30, height=25)
def ans_cal(ans = None):
if not ans:
label2 = tk.Label(window, text='= ?', font=('楷体', 18, 'bold'), width=30, height=10,
# 设置填充区距离、边框宽度和其样式(凹陷式)
borderwidth=5, relief="sunken", anchor='w')
else:
label2 = tk.Label(window, text=f'={ans}', font=('楷体', 18, 'bold'), width=30, height=10,
# 设置填充区距离、边框宽度和其样式(凹陷式)
borderwidth=5, relief="sunken", anchor='w')
label2.place(x=425, y=240, width=100, height=50)
def init():
ans_cal()
all_ans["state"] = 'disable'
entry.delete(0, "end")
F.clear()
TorF(0)
#展示卡牌
def show_card():
'''
随机展示四张卡片
:return:
'''
global sz # 全局变量存放点数
sz = []
# 清空卡牌列表
init()
# 清空中间的表达式输入串Aexp, 同时清空中间的表达式输入框、结果显示框和结果正确与错误标志
kp_list = []
size_list = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
col_list = ["Club", "Diamond", "Spade", "Heart"]
sz_list = ['a', 'j', 'q', 'k']
for i in range(4):
kp_list.append([random.choice(col_list), random.choice(size_list)]) # 随机生成花色以及点数
sz.append([kp_list[i][0], kp_list[i][1], kp_list[i][1]])
if kp_list[i][-1] == '1':
kp_list[i][-1] = random.choice(sz_list)
sz[i][2] = kp_list[i][-1]
show(kp_list)
global A
A.refresh(sz[0], sz[1], sz[2], sz[3])
cv.update()
def show(kp_list):
# 根据花色以及点数显示卡牌
# cv = tk.Canvas(window, width=380, height=136, bg='#FFFFCC') # 分配位置
# cv.place(x=100, y=3)
global img_open, img_png
img_open = []
img_png = []
cv.delete('all')
i = 0 #卡牌位置偏移量
for k in range(4):
img_open.append(
Image.open("card/" + kp_list[k][0] + "/" + kp_list[k][0] + kp_list[k][1] + '.png').resize((90, 130)))
img_png.append(ImageTk.PhotoImage(img_open[k]))
cv.create_image(50 + i, 70, image=img_png[k])
i += 95
'''
img_open.append(Image.open("card/" + kp_list[0][0] + "/" + kp_list[0][0] + kp_list[0][1] + '.png').resize((90, 130)))
img_png.append(ImageTk.PhotoImage(img_open[0]))
cv.create_image(50 + i, 70, image=img_png[0])
# img_open = Image.open("card/" + kp_list[0][0] + "/" + kp_list[0][0] + kp_list[0][1] + '.png').resize((90, 130))
# img_png = ImageTk.PhotoImage(img_open)
# cv.create_image(50 + i, 70, image=img_png)
i += 95
img_open.append(
Image.open("card/" + kp_list[1][0] + "/" + kp_list[1][0] + kp_list[1][1] + '.png').resize((90, 130)))
img_png.append(ImageTk.PhotoImage(img_open[1]))
cv.create_image(50 + i, 70, image=img_png[1])
# img_open1 = Image.open("card/" + kp_list[1][0] + "/" + kp_list[1][0] + kp_list[1][1] + '.png').resize((90, 130))
# img_png1 = ImageTk.PhotoImage(img_open1)
# cv.create_image(50 + i, 70, image=img_png1)
i += 95
img_open2 = Image.open("card/" + kp_list[2][0] + "/" + kp_list[2][0] + kp_list[2][1] + '.png').resize((90, 130))
img_png2 = ImageTk.PhotoImage(img_open2)
cv.create_image(50 + i, 70, image=img_png2)
i += 95
img_open3 = Image.open("card/" + kp_list[3][0] + "/" + kp_list[3][0] + kp_list[3][1] + '.png').resize((90, 130))
img_png3 = ImageTk.PhotoImage(img_open3)
cv.create_image(50 + i, 70, image=img_png3)
'''
# window.mainloop()
cv.update()
#展示结果
def show_result(ss, sz):
'''
展示计算结果
:param ss: 输入框中的表达式
:param sz: 题中给的卡牌数字
:return:
'''
if len(sz) != 4:
tk.messagebox.showinfo('', '未出题')
return
char_list = [] #用于存放算式中的数字
for i in range(len(ss)):
if ss[i]>'0' and ss[i]<='9':
char_list.append(ss[i])
a = Counter(char_list) #计数函数Counter
b = Counter([sz[0][1], sz[1][1], sz[2][1], sz[3][1]])
if len(char_list) != 4:
tk.messagebox.showinfo('', '请输入符合所给卡牌点数的可运算表达式')
elif a != b:
tk.messagebox.showinfo('', '你的表达式中的点数与所给卡牌点数不同')
else:
try:
ans = eval(ss)
except:
tk.messagebox.showinfo('', '表达式不可运算')
else:
ans_cal(int(ans))
#设置颜色
if ans == 24:
TorF(1)
else:
TorF(-1)
#展示一个可行算式
def show_answer():
# 自动求解
if len(sz) != 4:
tk.messagebox.showinfo('', '未出题')
return
try:
answer = (A.answer[0], A.Color[0])
A.Aexp_cur = 0
except:
tk.messagebox.showinfo('', '出错')
return
# print()
# print(answer)
if A.num == 0:
entry.delete(0, "end")
tk.messagebox.showinfo('', '无法得出24点')
else:
entry.delete(0, "end")
entry.insert("end", answer[0])
'''
Treenode = Decomposition(answer)
label_answer = tk.Label(window,text=answer+' '+str(Treenode),bg="#FFFFCC",fg="black")
label_answer.place(x=105,y=210)
'''
F.show_tree(answer)
if A.num > 1:
all_ans["state"] = 'normal'
else:
all_ans["state"] = 'disable'
def show_next():
global A
A.Aexp_cur += 1
answer = (A.answer[A.Aexp_cur], A.Color[A.Aexp_cur])
entry.delete(0, "end")
entry.insert("end", answer[0])
F.show_tree(answer)
if A.Aexp_cur == A.num - 1:
all_ans["state"] = 'disable'
tk.messagebox.showinfo('', '已显示所有答案')
#显示所有答案,通过一个新窗口
def show_all():
global Aexp_cur
answer = Aexp(int(sz[0][1]), int(sz[1][1]), int(sz[2][1]), int(sz[3][1]))
# Tree_all = []
# for item in answer:
# Tree_all.append(Decomposition(item))
root = tk.Tk()
# root.geometry('500x300')
width = 500
height = 300
screen_width = window.winfo_screenwidth() # winfo方法来获取当前电脑屏幕大小
screen_height = window.winfo_screenheight()
x = int((screen_width - width) / 2)
y = int((screen_height - height) / 2) - 40
size = '{}x{}+{}+{}'.format(width, height, x, y)
root.geometry(size)
b1 = tk.Scrollbar(root, width=40)
# b1.place(x=410,y=200)
b1.pack(side=tk.RIGHT, fill=tk.Y)
b2 = tk.Listbox(root, yscrollcommand=b1.set,width=100)
for i in range(len(answer)):
b2.insert(tk.END,answer[i])
b2.pack(side=tk.LEFT, fill=tk.BOTH)
# b2.place(x=520,y=100)
b1.config(command=b2.yview)
root.mainloop()
def BUTs():
global all_ans
but = tk.Button(window, text='出题', bg='#ffffcc', fg='black', command=lambda: show_card())
but.place(x=500, y=20, width=100, height=50, )
but2 = tk.Button(window, text='换牌', bg='#ffffcc', fg='black', command=lambda: change_card())
but2.place(x=500, y=80, width=100, height=50, )
but4 = tk.Button(window, text='计算', bg='#ffffcc', fg='black', command=lambda: show_result(entry.get(), sz))
but4.place(x=530, y=240, width=80, height=50, )
but3 = tk.Button(window, text='自动求解', bg='#ffffcc', fg='black', command=lambda: show_answer())
but3.place(x=250, y=210, width=120, height=40, )
all_ans = tk.Button(window, text='所有答案', bg='#ffffcc', fg='black', command=lambda: show_next(), state='disable')
all_ans.place(x=410, y=210, width=120, height=40, )
but5 = tk.Button(window, text='画树', bg='#ffffcc', fg='black', command=lambda: F.show_tree(entry.get()))
but5.place(x=80, y=210, width=120, height=40, )
def left2(event):
# 查找鼠标左键按下时位置是否在某个牌上
# print(event.x, event.y)
# if not A.card
left = [5, 100, 195, 290]
right = [95, 190, 285, 380]
up = 5
down = 135
'''
for i in range(4):
if up <= event.y <= down and right[i] >= event.x >= left[i]:
print(i + 1)
print(A.card[i])
'''
# 添加数值节点
if F.mode == 2:
for cur in range(4):
if up <= event.y <= down and right[cur] >= event.x >= left[cur]:
# 检查数值节点是否已存在
a = []
b = []
for card in A.card:
a.append([card[0], int(card[1])])
for node in tree.Node:
if node[1] == 'Value':
b.append([node[6], node[5]])
c = a.copy()
for x in b:
for i in range(len(c)):
try:
c[i]
except:
break
if x[0] == c[i][0] and x[1] == c[i][1]:
del c[i]
flag = 0
for l in c:
# 若所选card还没有对应的节点则新建一个数值节点
if not flag and l[0] == A.card[cur][0] and l[1] == int(A.card[cur][1]):
tree.Node.append([len(tree.Node), 'Value', None, None, None, int(A.card[cur][1]), A.card[cur][0]])
flag = 1
if not flag:
# 若所选card已经存在则进行警告
tk.messagebox.showinfo('', '所选card已存在')
# 操作完成,进行复位
F.mode = 0
F.tips = ''
tree.remark()
F.draw()
# 改变运算输入的第二步
elif F.mode == 6:
for cur in range(4):
# 若单击了一张card
if up <= event.y <= down and right[cur] >= event.x >= left[cur]:
# 标记的节点序号
mark = -1
for i in range(len(tree.mark)):
if tree.mark[i] == 1:
mark = i
flag = 0
for now in range(len(tree.Node)):
# 若单击的card已经存在一个数值节点
if tree.Node[now][6] == A.card[cur][0] and tree.Node[now][5] == int(A.card[cur][1]):
# 则将这两个数值节点进行交换
tree.Node[now][5] = tree.Node[mark][5]
tree.Node[now][6] = tree.Node[mark][6]
tree.Node[mark][5] = int(A.card[cur][1])
tree.Node[mark][6] = A.card[cur][0]
flag = 1
if not flag:
# 若单击的card没有存在数值节点则将该节点改为这张card
tree.Node[mark][5] = int(A.card[cur][1])
tree.Node[mark][6] = A.card[cur][0]
# 操作完毕,进行复位
F.mode = 0
F.tips = ''
tree.remark()
F.draw()
class Frame_Tree:
def __init__(self, window):
self.opt = '+'
self.mode = 0
'''
当前操作:
0 无
1 添加运算节点
2 添加数值节点
3 改变运算输入
4 改变节点运算
5 数值节点交换
'''
self.tips = ''
self.Tree_root = tk.Frame(window, relief="groove", width=610, height=400)
self.Tree_root.place(x=50, y=250) # 树的显示
self.Tree_cv = tk.Canvas(self.Tree_root, width=610, height=400, bg='#b7bcc0')
self.Tree_cv.place(x=0, y=0)
# Tree_cv.create_rectangle(10, 10, 600, 290, width=10, outline='#ff9933')
self.opt1 = tk.Button(self.Tree_root, text='+', bg='#cca583', fg='black', command=lambda: self.set_opt(1))
self.opt1.place(x=500, y=20, width=30, height=30)
self.opt2 = tk.Button(self.Tree_root, text='-', bg='#cca583', fg='black', command=lambda: self.set_opt(2))
self.opt2.place(x=535, y=20, width=30, height=30)
self.opt3 = tk.Button(self.Tree_root, text='*', bg='#cca583', fg='black', command=lambda: self.set_opt(3))
self.opt3.place(x=500, y=55, width=30, height=30)
self.opt4 = tk.Button(self.Tree_root, text='/', bg='#cca583', fg='black', command=lambda: self.set_opt(4))
self.opt4.place(x=535, y=55, width=30, height=30)
self.set_opt(1)
dy = 50
bot = tk.Button(self.Tree_root, text='添加运算节点', bg='#cca583', fg='black', command=lambda: self.add_opt())
bot.place(x=500, y=40 + dy, width=80, height=30)
bot = tk.Button(self.Tree_root, text='添加数值节点', bg='#cca583', fg='black', command=lambda: self.add_num())
bot.place(x=500, y=75 + dy, width=80, height=30)
bot = tk.Button(self.Tree_root, text='改变运算输入', bg='#cca583', fg='black', command=lambda: self.change_num())
bot.place(x=500, y=110 + dy, width=80, height=30)
bot = tk.Button(self.Tree_root, text='改变节点运算', bg='#cca583', fg='black', command=lambda: self.change_opt())
bot.place(x=500, y=145 + dy, width=80, height=30)
bot = tk.Button(self.Tree_root, text='数值节点交换', bg='#cca583', fg='black', command=lambda: self.change_node())
bot.place(x=500, y=180 + dy, width=80, height=30)
bot = tk.Button(self.Tree_root, text='产生表达式', bg='#cca583', fg='black', command=lambda: self.Aexp())
bot.place(x=500, y=215 + dy, width=80, height=30)
bot = tk.Button(self.Tree_root, text='清空画布', bg='#cca583', fg='black', command=lambda: self.clear())
bot.place(x=500, y=250 + dy, width=80, height=30)
# bot = tk.Button(self.Tree_root, text='计算', bg='#cca583', fg='black', command=lambda: tree.calculate(tree.Node[tree.rootID]))
# bot.place(x=500, y=250, width=80, height=30)
self.Tree_cv.bind('<Button-1>', self.left1)
self.draw()
def set_opt(self, x):
# self.opt1["state"] = "disable"
# exec('self.opt1["state"] = "disable"')
opt = ['+', '-', '*', '/']
self.opt = opt[x - 1]
for i in range(4):
exec('self.opt' + str(i + 1) + '["state"] = "normal"')
exec('self.opt' + str(i + 1) + "['bg']='#cca583'")
exec('self.opt' + str(i + 1) + "['fg']='black'")
exec('self.opt' + str(x) + "['state']='disable'")
exec('self.opt' + str(x) + "['bg']='#8f735c'")
exec('self.opt' + str(x) + "['fg']='white'")
# 8f735c
self.draw()
def add_opt(self):
tree.remark()
self.tips = '请选择两个节点'
self.mode = 1
self.draw()
def change_node(self):
tree.remark()
self.tips = '请选择两个数值节点'
self.mode = 5
self.draw()
def change_opt(self):
tree.remark()
self.tips = '请选择一个运算节点'
self.mode = 4
self.draw()
def add_num(self):
tree.remark()
self.tips = '请选择一张card'
self.mode = 2
self.draw()
def change_num(self):
tree.remark()
self.tips = '请选择一个数值节点'
self.mode = 3
self.draw()
def left1(self, event):
# 查找鼠标左键按下时位置是否在某个节点内,并根据当前操作模式进行反馈
'''
print(event.x, event.y)
i = 0
print(tree.place)
for T in tree.place:
if abs(event.x - T[0]) <= tree.bc / 2 and abs(event.y - T[1]) <= tree.bc / 2:
# tree.mark[i] = not tree.mark[i]
print(tree.Node[i])
i += 1
'''
# 无操作
if self.mode == 0:
return
# 添加运算节点
elif self.mode == 1:
i = 0
for T in tree.place:
if abs(event.x - T[0]) <= tree.bc / 2 and abs(event.y - T[1]) <= tree.bc / 2:
# 标记点击的节点
tree.mark[i] = not tree.mark[i]
i += 1
nodes = []
for i in range(len(tree.Node)):
if tree.mark[i] == 1:
nodes.append(i)
if len(nodes) == 2:
# 若已经选择两个节点
tree.check()
# 检查节点是否合法
if tree.ck[nodes[0]] == 1 and tree.ck[nodes[1]] == 1:
# 若节点合法,则添加新运算节点并将其设置为根节点
ID = len(tree.Node)
tree.Node.append([ID, 'Operator', self.opt, nodes[0], nodes[1], None, None])
tree.rootID = ID
else:
# 若节点不合法则显示警告
tk.messagebox.showinfo('', '所选节点不合法')
# 添加运算节点操作结束
self.mode = 0
self.tips = ''
tree.remark()
# 添加数值节点
elif self.mode == 2:
# 添加数值节点无需点击节点
pass
# 改变运算输入
elif self.mode == 3:
i = 0
flag = 0
for T in tree.place:
if abs(event.x - T[0]) <= tree.bc / 2 and abs(event.y - T[1]) <= tree.bc / 2:
# 若点击节点为数值节点,则标记
if tree.Node[i][1] == 'Value':
tree.mark[i] = 1
flag = 1
# 若点击节点为运算节点,则弹窗警告
else:
tk.messagebox.showinfo('', '所选节点不合法')
flag = 1
i += 1
if flag:
# 选择节点完成过后还需选择card
self.mode = 6
self.tips = '请选择一张card'
self.draw()
# 改变节点运算
elif self.mode == 4:
i = 0
flag = 0
for T in tree.place:
if abs(event.x - T[0]) <= tree.bc / 2 and abs(event.y - T[1]) <= tree.bc / 2:
# 检查节点是否合法,若选择的是运算节点,则进行运算符的改变
if tree.Node[i][1] == 'Operator':
tree.Node[i][2] = self.opt
flag = 1
# 若选择的是数值节点,则弹窗警告
else:
tk.messagebox.showinfo('', '所选节点不合法')
flag = 1
i += 1
if flag:
# 操作完毕,进行复位
self.mode = 0
self.tips = ''
tree.remark()
# 数值节点交换
elif self.mode == 5:
i = 0
for T in tree.place:
# 标记选择的节点
if abs(event.x - T[0]) <= tree.bc / 2 and abs(event.y - T[1]) <= tree.bc / 2:
tree.mark[i] = not tree.mark[i]
i += 1
nodes = []
for i in range(len(tree.Node)):
if tree.mark[i] == 1:
nodes.append(i)
if len(nodes) == 2:
# 已经选择两个节点
if tree.Node[nodes[0]][1] == 'Value' and tree.Node[nodes[1]][1] == 'Value':
# 若选择的节点都是数值节点,则交换两个节点的数值与花色
Value = tree.Node[nodes[0]][5]
Color = tree.Node[nodes[0]][6]
tree.Node[nodes[0]][5] = tree.Node[nodes[1]][5]
tree.Node[nodes[0]][6] = tree.Node[nodes[1]][6]
tree.Node[nodes[1]][5] = Value
tree.Node[nodes[1]][6] = Color
else:
# 若选择的不是数值节点,则进行警告
tk.messagebox.showinfo('', '所选节点不合法')
# 操作结束,复位
self.mode = 0
self.tips = ''
tree.remark()
self.draw()
def clear(self):
self.Tree_cv.delete('all')
tree.Node = []
tree.rootID = None
def Aexp(self):
entry.delete(0, "end")
try:
exp = tree.Aexp(tree.Node[tree.rootID])
except:
tk.messagebox.showinfo('', '语法树不合法')
return
entry.insert("end", exp)
# ans = int(tree.calculate(tree.Node[tree.rootID]))
ans = float(tree.calculate(tree.Node[tree.rootID]))
ans_cal(f'{float(tree.calculate(tree.Node[tree.rootID])):.2f}')
if ans == 24:
TorF(1)
else:
TorF(-1)
char_list = [] # 用于存放算式中的数字
for i in range(len(exp)):
if exp[i] > '0' and exp[i] <= '9':
char_list.append(exp[i])
a = Counter(char_list) # 计数函数Counter
b = Counter([sz[0][1], sz[1][1], sz[2][1], sz[3][1]])
if len(char_list) != 4:
tk.messagebox.showinfo('', '请输入符合所给卡牌点数的可运算表达式')
def show_tree(self, ss):
# 清空画布
self.Tree_cv.delete('all')
if len(ss) == 0:
tk.messagebox.showinfo('', '表达式不存在')
return
build_ast(ss)
self.draw()
def draw(self):
self.Tree_cv.delete('all')
mode = ['', '添加运算节点', '添加数值节点', '改变运算输入', '改变节点运算', '数值节点交换', '添加数值节点']
lab1 = tk.Label(self.Tree_cv, text='当前操作:', bg='#b7bcc0', font=('宋体', 14, 'bold'), borderwidth=5, anchor='w')
lab1.place(x=30, y=10, width=90, height=30)
lab2 = tk.Label(self.Tree_cv, text=mode[self.mode], bg='#b7bcc0', font=('宋体', 14, 'bold'), borderwidth=5, anchor='w')
lab2.place(x=120, y=10, width=150, height=30)
lab3 = tk.Label(self.Tree_cv, text=self.tips, bg='#b7bcc0', font=('宋体', 14, 'bold'), borderwidth=5, anchor='w')
lab3.place(x=300, y=10, width=200, height=30)
tree.deepth = []
for i in range(len(tree.Node)):
tree.deepth.append(-1)
# 格式化树节点的深度
tree.deep()
# 初始化节点数与深度
dept, nums = -1, 0
tree.place = []
for i in range(len(tree.deepth)):
dept = max(dept, tree.deepth[i])
tree.place.append((None, None))
if tree.deepth[i] == 0:
nums += 1
tree_length = 500
tree_height = 400
dx = tree_length // (nums + 1)
dy = tree_height // (dept + 2)
# 若为数字节点
cur = 0
for i in range(len(tree.deepth)):
if tree.deepth[i] == 0:
cur += 1
tree.place[i] = (cur * dx, tree_height - dy)
color = 'white'
if tree.mark[i]:
color = '#d1d2c8'
self.Tree_cv.create_rectangle(tree.place[i][0] - tree.bc / 2, tree.place[i][1] - tree.bc / 2,
tree.place[i][0] + tree.bc / 2,
tree.place[i][1] + tree.bc / 2, fill=color, width=0)
self.Tree_cv.create_text(tree.place[i][0], tree.place[i][1], text=str(tree.Node[i][5]),
font=('宋体', 15, 'bold'), anchor='center')
for d in range(dept):
cur_d = d + 1
for i in range(len(tree.deepth)):
if tree.deepth[i] == cur_d:
lnode = tree.place[tree.Node[i][3]]
rnode = tree.place[tree.Node[i][4]]
node = ((lnode[0] + rnode[0]) / 2, tree_height - (cur_d + 1) * dy)
self.Tree_cv.create_line(lnode[0], lnode[1] - tree.bc / 2, node[0], node[1] + tree.bc / 2,
fill='#1ffbe9', width=2)
self.Tree_cv.create_line(rnode[0], rnode[1] - tree.bc / 2, node[0], node[1] + tree.bc / 2,
fill='#1ffbe9', width=2)
tree.place[i] = node
color = 'white'
if tree.mark[i]:
color = '#d1d2c8'
self.Tree_cv.create_rectangle(tree.place[i][0] - tree.bc / 2, tree.place[i][1] - tree.bc / 2,
tree.place[i][0] + tree.bc / 2, tree.place[i][1] + tree.bc / 2,
fill=color, width=0)
self.Tree_cv.create_text(tree.place[i][0], tree.place[i][1], text=str(tree.Node[i][2]),
font=('宋体', 15, 'bold'), anchor='center')
self.Tree_cv.update()
window = Window()
screen_width = window.winfo_screenwidth() # winfo方法来获取当前电脑屏幕大小
screen_height = window.winfo_screenheight()
var = tk.StringVar()
var2 = tk.StringVar()
width = int(screen_width*0.8)
height = int(screen_height*0.8 ) # 窗口大小
x = int((screen_width - width) / 2)
y = int((screen_height - height) / 2) - 40
size = '{}x{}+{}+{}'.format(width, height, x, y)
window.geometry(size)
F = Frame_Tree(window)
#基本组件显示
cv = Canvas(window, width=width, height=height * 0.3, background='red')
cv.place(x=0, y=3)
cv.bind('<Button-1>', left2)
entry = tk.Entry(window, show=None, font=('宋体', 15, 'bold'))
entry.place(x=25, y=240, width=400, height=50)
all_ans = None
BUTs()
'''
label3 = tk.Label(window,text='',fg='#cccccc',font=('宋体', 10, 'bold italic'), borderwidth=5, relief="sunken")
label4 = tk.Label(window,text='×',fg='#cccccc',font=('宋体', 10, 'bold italic'), borderwidth=5, relief="sunken")
label3.place(x=360,y=160,width=30,height=25)
label4.place(x=360,y=180,width=30,height=25)
label2 = tk.Label(window, text='= ?', font=('宋体', 15, 'bold'), width=30, height=10,
# 设置填充区距离、边框宽度和其样式(凹陷式)
borderwidth=5, relief="sunken")
label2.place(x=240, y=160, width=60, height=50)
'''
init()
# cv1 = tk.Canvas(window, width=380, height=90, bg='#FFFFCC')
# cv1.place(x=100, y=200)
'''
cv = tk.Canvas(window, width=610, height=300, bg='#ffffff')
cv.place(x=3, y=310)
cv.create_rectangle(10,10,600,290,width=10,outline='#ff9933')
bot = tk.Button(window,text='添加运算节点',bg='#ffffcc',fg='black',)
bot.place(x=500,y=340,width=80,height=30)
bot = tk.Button(window,text='添加数值节点',bg='#ffffcc',fg='black',)
bot.place(x=500,y=375,width=80,height=30)
bot = tk.Button(window,text='改变运算输入',bg='#ffffcc',fg='black',)
bot.place(x=500,y=410,width=80,height=30)
bot = tk.Button(window,text='改变节点运算',bg='#ffffcc',fg='black',)
bot.place(x=500,y=445,width=80,height=30)
bot = tk.Button(window,text='数值节点交换',bg='#ffffcc',fg='black',)
bot.place(x=500,y=480,width=80,height=30)
bot = tk.Button(window,text='产生表达式',bg='#ffffcc',fg='black',)
bot.place(x=500,y=515,width=80,height=30)
'''
window.mainloop()
# if __name__ == "__main__":
# # 初始化Tree类的实例
# tree = Tree()
#
# # 调用calculate方法并传递要计算的节点作为参数
# result = tree.calculate(tree.Node[3])
#
# # 在这里对result进行后续操作或者输出它
# print(result)