2017-01-06 30 views
1

私はTkinterを学んでいます。Python Tkinter - 実行中に更新中

ボタンをクリックすると、sudokuを解決するアルゴリズムが実行され、時には時間がかかることがあります。

関数が呼び出されたときに画面上のスクロールを更新すると、ユーザーはその実行方法を確認できますか?

私はsudokuとは別のguiスクリプトで作業していますが、設計上、guiとロジックを分離するのは正しいですか?事前に

感謝

EDIT

これは私のコードです:

Sudoku.py

class Sudoku(object): 
    def __init__(self): 
     self.__matrix = [[(0, Status.Guess) for x in range(9)] for y in range(9)] 
    ... 
    def solveSudoku(self): 
     ... 

GUI.py

class App: 

    def __init__(self, master, su): 
     self.__sudoku__ = su 
     self.__root__ = master 
     self.__entries__ = {} 
     fsudoku = Frame(master) 
     fsudoku.grid(row=0) 
     self.displaysudoku(fsudoku) """grid of entrys""" 
     tButton = Button(master,text="Solve", command=self.SolveAndDisplay) 
     ... 

    def refreshSudokuGrid(self): 
     """USED AFTER SOLVING A SUDOKU""" 
     for i in range(1,10): 
      for j in range(1,10): 
       val = self.__sudoku__.value(i,j) 
       self.__entries__[i * 10 +j].delete(0, END) 
       if (val!= 0): 
        self.__entries__[i * 10 + j].insert(0, val) 
    def SolveAndDisplay(self): 
     self.scanSudoku() 
     self.__sudoku__.solveSudoku() 
     self.refreshSudokuGrid() 
    ... 

root = Tk() 
su = Sudoku() 
s = App(root, su) 
root.mainloop() 
+1

"設計上、guiとロジックを分離するのは正しいですか?"それだけでなく、ベストプラクティスです。あなたは、特にPythonicの観点から、すべてをモジュール化する傾向がある、正しいことをやっています。 –

+0

私は、GUIコードと数独解決ロジックを分離しておくことが大変良い考えであることに同意します。しかし、より効率的な数独ソルバーを探すことをお勧めします。あなたが使用しているものは非常に原始的なブルートフォース検索のように見えます。 Ali Assafの[このページ](http://www.cs.mcgill.ca/~aassaf9/python/algorithm_x.html)を参照してください。これはExact Coverの問題とKnuthのアルゴリズムXをどのように使用できるかについての短い記事ですそれらを解決する。このページには、Aliによって書かれたPython 3 Sudokuソルバーへのリンクが含まれています。 –

答えて

0

私はあなたがsudokuを解決するいくつかのループを使用している必要がありますね。 これは本当の場合:

あなたのボタンのあなたの関数/コマンドが定義されている場所、数独を解く次ループの先頭に 場所次のコードを(根と仮定すると、あなたのTkinterのウィンドウです):

root.update() 

このように、完全にスレッドセーフではありませんが、あなたのような一般的なケースではこの問題を解決する必要があります。

GUIとロジックを別々にするのがベストプラクティスです。

+0

問題は、プログラムのロジックとは別にGUIがあるため、ルートが定義されていないためです。 – JuanLanuza

+0

すべてのコードは同じプログラム内にあります(はい、プログラムの先頭(つまりすべての関数の前)にrootを定義していれば、ルートはGUIのすべてのプロパティとモジュールを包含しているので動作するはずです。 – sjboss

+0

恐らく、あなたは、Sudokuクラスのコンストラクタ/インスタンスで別のパラメータ(ウィンドウオブジェクトを取ります)を追加することができます。次に作成されたSudokuオブジェクトにルートオブジェクトを渡します.Sudoku(root)はGUI.py – sjboss

関連する問題