Skip to content

Commit cf9e635

Browse files
committed
v5.14.0a2
1 parent 402de90 commit cf9e635

File tree

1 file changed

+104
-36
lines changed

1 file changed

+104
-36
lines changed

easy_turtle.py

Lines changed: 104 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
1+

22
# ©2020-2021 Ryo Fujinami.
33

44
import atexit
@@ -88,6 +88,7 @@ def EXPAND(num):
8888
FONT_TYPE2 = "Times New Roman"
8989

9090
CURSOR = "arrow"
91+
GRAY = "#CDCDCD"
9192

9293
os.chdir(os.path.dirname(sys.argv[0]))
9394

@@ -174,6 +175,7 @@ def EXPAND(num):
174175
FONT_TYPE2 = "Times"
175176

176177
CURSOR = "left_ptr"
178+
GRAY = "#BDBDBD"
177179

178180
os.chdir(os.getcwd())
179181

@@ -250,7 +252,7 @@ def EXPAND(num):
250252

251253
FONT = (FONT_TYPE1, EXPAND(12), "bold")
252254

253-
__version__ = (5, 14, "0a1")
255+
__version__ = (5, 14, "0a2")
254256

255257

256258
class EasyTurtle:
@@ -1089,12 +1091,13 @@ def setup(self):
10891091
# 背景のキャンバス
10901092
cv = tk.Canvas(ROOT, width=MIN_WIDTH, height=MIN_HEIGHT)
10911093
cv.pack()
1092-
cv.create_text(MIN_WIDTH // 2 - EXPAND(80), MIN_HEIGHT // 2,
1093-
text="EasyTurtle", fill="green",
1094-
font=(FONT_TYPE2, EXPAND(80), "bold", "italic"))
1094+
cv.create_text(
1095+
MIN_WIDTH // 2 - EXPAND(80), MIN_HEIGHT // 2 - EXPAND(40),
1096+
text="EasyTurtle", fill="green",
1097+
font=(FONT_TYPE2, EXPAND(80), "bold", "italic"))
10951098
cv.create_polygon(*self.get_shape(
10961099
shape, MIN_WIDTH // 2 + EXPAND(260),
1097-
MIN_HEIGHT // 2 - EXPAND(10), EXPAND(-4)), fill="green")
1100+
MIN_HEIGHT // 2 - EXPAND(50), EXPAND(-4)), fill="green")
10981101

10991102
# 背景の右下
11001103
frame = tk.Frame(ROOT)
@@ -2267,9 +2270,9 @@ def setup(self):
22672270
class ToggleButton(tk.Canvas):
22682271
def __init__(
22692272
self, master=None, /,
2270-
fg="white", bg1="lightgray", bg2="lightgreen",
2271-
radius=16, width=24, height=40, start=False, smooth=4,
2272-
outline=False, margin=8, command=None):
2273+
fg="white", bg1=GRAY, bg2="lightgreen", radius=EXPAND(10),
2274+
width=EXPAND(18), height=EXPAND(28), start=False,
2275+
smooth=4, outline=False, margin=EXPAND(4), command=None):
22732276

22742277
self.foreground = fg
22752278
self.background1 = bg1
@@ -2286,8 +2289,12 @@ def __init__(
22862289
self.cvh = (radius*2 if radius*2 > height else height)+self.margin*2
22872290
self.cvw = self.cvh + width
22882291

2289-
tk.Canvas.__init__(
2290-
self, master, width=self.cvw, height=self.cvh, takefocus=True)
2292+
if master is not None:
2293+
tk.Canvas.__init__(
2294+
self, master, width=self.cvw, height=self.cvh, takefocus=True)
2295+
else:
2296+
tk.Canvas.__init__(
2297+
self, width=self.cvw, height=self.cvh, takefocus=True)
22912298

22922299
self.redraw_background()
22932300

@@ -2411,38 +2418,91 @@ def get(self):
24112418

24122419
class Notebook(tk.Canvas):
24132420
def __init__(
2414-
self, parent: EasyTurtle, master=None, /, height=48, margin=20,
2415-
font=("Courier New", 20, "bold")):
2421+
self, parent: EasyTurtle, master=None, /,
2422+
height=EXPAND(32), margin=EXPAND(8),
2423+
font=(FONT_TYPE1, EXPAND(12), "bold")):
24162424

24172425
self.et = parent
24182426

24192427
self.height = height
24202428
self.margin = margin
24212429
self.font = tkFont.Font(font=font)
2430+
24222431
self.selected = None
2423-
self.cursor = None
2432+
self.adjust = EXPAND(2)
2433+
self.drag_point = 0
2434+
self.image = tk.PhotoImage(width=1, height=1)
24242435

24252436
self.tabs: dict[tk.Canvas, tk.Frame] = {}
24262437

2427-
tk.Canvas.__init__(self, master, height=height)
2438+
if master is not None:
2439+
tk.Canvas.__init__(self, master, height=height)
2440+
else:
2441+
tk.Canvas.__init__(self, height=height)
24282442

2429-
self.frame = tk.Canvas(self, takefocus=True, height=height)
2443+
self.frame = tk.Frame(self, takefocus=True, height=height)
24302444
self.frame.pack(side=tk.TOP, anchor=tk.NW)
24312445

24322446
self.frame.bind("<Left>", self.go_left)
24332447
self.frame.bind("<Right>", self.go_right)
24342448

2449+
self.create_plus()
2450+
2451+
def create_plus(self):
2452+
pixel = self.font.measure("+") + self.margin
2453+
self.plus = tk.Button(
2454+
self.frame, text="+", width=pixel, height=pixel, image=self.image,
2455+
fg="gray", bg="#E6E6E6", font=self.font, cursor="hand2",
2456+
compound=tk.CENTER, command=self.et.new_program)
2457+
24352458
def add_tab(self, frame):
2436-
width = self.font.measure(" ×") + self.margin * 2
2459+
width = self.font.measure("×") + self.margin * 3
24372460
cv = tk.Canvas(
2438-
self.frame, height=self.height, width=width,
2439-
bg="lightgray", cursor="hand2")
2440-
cv.pack(side=tk.LEFT)
2461+
self.frame, height=self.height, width=width, bg=GRAY,
2462+
cursor="hand2", relief=tk.RAISED, bd=2)
24412463
cv.title = ""
2442-
cv.bind("<Button-1>", lambda e: self.clicked_cv(cv))
2464+
cv.bind("<Button-1>", lambda e: self.clicked_left(cv))
2465+
cv.bind("<ButtonRelease-1>", lambda e: self.release_left(cv))
2466+
cv.bind(
2467+
"<B1-Motion>", lambda e: self.drag_move(e, cv, self.drag_point))
24432468
cv.tag_bind(
24442469
"close", "<Button-1>", lambda e: self.clicked_close(cv))
24452470
self.tabs[cv] = frame
2471+
self.redraw()
2472+
2473+
def drag_move(self, event: tk.Event, cv, point):
2474+
if self.drag_point != point:
2475+
return
2476+
self.drag_point += 1
2477+
width = self.font.measure(cv.title+"×")+self.margin*3
2478+
index = tuple(self.tabs.keys()).index(cv)
2479+
if index != 0:
2480+
pre = tuple(self.tabs.keys())[index - 1]
2481+
pwidth = self.font.measure(pre.title+"×")+self.margin*3
2482+
if -pwidth > event.x:
2483+
self.move_to(index, index - 1)
2484+
if index != len(self.tabs.keys()) - 1:
2485+
nex = tuple(self.tabs.keys())[index + 1]
2486+
nwidth = self.font.measure(nex.title+"×")+self.margin*3
2487+
if width + nwidth < event.x:
2488+
self.move_to(index, index + 1)
2489+
self.redraw()
2490+
2491+
def move_to(self, from_index, to_index):
2492+
keys = list(self.tabs.keys())
2493+
values = list(self.tabs.values())
2494+
key = keys.pop(from_index)
2495+
value = values.pop(from_index)
2496+
tab = self.et.tabs.pop(from_index)
2497+
if from_index < to_index:
2498+
keys.insert(to_index, key)
2499+
values.insert(to_index, value)
2500+
self.et.tabs.insert(to_index, tab)
2501+
else:
2502+
keys.insert(to_index, key)
2503+
values.insert(to_index, value)
2504+
self.et.tabs.insert(to_index, tab)
2505+
self.tabs = {k: v for k, v in zip(keys, values)}
24462506

