ขนาดวิดีโอ: 1280 X 720853 X 480640 X 360
แสดงแผงควบคุมโปรแกรมเล่น
เล่นอัตโนมัติ
เล่นใหม่
FINAL CODEfrom tkinter import *import mathimport randomclass Root(Tk): def __init__(self): super().__init__() self.title("Skill Web") self.state("zoomed") self.skill_web = SkillWeb(self) self.skill_web.pack(fill=BOTH, expand=1) self.skill_web.draw() class SkillWeb(Canvas): def __init__(self, parent): super().__init__(parent, bg="#FED6D3") #Must Have at least 3 Skills! self.skills = { "Strength": random.randint(0, 100), "Intelligence": random.randint(0, 100), "Willpower": random.randint(0, 100), "Agility": random.randint(0, 100), "Speed": random.randint(0, 100), #"Endurance": random.randint(0, 100), #"Personality": random.randint(0, 100), #"Luck": random.randint(0, 100), } #Imaginary Circle self.center_x = self.winfo_width() / 2 self.center_y = self.winfo_height() / 2 #Determines Size of 1st Layer self.outer_radius = 200 #Determines Size of Last Layer self.inner_radius = 50 #Number of Layers. Must Be at Least 2! self.layers = 5 #N-gon (#vertices, skills, edges) self.n_gon = len(self.skills) #Vertex Angle self.vertex_angle = 2 * math.pi / self.n_gon #Rotates Skill Web self.offset = (math.pi / 2) * -1 def draw(self): #Update Canvas self.update() #Imaginary Circle Center self.center_x = self.winfo_width() / 2 self.center_y = self.winfo_height() / 2 #Space Between Each Layer decrement = (self.outer_radius - self.inner_radius) / (self.layers - 1) #Skills skill_names = list(self.skills.keys()) skill_levels = list(self.skills.values()) #Iterate THrough Each Layer for layer in range(self.layers): #Calculate Layer Radius cur_radius = self.outer_radius - layer * decrement #List to Store Vertices vertices = [] #Calculate Vertices for i in range(self.n_gon): #Calculate Angle for Current Vertex angle = self.offset + i * self.vertex_angle #Calculate Vertex Coordinates x = self.center_x + cur_radius * math.cos(angle) y = self.center_y + cur_radius * math.sin(angle) #Append Coordinates to Vertices List vertices.append([x, y]) #Draw Line Between Vertices for Current Layer self.create_polygon(vertices, fill="", outline="black", width=3) #Draw Lines from Center to Outside Vertices if layer == 0: for j in range(self.n_gon): x, y = vertices[j] self.create_line(x, y, self.center_x, self.center_y, width=3) """Display Skill Names""" #Skill Name Radius lbl_r = self.outer_radius + 30 #Skill Name Angle angle = self.offset + j * self.vertex_angle #Calculate Skill Name X,Y lbl_x = self.center_x + lbl_r * math.cos(angle) lbl_y = self.center_y + lbl_r * math.sin(angle) #Display Skill Name self.create_text(lbl_x, lbl_y, text=skill_names[j]) """Calculate Skill Level Vertices""" #List to Store Skill Vertices skill_vertices = [] #Iterate through Skill Levels w/ Index for l, level in enumerate(skill_levels): max_level = min(level, 100) if level == 0: r = 0 else: normalized_level = (max_level - 1) / (100 - 1) r = self.inner_radius + normalized_level * (self.outer_radius - self.inner_radius) angle = self.offset + l * self.vertex_angle x = self.center_x + r * math.cos(angle) y = self.center_y + r * math.sin(angle) skill_vertices.append([x, y]) #Fill Shape Formed by Skill Vertices coordinates = [coords for vertex in skill_vertices for coords in vertex] self.create_polygon(coordinates, fill="#9D8A88", outline="black", width=2) #Draw Skill Vertices for x, y in skill_vertices: self.create_oval(x - 10, y - 10, x + 10, y + 10, fill="#9D8A88", outline="black", width=2) if ___name___ == "__main__": root = Root() root.mainloop()
Thank you for sharing the code
You're welcome!
FINAL CODE
from tkinter import *
import math
import random
class Root(Tk):
def __init__(self):
super().__init__()
self.title("Skill Web")
self.state("zoomed")
self.skill_web = SkillWeb(self)
self.skill_web.pack(fill=BOTH, expand=1)
self.skill_web.draw()
class SkillWeb(Canvas):
def __init__(self, parent):
super().__init__(parent, bg="#FED6D3")
#Must Have at least 3 Skills!
self.skills = {
"Strength": random.randint(0, 100),
"Intelligence": random.randint(0, 100),
"Willpower": random.randint(0, 100),
"Agility": random.randint(0, 100),
"Speed": random.randint(0, 100),
#"Endurance": random.randint(0, 100),
#"Personality": random.randint(0, 100),
#"Luck": random.randint(0, 100),
}
#Imaginary Circle
self.center_x = self.winfo_width() / 2
self.center_y = self.winfo_height() / 2
#Determines Size of 1st Layer
self.outer_radius = 200
#Determines Size of Last Layer
self.inner_radius = 50
#Number of Layers. Must Be at Least 2!
self.layers = 5
#N-gon (#vertices, skills, edges)
self.n_gon = len(self.skills)
#Vertex Angle
self.vertex_angle = 2 * math.pi / self.n_gon
#Rotates Skill Web
self.offset = (math.pi / 2) * -1
def draw(self):
#Update Canvas
self.update()
#Imaginary Circle Center
self.center_x = self.winfo_width() / 2
self.center_y = self.winfo_height() / 2
#Space Between Each Layer
decrement = (self.outer_radius - self.inner_radius) / (self.layers - 1)
#Skills
skill_names = list(self.skills.keys())
skill_levels = list(self.skills.values())
#Iterate THrough Each Layer
for layer in range(self.layers):
#Calculate Layer Radius
cur_radius = self.outer_radius - layer * decrement
#List to Store Vertices
vertices = []
#Calculate Vertices
for i in range(self.n_gon):
#Calculate Angle for Current Vertex
angle = self.offset + i * self.vertex_angle
#Calculate Vertex Coordinates
x = self.center_x + cur_radius * math.cos(angle)
y = self.center_y + cur_radius * math.sin(angle)
#Append Coordinates to Vertices List
vertices.append([x, y])
#Draw Line Between Vertices for Current Layer
self.create_polygon(vertices, fill="", outline="black", width=3)
#Draw Lines from Center to Outside Vertices
if layer == 0:
for j in range(self.n_gon):
x, y = vertices[j]
self.create_line(x, y, self.center_x, self.center_y, width=3)
"""Display Skill Names"""
#Skill Name Radius
lbl_r = self.outer_radius + 30
#Skill Name Angle
angle = self.offset + j * self.vertex_angle
#Calculate Skill Name X,Y
lbl_x = self.center_x + lbl_r * math.cos(angle)
lbl_y = self.center_y + lbl_r * math.sin(angle)
#Display Skill Name
self.create_text(lbl_x, lbl_y, text=skill_names[j])
"""Calculate Skill Level Vertices"""
#List to Store Skill Vertices
skill_vertices = []
#Iterate through Skill Levels w/ Index
for l, level in enumerate(skill_levels):
max_level = min(level, 100)
if level == 0:
r = 0
else:
normalized_level = (max_level - 1) / (100 - 1)
r = self.inner_radius + normalized_level * (self.outer_radius - self.inner_radius)
angle = self.offset + l * self.vertex_angle
x = self.center_x + r * math.cos(angle)
y = self.center_y + r * math.sin(angle)
skill_vertices.append([x, y])
#Fill Shape Formed by Skill Vertices
coordinates = [coords for vertex in skill_vertices for coords in vertex]
self.create_polygon(coordinates, fill="#9D8A88", outline="black", width=2)
#Draw Skill Vertices
for x, y in skill_vertices:
self.create_oval(x - 10, y - 10, x + 10, y + 10, fill="#9D8A88", outline="black", width=2)
if ___name___ == "__main__":
root = Root()
root.mainloop()
Thank you for sharing the code
You're welcome!