所以這是帶有回溯(使用遞回)的簡單數獨求解器。每次遞回后螢屏都會更新(以顯示更改),但在完全完成之前它不會顯示任何內容。問題出在哪里?另外,也許有更好的方法在每次更改后更新螢屏?
代碼:
'''
def update_numbers(self):
self.clear_widgets()
greeting = Label(text="Sudoku", pos=(self.width/2 - 70, 1200), size_hint=(0.2, 0.08))
self.add_widget(greeting)
v_x, v_y = 15, 955
for k, row in enumerate(board, start=1):
for k1, col in enumerate(row, start=1):
self.add_widget(Label(text=str(col), pos=(v_x, v_y), size_hint=(0.3, 0.3)))
v_x = 60
v_x = 15
v_y -= 60
def solve(self, bo):
self.update_numbers() # should update the screen
#everything further is solver itself
find = find_empty(bo)
if find:
row, col = find
else:
return True
for i in range(1, 10):
if valid(bo, (row, col), i):
bo[row][col] = i
if self.solve(bo):
return True
bo[row][col] = 0
return False
'''
編輯:在這里查看類似問題后:如何從執行緒更新 Kivy 元素?
我找到了解決此問題的方法:'''
def display_setup(self):
greeting = Label(text="Sudoku", pos=(self.width/2 - 70, 1200), size_hint=(0.2, 0.08))
self.add_widget(greeting)
v_x, v_y = 15, 955
for k, row in enumerate(board, start=1):
for k1, col in enumerate(row, start=1):
the_label = Label(text=str(col), pos=(v_x, v_y), size_hint=(0.3, 0.3))
self.labels.append(the_label)
self.add_widget(the_label)
v_x = 60
v_x = 15
v_y -= 60
@mainthread
def update_numbers(self, *dt):
for k, label in enumerate(self.labels):
row = k // 9
label.text = str(board[row][k % 9])
def solve(self, bo):
Clock.schedule_once(self.update_numbers, 0)
time.sleep(0.05)
.....
uj5u.com熱心網友回復:
如果您solve()在主執行緒上運行(就像它由按鈕觸發一樣),則在solve()方法回傳之前無法更新顯示。顯示只能在主執行緒上更新,并且只有在主執行緒可用時才能更新。
解決方法是solve()在另一個執行緒中啟動行程(參見threading),然后將該update_numbers()方法標記為mainthread方法:
@mainthread
def update_numbers(self):
這會導致該update_numbers()方法在主執行緒上運行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/400088.html