24472507
def go_left(self, event):
24482508
index = self.get_selected()
@@ -2454,10 +2514,17 @@ def go_right(self, event):
24542514
if index != len(self.tabs) - 1:
24552515
self.select(index+1)
24562516

2457-
def clicked_cv(self, cv):
2517+
def clicked_left(self, cv):
2518+
if SYSTEM == "Windows":
2519+
cv.config(cursor="sb_h_double_arrow")
2520+
cv.config(relief=tk.SUNKEN)
24582521
index = tuple(self.tabs.keys()).index(cv)
24592522
self.select(index)
24602523

2524+
def release_left(self, cv):
2525+
cv.config(cursor="hand2")
2526+
cv.config(relief=tk.RAISED)
2527+
24612528
def clicked_close(self, cv):
24622529
index = tuple(self.tabs.keys()).index(cv)
24632530
self.et.tabs[index].close_tab()
@@ -2472,14 +2539,19 @@ def index(self, frame):
24722539

24732540
def redraw(self):
24742541
index = self.get_selected()
2542+
for cv in self.tabs.keys():
2543+
cv.pack_forget()
24752544
for num, cv in enumerate(self.tabs.keys()):
24762545
if num == index:
24772546
cv.config(bg="white")
24782547
self.tabs[cv].pack(side=tk.TOP)
24792548
else:
2480-
cv.config(bg="lightgray")
2481-
self.tabs[cv].forget()
2549+
cv.config(bg=GRAY)
2550+
self.tabs[cv].pack_forget()
2551+
cv.pack(side=tk.LEFT)
24822552
self.draw_close(num)
2553+
self.plus.pack_forget()
2554+
self.plus.pack(side=tk.LEFT, anchor=tk.CENTER)
24832555

