From f974ac14df3b58379865f9abb8c962ff146b6efe Mon Sep 17 00:00:00 2001 From: Tom Wang Date: Sun, 26 Apr 2020 23:56:08 -0700 Subject: [PATCH] Update hanoi.py - bug fix, speed adjustment. --- hanoi.py | 65 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/hanoi.py b/hanoi.py index 772e8a3..2e57328 100644 --- a/hanoi.py +++ b/hanoi.py @@ -13,6 +13,7 @@ GAP = 2 CANVAS_W = 500 CANVAS_H = 400 gbl_speed = 0.001 # in seconds +gbl_step = 2 gbl_pegs = [] gbl_pegstate = [[], [], []] gbl_disks = [] @@ -24,13 +25,15 @@ gbl_ready = True def setup_gui(): global gbl_canvas - def get_ent(event): + def ent_return(event): + event.widget.tk_focusNext().focus() + + def get_ent_focus(event): global gbl_num_disks try: new_num = int(ent_disks.get()) gbl_num_disks = new_num - event.widget.tk_focusNext().focus() draw_init_setting() except Exception as err: ent_disks.delete(0, tk.END) @@ -43,40 +46,44 @@ def setup_gui(): tk.Label(tk_row, text="No. of Disks: ").pack(side=tk.LEFT) ent_disks = tk.Entry(tk_row, width=5) ent_disks.insert(0, str(gbl_num_disks)) - ent_disks.bind('', get_ent) - ent_disks.bind('', get_ent) + ent_disks.bind('', ent_return) + ent_disks.bind('', get_ent_focus) ent_disks.pack(side=tk.LEFT, padx=5) - btn_start = tk.Button(tk_row, text="Start", width=6) - btn_start.bind('', run_hanoi) + btn_start = tk.Button(tk_row, text="Start", width=6, command=run_hanoi) + # btn_start.bind('', run_hanoi) btn_start.pack(side=tk.LEFT, padx=5) - btn_reset = tk.Button(tk_row, text="Reset", width=6) - btn_reset.bind('', reset_hanoi) + btn_reset = tk.Button(tk_row, text="Reset", width=6, command=reset_hanoi) + # btn_reset.bind('', reset_hanoi) btn_reset.pack(side=tk.LEFT, padx=5) tk.Label(tk_row, text="Speed: ").pack(side=tk.LEFT) tk_var = tk.StringVar(gbl_tkroot) tk_var.set('normal') tk_opt_menu = tk.OptionMenu(tk_row, tk_var, *{'slow', 'normal', 'fastest'}) - tk_opt_menu.config(width = 6) + tk_opt_menu.config(width=6, takefocus=True) tk_opt_menu.pack(side=tk.LEFT) tk_row.pack(side=tk.TOP, pady=5) # animation canvas gbl_canvas = tk.Canvas(gbl_tkroot, width=CANVAS_W, height=CANVAS_H) gbl_canvas.pack() + btn_start.focus_set() def change_speed(*args): - global gbl_speed - speed_opt = {'slow': 0.002, 'normal': 0.001, 'fastest': 0} + global gbl_speed, gbl_step + speed_opt = {'slow': 0.001, 'normal': 0.001, 'fastest': 0} + step_opt = {'slow': 1, 'normal': 2, 'fastest': 1} gbl_speed = speed_opt.get(tk_var.get()) + gbl_step = step_opt.get(tk_var.get()) # print(gbl_speed) tk_var.trace('w', change_speed) -def run_hanoi(event): +def run_hanoi(): global gbl_ready + # t0 = time.time() if gbl_ready: gbl_ready = False try: @@ -85,9 +92,11 @@ def run_hanoi(event): print(f'forced reset: {repr(err)}') else: pass + # t1 = time.time() + # print(t1-t0) -def reset_hanoi(event): +def reset_hanoi(): draw_init_setting() @@ -133,6 +142,7 @@ def draw_init_setting(): gbl_ready = True + def move_disk(i, a, b): global gbl_pegstate, gbl_canvas disk_num = gbl_pegstate[a].pop() @@ -147,7 +157,7 @@ def move_disk(i, a, b): x1, y1, x2, y2 = gbl_canvas.bbox(disk) if y2 < py1: break - gbl_canvas.move(disk, 0, -1) + gbl_canvas.move(disk, 0, -gbl_step) gbl_tkroot.update_idletasks() gbl_tkroot.update() time.sleep(gbl_speed) @@ -155,18 +165,24 @@ def move_disk(i, a, b): # Move to peg b px1, py1, px2, py2 = gbl_canvas.bbox(gbl_pegs[b]) new_center = (px1 + px2) // 2 - while True: - x1, y1, x2, y2 = gbl_canvas.bbox(disk) - center = (x1 + x2) // 2 - if center == new_center: - break - if center > new_center: - gbl_canvas.move(disk, -1, 0) - else: - gbl_canvas.move(disk, 1, 0) + x1, y1, x2, y2 = gbl_canvas.bbox(disk) + center = (x1 + x2) // 2 + + while center < new_center: + gbl_canvas.move(disk, gbl_step, 0) gbl_tkroot.update_idletasks() gbl_tkroot.update() time.sleep(0.7*gbl_speed) # faster + x1, y1, x2, y2 = gbl_canvas.bbox(disk) + center = (x1 + x2) // 2 + + while center > new_center: + gbl_canvas.move(disk, -gbl_step, 0) + gbl_tkroot.update_idletasks() + gbl_tkroot.update() + time.sleep(0.7*gbl_speed) # faster + x1, y1, x2, y2 = gbl_canvas.bbox(disk) + center = (x1 + x2) // 2 # Drop down disk_h = y2 - y1 @@ -175,7 +191,7 @@ def move_disk(i, a, b): x1, y1, x2, y2 = gbl_canvas.bbox(disk) if y2 >= new_bottom: break - gbl_canvas.move(disk, 0, 1) + gbl_canvas.move(disk, 0, gbl_step) gbl_tkroot.update_idletasks() gbl_tkroot.update() time.sleep(gbl_speed) @@ -188,7 +204,6 @@ def hanoi(n, a, b, c): Hanoi algorithm: move n pieces from a to c, using b as buffer. For each move, call animate() to show the move ''' - if n < 0: return hanoi(n-1, a, c, b)