Как сделать паузу во время обратного вызова с использованием Python 3.6? - PullRequest
0 голосов
/ 07 сентября 2018

Я относительно новичок в python и программирую компьютерный плеер для Othello. Я использую метод обратного вызова, чтобы найти положение щелчка мыши на доске. Мне нужно быть в состоянии сделать паузу в середине обратного вызова, чтобы показывать ход игрока, а затем компьютер. Однако на данный момент оба хода происходят вместе, поэтому игрок не может видеть результат своего хода. Когда я попробовал метод time.sleep(), он просто отложил выполнение всего обратного вызова. Это упрощенная версия моего кода:

from tkinter import *
import time
root = Tk()
root.configure(background="black")
canvas=Canvas(root, bg = "black", height = 708, width = 1280)
def callback(event):
    if event.y < 350:
        canvas.create_rectangle(500,234,780,334,fill="#004800",width=0)
        time.sleep(2)
        canvas.create_rectangle(500,374,780,474,fill="#004800",width=0)
    else:
        canvas.create_rectangle(500,374,780,474,fill="#004800",width=0)
        time.sleep(2)
        canvas.create_rectangle(500,234,780,334,fill="#004800",width=0)

canvas.bind("<Button-1>", callback)
canvas.pack(fill=BOTH, expand=1, pady=0, padx=0)      
root.mainloop()

1 Ответ

0 голосов
/ 07 сентября 2018

Кажется, что оба хода происходят одновременно, потому что содержимое холста обновляется только после завершения time.sleep.Чтобы увидеть первый ход отдельно, нужно заставить холст обновиться до паузы с помощью root.update_idletasks().

Кстати, вам не нужно импортировать модуль time, чтобы сделать паузу, вы можетевместо этого используйте root.after(2000) (время указывается в мс).

from tkinter import *
root = Tk()
root.configure(background="black")
canvas = Canvas(root, bg = "black", height = 708, width = 1280)

def callback(event):
    if event.y < 350:
        canvas.create_rectangle(500,234,780,334,fill="red",width=0)
        root.update_idletasks()
        root.after(2000)
        canvas.create_rectangle(500,374,780,474,fill="#004800",width=0)
    else:
        canvas.create_rectangle(500,374,780,474,fill="red",width=0)
        root.update_idletasks()
        root.after(2000)
        canvas.create_rectangle(500,234,780,334,fill="#004800",width=0)

canvas.bind("<Button-1>", callback)
canvas.pack(fill=BOTH, expand=1, pady=0, padx=0)      
root.mainloop()
...