Redprince hat geschrieben:Code: Alles auswählen
class SudokuEntry(Entry):
def __init__(self, master, x=1, y=1):
Entry.__init__(self, master, width=3)
In der Regel erhält
master einen Defaultwert (
None), da man nicht zwingend das übergeordnete Widget angeben muss.
Änder ich sofort!
Redprince hat geschrieben:Code: Alles auswählen
if self.get() in ["1","2","3","4","5","6","7","8","9"]
Die Abfrage sieht hübsch aus, ist aber denkbar unperformant, da bei jedem Aufruf der Methode
abfragen() die Liste neu erstellt wird. Wesentlich schneller wäre also, die Liste
einmalig als Attribut zu setzen und dann darauf zuzugreifen.
Änder ich ebenfalls!
Redprince hat geschrieben:
Wenn Null für leer steht, solltest du auch die Zahl und nicht den String übergeben! (vgl. Z. 17)
Bei mir hat das Testen nicht funktioniert, weil die Funktion die Zahl zurückgab, der Testmechanismus aber geschaut hat, ob der String zurückgegeben wurde. Ich hab es in der Abfragen-Funktion geändert, aber wenn du willst, mach ich es andersrum.
Redprince hat geschrieben:
Zur besseren Lesbarkeit deines Codes solltest du vor und nach dem Gleichheitszeichen ein Leerzeichen einfügen, siehe
PEP-0008.
Da ist es wohl mal wieder mit mir durchgegangen, wird auch berichtigt!
Redprince hat geschrieben:Code: Alles auswählen
nummer=((j-1)%3)+(9*(((j+2)/3)+3*((i-1)/3)-1))+1+3*((i-1)%3)
Ich bin mir nicht sicher, was du mit dieser Zeile bezwecken willst, aber es gibt mit Sicherheit einen Weg, weniger kryptologisch und unleserlich zum Ziel zu kommen!
Aus i und j werden jeweils die Feldnummern berechnet, die in einer Zeile/Spalte/einem Block vorkommen. Die Formeln sind von meinem Vater (ich will ihm nicht die Schuld in die Schuhe schieben), aber ich habe selber eine Weile rumprobiert, ob man diese Formel nicht verkürzen könnte, aber glaub mir, Mathematik ist eines meiner Lieblingsfächer in der Schule und ich habe nichts* gefunden.
* Ich habe schon etwas gefunden, denn
3*((i-1)/3)
KÖNNTE man ja nach den Regeln der Mathematik extrem vereinfachen, da erst durch drei geteilt wird und dann mit drei multipliziert, aber schau dir das mal genau an... alle Teile der Formel sind Integer, also liefert Python bei Division auch nur Integer zurück, was diese Formel (anscheinend, mein Vater hat sie halt entwickelt, ich kann ihn ja mal fragen, was ihn zu sowas getrieben hat) ausnutzt.
Jedenfalls ließe sich das vielleicht auch mit Python-Code schreiben, aber ich bin mir sicher, dass DAS wirklich zu viele Zeilen wären.
Redprince hat geschrieben:Code: Alles auswählen
exec "self.neunerblock"+str(nummer)+\
"=SudokuFrame(self.sudokurahmen, relief=RIDGE, "+\
"borderwidth=3, x="+str(i)+", y="+str(j)+")"
Vergiss'
exec! Du wirst es in den nächsten Monaten garantiert nicht brauchen, versprochen! Erstelle doch einfach eine
Liste, in der du die einzelnen SudokuFrames speicherst, somit erleichterst du dir selbst den Zugriff und allgemein die Lesbarkeit deines Codes. Was du hier geschrieben hast, ist gelinde gesagt Schwachsinn.
EDIT:
Hab die Codestelle mit ner anderen verwechselt, bei der hier werde ich auf jeden Fall schaun, was ich machen kann!
Redprince hat geschrieben:
Hier liegt ein klassicher Fall für eine
for-Schleife vor, da die Schleife jedes immer exakt neun Mal durchlaufen wird.
Stimmt!
Redprince hat geschrieben:Code: Alles auswählen
Einzelzeile=[0] # Feld 1 der Zeile soll Index 1 haben
Einzelspalte=[0] # Feld 1 der Spalte soll Index 1 haben
Einzelblock=[0] # Feld 1 des Blocks soll Index 1 haben
Ich verstehe nicht, was du damit bezwecken willst. Wir Programmierer beginnen beim Zählen mit Null, warum erschwerst du dir selbst das Verständnis mit solchen Workarounds?
Sudoku ist ein reines Zahlenspiel (damit meine ich, dass alles, was der Spieler/der Nutzer des Programms nur Zahlen eingibt und [fast] alle Werte, mit denen das Script arbeitet, Zahlen sind). Daher werden im Lösungsmechanismus ziemlich oft Zahlen vorkkommen. Ziemlich Ziemlich oft. Es werden einmal solche Zahlen vorkommen, die in den Feldern eingetragen sind. Das sind Werte von 1 bis 9. Es werden aber auch Indizes vorkommen, die nnormalerweise bei 0 anfangen. Nun stell dir mal vor, du vergisst in einem Riesencode, der eine Riesenmenge an Zahlen beinhaltet, EIN- oder ZWEIMAL, für Feld x den richtigen Index x-1 zu verwenden und schreibst nur x.
Was passiert dann? In vielen Fällen wird das Programm trotzdfem laufen, aber ein falsches Ergebnis liefern, also hast du nichtmal ein Traceback mit Zeilenangabe. Das wird ein Gesuche...
Zusätzlich ist es intuitiver, wenn die erste Zeile
ist. Daher werde ich diesen Teil des Codes nicht ändern, 'tschuldigung...
Redprince hat geschrieben:Code: Alles auswählen
exec "testfeld=self.Zellen["+str(feld)+"][0].abfragen()"
Siehe oben! Vergiss
exec und greife über den schon vorliegenden Index einfach auf die Liste zu:
Das ist wirklich Blindheit gewesen
, hab den Fehler entdeckt, kurz bevor ich deinen Post gelesen hab