2017-01-06 2 views
1

Ich lerne Tkinter durch die Erstellung einer GUI für ein Sudoku-Solver-Programm (das war bereits gebaut).Python Tkinter - Update während funtion in laufenden

Auf Knopfdruck läuft der Algorithmus, der das Sudoku löst und manchmal braucht es etwas Zeit.

Wie kann ich das Sudoku auf dem Bildschirm aktualisieren, wenn die Funktion aufgerufen wird, damit Benutzer sehen können, wie es läuft?

Ich arbeite mit einem GUI-Skript getrennt von der Sudoku, ist es richtig, in Design-Begriffe, die GUI und die Logik getrennt zu haben?

Vielen Dank im Voraus

EDIT

Dies ist mein Code:

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

"ist es richtig, in Design-Begriffe, die GUI und die Logik getrennt zu haben?" Es ist nicht nur richtig, es ist auch die beste Vorgehensweise. Du machst das Richtige, vor allem aus pythonischer Sicht, die dazu tendiert, alles modular zu machen. –

+0

Ich stimme zu, dass es eine sehr gute Idee ist, den GUI-Code und die Sudoku-Lösungslogik getrennt zu halten. Ich schlage jedoch vor, dass Sie nach einem effizienteren Sudoku-Solver suchen. Der, den du benutzt, sieht aus wie eine sehr primitive Brute-Force-Suche, weshalb er so langsam sein kann. Bitte sieh [diese Seite] (http://www.cs.mcgill.ca/~aassaf9/python/algorithm_x.html) von Ali Assaf, was ein kurzer Artikel über Exact Cover-Probleme ist und wie Knuths Algorithmus X verwendet werden kann Löse sie. Diese Seite enthält einen Link zu einem von Ali geschriebenen Python 3 Sudoku Solver, der die Lösung in weniger als einer Sekunde finden wird. –

Antwort

0

Ich denke, Sie müssen eine Schleife verwenden, die das Sudoku löst. Wenn dies gelten:

Der Ort, wo Sie Ihre Funktion/Befehl für die Taste definiert ist, der folgende Code am Anfang des Primärkreislaufes, die die sudoku löst (vorausgesetzt Wurzel ist Ihr tkinter Fenster):

Als solche ist eine solche Methode nicht vollständig threadsafe, sollte aber das Problem für allgemeine Fälle wie Ihres lösen.

Die Trennung von GUI und Logik ist die beste Vorgehensweise.

+0

Das Problem ist, dass ich die GUI getrennt von der Logik der Programme habe, so dass Root nicht in der Funktion definiert ist, die das Sudoku löst. – JuanLanuza

+0

Ist Ihr gesamter Code im gleichen Programm, wenn ja, definieren Sie root am Anfang Ihres Programms (dh vor allen Funktionen) root = Tk(), es muss funktionieren, da root alle Eigenschaften und Module in Ihrer GUI umfasst. – sjboss

+0

Wahrscheinlich können Sie einen anderen Parameter (der ein Fensterobjekt annimmt) in Ihrem Konstruktor/instanziation der Klasse Sudoku hinzufügen. Übergeben Sie dann das root-Objekt an das erstellte Sudoku-Objekt: Sudoku (root) in GUI.py – sjboss