24842556
def get_selected(self):
24852557
if self.selected is None:
@@ -2496,7 +2568,7 @@ def forget(self, index):
24962568
self.select(1)
24972569
else:
24982570
self.select(index-1)
2499-
self.tabs[cv].forget()
2571+
self.tabs[cv].pack_forget()
25002572
cv.destroy()
25012573
self.tabs.pop(cv)
25022574

@@ -2505,19 +2577,15 @@ def draw_close(self, index):
25052577
cv.delete("close")
25062578
twidth = self.font.measure(cv.title)
25072579
cwidth = self.font.measure("×")
2508-
bg = "white" if index == self.get_selected() else "lightgray"
2509-
cv.create_polygon(
2580+
bg = "white" if index == self.get_selected() else GRAY
2581+
cv.create_rectangle(
25102582
twidth+int(self.margin*1.5)+cwidth//2,
2511-
(self.height-self.margin)//2,
2583+
(self.height-self.margin)//2+self.adjust,
25122584
twidth+cwidth+int(self.margin*2.5)-cwidth//2,
2513-
(self.height-self.margin)//2,
2514-
twidth+cwidth+int(self.margin*2.5)-cwidth//2,
2515-
(self.height+self.margin)//2,
2516-
twidth+int(self.margin*1.5)+cwidth//2,
2517-
(self.height+self.margin)//2,
2518-
fill=bg, tag="close")
2585+
(self.height+self.margin)//2+self.adjust,
2586+
fill=bg, outline=bg, tag="close")
25192587
cv.create_text(
2520-
twidth+self.margin*2+cwidth//2, self.height//2,
2588+
twidth+self.margin*2+cwidth//2, self.height//2+self.adjust,
25212589
text="×", font=self.font, fill="red", tag="close")
25222590

25232591
def set_title(self, index, title):
@@ -2528,7 +2596,7 @@ def set_title(self, index, title):
25282596
cv.config(width=twidth+cwidth+self.margin*3)
25292597
cv.delete("title")
25302598
cv.create_text(
2531-
twidth//2+self.margin, self.height//2,
2599+
twidth//2+self.margin, self.height//2+self.adjust,
25322600
text=title, font=self.font, tag="title")
25332601
self.draw_close(index)
25342602

0 commit comments

Comments
 (0)