内容:
import tkinter as tk
from tkinter import simpledialog
class NodeOperations:
def add_node(self, node_type):
node = {
"type": node_type,
"x": 50,
"y": 50,
"children": [],
"name": node_type,
"class": f"{node_type}Node",
"instance_name": node_type,
"input": " ",
"output": " "
}
self.nodes.append(node)
self.draw_node(node)
def draw_node(self, node):
x, y = node["x"], node["y"]
color = "lightblue" if node["type"] in ["Sequence", "Parallel", "Fallback"] else "lightgreen"
scaled_width = 100 * self.scale
scaled_height = 40 * self.scale
node["id"] = self.canvas.create_rectangle(x-scaled_width/2, y-scaled_height/2, x+scaled_width/2, y+scaled_height/2, fill=color, tags="node")
node["text_id"] = self.canvas.create_text(x, y, text=f"{node['type']}: {node['name']}", font=("Arial", int(10*self.scale)), tags="node")
self.canvas.tag_bind(node["id"], "<Button-1>", lambda e, n=node: self.select_node(n))
self.canvas.tag_bind(node["text_id"], "<Button-1>", lambda e, n=node: self.select_node(n))
def select_node(self, node):
if self.connecting:
self.finish_connecting(node)
else:
self.selected_node = node
def delete_node(self, node):
self.canvas.delete(node["id"])
self.canvas.delete(node["text_id"])
self.nodes.remove(node)
for parent in self.nodes:
if node in parent["children"]:
parent["children"].remove(node)
self.redraw_edges()
def rename_node(self, node):
new_name = simpledialog.askstring("Rename", "Enter new name:", initialvalue=node["name"])
if new_name:
node["name"] = new_name
node["instance_name"] = new_name
self.canvas.itemconfig(node["text_id"], text=f"{node['type']}: {node['name']}")
def edit_node_properties(self, node):
dialog = tk.Toplevel(self.root)
dialog.title(f"Edit {node['type']} Properties")
tk.Label(dialog, text="Class:").grid(row=0, column=0)
class_entry = tk.Entry(dialog)
class_entry.insert(0, node.get("class", ""))
class_entry.grid(row=0, column=1)
tk.Label(dialog, text="Instance Name:").grid(row=1, column=0)
instance_name_entry = tk.Entry(dialog)
instance_name_entry.insert(0, node.get("instance_name", ""))
instance_name_entry.grid(row=1, column=1)
tk.Label(dialog, text="Input:").grid(row=2, column=0)
input_entry = tk.Entry(dialog)
input_entry.insert(0, node.get("input", ""))
input_entry.grid(row=2, column=1)
tk.Label(dialog, text="Output:").grid(row=3, column=0)
output_entry = tk.Entry(dialog)
output_entry.insert(0, node.get("output", ""))
output_entry.grid(row=3, column=1)
def save_properties():
node["class"] = class_entry.get()
node["instance_name"] = instance_name_entry.get()
node["input"] = input_entry.get()
node["output"] = output_entry.get()
dialog.destroy()
tk.Button(dialog, text="Save", command=save_properties).grid(row=4, column=0, columnspan=2)
1、行为树可视化编辑器 2、行为树驱动的pacman游戏 3、pacman行为树xml
1.
main.py
功能: 主程序入口,负责初始化应用程序并启动主窗口。
内容:
2.
behavior_tree_editor.py
功能: 包含
BehaviorTreeEditor
类的定义,负责应用程序的整体结构和初始化。内容:
3.
node_operations.py
功能: 包含与节点操作相关的函数,如添加、删除、重命名、编辑节点属性等。
内容:
4.
canvas_operations.py
功能: 包含与画布操作相关的函数,如点击、拖动、释放、右键点击、缩放等。
内容:
5.
connection_operations.py
功能: 包含与节点连接相关的函数,如开始连接、完成连接、绘制连接线等。
内容:
6.
layout_operations.py
功能: 包含与自动布局相关的函数,如自动布局、子树布局等。
内容:
7.
xml_operations.py
功能: 包含与XML导入导出相关的函数,如导出XML、导入XML、解析XML节点等。
内容: