1
-
1
+
2
2
# ©2020-2021 Ryo Fujinami.
3
3
4
4
import atexit
@@ -88,6 +88,7 @@ def EXPAND(num):
88
88
FONT_TYPE2 = "Times New Roman"
89
89
90
90
CURSOR = "arrow"
91
+ GRAY = "#CDCDCD"
91
92
92
93
os .chdir (os .path .dirname (sys .argv [0 ]))
93
94
@@ -174,6 +175,7 @@ def EXPAND(num):
174
175
FONT_TYPE2 = "Times"
175
176
176
177
CURSOR = "left_ptr"
178
+ GRAY = "#BDBDBD"
177
179
178
180
os .chdir (os .getcwd ())
179
181
@@ -250,7 +252,7 @@ def EXPAND(num):
250
252
251
253
FONT = (FONT_TYPE1 , EXPAND (12 ), "bold" )
252
254
253
- __version__ = (5 , 14 , "0a1 " )
255
+ __version__ = (5 , 14 , "0a2 " )
254
256
255
257
256
258
class EasyTurtle :
@@ -1089,12 +1091,13 @@ def setup(self):
1089
1091
# 背景のキャンバス
1090
1092
cv = tk .Canvas (ROOT , width = MIN_WIDTH , height = MIN_HEIGHT )
1091
1093
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" ))
1095
1098
cv .create_polygon (* self .get_shape (
1096
1099
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" )
1098
1101
1099
1102
# 背景の右下
1100
1103
frame = tk .Frame (ROOT )
@@ -2267,9 +2270,9 @@ def setup(self):
2267
2270
class ToggleButton (tk .Canvas ):
2268
2271
def __init__ (
2269
2272
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 ):
2273
2276
2274
2277
self .foreground = fg
2275
2278
self .background1 = bg1
@@ -2286,8 +2289,12 @@ def __init__(
2286
2289
self .cvh = (radius * 2 if radius * 2 > height else height )+ self .margin * 2
2287
2290
self .cvw = self .cvh + width
2288
2291
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 )
2291
2298
2292
2299
self .redraw_background ()
2293
2300
@@ -2411,38 +2418,91 @@ def get(self):
2411
2418
2412
2419
class Notebook (tk .Canvas ):
2413
2420
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" )):
2416
2424
2417
2425
self .et = parent
2418
2426
2419
2427
self .height = height
2420
2428
self .margin = margin
2421
2429
self .font = tkFont .Font (font = font )
2430
+
2422
2431
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 )
2424
2435
2425
2436
self .tabs : dict [tk .Canvas , tk .Frame ] = {}
2426
2437
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 )
2428
2442
2429
- self .frame = tk .Canvas (self , takefocus = True , height = height )
2443
+ self .frame = tk .Frame (self , takefocus = True , height = height )
2430
2444
self .frame .pack (side = tk .TOP , anchor = tk .NW )
2431
2445
2432
2446
self .frame .bind ("<Left>" , self .go_left )
2433
2447
self .frame .bind ("<Right>" , self .go_right )
2434
2448
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
+
2435
2458
def add_tab (self , frame ):
2436
- width = self .font .measure (" ×" ) + self .margin * 2
2459
+ width = self .font .measure ("×" ) + self .margin * 3
2437
2460
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 )
2441
2463
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 ))
2443
2468
cv .tag_bind (
2444
2469
"close" , "<Button-1>" , lambda e : self .clicked_close (cv ))
2445
2470
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 )}
2446
2506
2447
2507
def go_left (self , event ):
2448
2508
index = self .get_selected ()
@@ -2454,10 +2514,17 @@ def go_right(self, event):
2454
2514
if index != len (self .tabs ) - 1 :
2455
2515
self .select (index + 1 )
2456
2516
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 )
2458
2521
index = tuple (self .tabs .keys ()).index (cv )
2459
2522
self .select (index )
2460
2523
2524
+ def release_left (self , cv ):
2525
+ cv .config (cursor = "hand2" )
2526
+ cv .config (relief = tk .RAISED )
2527
+
2461
2528
def clicked_close (self , cv ):
2462
2529
index = tuple (self .tabs .keys ()).index (cv )
2463
2530
self .et .tabs [index ].close_tab ()
@@ -2472,14 +2539,19 @@ def index(self, frame):
2472
2539
2473
2540
def redraw (self ):
2474
2541
index = self .get_selected ()
2542
+ for cv in self .tabs .keys ():
2543
+ cv .pack_forget ()
2475
2544
for num , cv in enumerate (self .tabs .keys ()):
2476
2545
if num == index :
2477
2546
cv .config (bg = "white" )
2478
2547
self .tabs [cv ].pack (side = tk .TOP )
2479
2548
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 )
2482
2552
self .draw_close (num )
2553
+ self .plus .pack_forget ()
2554
+ self .plus .pack (side = tk .LEFT , anchor = tk .CENTER )
2483
2555
2484
2556
def get_selected (self ):
2485
2557
if self .selected is None :
@@ -2496,7 +2568,7 @@ def forget(self, index):
2496
2568
self .select (1 )
2497
2569
else :
2498
2570
self .select (index - 1 )
2499
- self .tabs [cv ].forget ()
2571
+ self .tabs [cv ].pack_forget ()
2500
2572
cv .destroy ()
2501
2573
self .tabs .pop (cv )
2502
2574
@@ -2505,19 +2577,15 @@ def draw_close(self, index):
2505
2577
cv .delete ("close" )
2506
2578
twidth = self .font .measure (cv .title )
2507
2579
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 (
2510
2582
twidth + int (self .margin * 1.5 )+ cwidth // 2 ,
2511
- (self .height - self .margin )// 2 ,
2583
+ (self .height - self .margin )// 2 + self . adjust ,
2512
2584
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" )
2519
2587
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 ,
2521
2589
text = "×" , font = self .font , fill = "red" , tag = "close" )
2522
2590
2523
2591
def set_title (self , index , title ):
@@ -2528,7 +2596,7 @@ def set_title(self, index, title):
2528
2596
cv .config (width = twidth + cwidth + self .margin * 3 )
2529
2597
cv .delete ("title" )
2530
2598
cv .create_text (
2531
- twidth // 2 + self .margin , self .height // 2 ,
2599
+ twidth // 2 + self .margin , self .height // 2 + self . adjust ,
2532
2600
text = title , font = self .font , tag = "title" )
2533
2601
self .draw_close (index )
2534
2602
0 commit comments