방법은 캔버스에 스도쿠의 백 트랙킹 솔루션의 진화를 보여주기위한 것입니다.Python tkinter - 루프에서 캔버스에 텍스트를 반복적으로 만들지 못했습니다.
findAnswer() 함수self.original 및 역행 모든 반복 구성 self.btSolution에 9x9의리스트 목록에 스도쿠의 원래의 레이아웃을 가진 9x9의 목록을 반환 해결책.
문제는 모든 반복을 캔버스에 표시하는 대신 모든 것을 반복하고 마지막 만 보여주는 것입니다. 내가 디버그하고 self.board.create_text() 실제로 때마다 올바른 매개 변수와 함께 호출되고 있지만 마지막 호출에서 캔버스에 번호를 보여줍니다 체크.
def create_gif(self):
self.original, self.btSolution = findAnswer(self.sudoku, gif=1)
for sudoku in self.btSolution:
time.sleep(0.1)
self.board.delete("gifNumbers")
for row in range(9):
for col in range(9):
if sudoku[row][col] != 0:
x = row * CELL + 0.5 * CELL
y = col * CELL + 0.5 * CELL
color = "red" if sudoku[row][col] == self.original[row][col] else "black"
self.board.create_text(x, y, text=sudoku[row][col], fill=color, tags="gifNumbers")
Tkinter는'time.sleep'과 잘 일치하지 않습니다. 일반적으로, Tkinter 창은 함수 실행이 끝나고 컨트롤이 메인 루프로 돌아 오기 전까지 새로운 내용으로 업데이트되지 않습니다. 따라서'self.btSolution'에 백개의 항목이 있고 각 항목 사이에 0.1 초 동안 잠자기했다면 창은 10 초 동안 완전히 멈추고 마침내 마지막으로 만들어진 항목을 표시합니다. 주기적으로 업데이트 동작을 얻으려면'root.after' 또는'root.after_idle'을 사용해야합니다. – Kevin
이것은 무엇이 진행되고 있는지 완벽하게 설명합니다. 제안 된 대안을 살펴 보겠습니다. 고마워요! – Victor
같은 문제가'root.after'에서 일어나는 것처럼 보입니다. 어떤 새로운 제안? 이 같은 루프를 호출하는 임 : 'for sudoku in self.btSolution : root.after (100, self.plotBTSolution (sudoku)) ' – Victor