Re: tkinter frame neu zeichnen

Fragen zu Tkinter.
Antworten
Back2basic
User
Beiträge: 23
Registriert: Montag 23. April 2012, 09:53

Leider hab ich vergessen auf mein vorgegangenen Post zu wenig über mein richtiges Problem zu erzählen.

Meine Frage ist, wie kann ich meine Entrys die alle in einem Grid liegen neu zeichnen lassen

(

Code: Alles auswählen


    def __init__(self):
        # object of tkinter frame... creates a new window
        self.window = Tk()
         # set title of window
        self.preGrid()
##        for i in range(9):
##            self.cells.append([]) # leeres array fuer zweidimensionales
##            for j in range(9):
##                val = self.m.getAttribut(i,j)
##                if (val <= 0):
##                    val = ""
##                else:
##                    val = str(val)
##                self.cells[i].append(StringVar(None, val))
        self.window.title("Sudoku")
        self.frame = Frame(self.window) # Hold entries
        self.frame.pack()
        self.m.prepareField()

        #         00  01  02 | 03  04  05 | 06  07  08
        # 2.      10  11  12 | 13  14  15 | 16  17  18
        # 3.      20  21  22 | 23  24  25 | 26  27  28

        # 4.      30  31  32 | 33  34  35 | 36  37  38
        # 5.      40  41  42 | 43  44  45 | 46  47  48
        # 6.      50  51  52 | 53  54  55 | 56  57  58

        # 7.      60  61  62 | 63  64  65 | 66  67  68
        # 8.      70  71  72 | 73  74  75 | 76  77  78
        # 9.      80  81  82 | 83  84  85 | 86  87  88
        for i in range(9):
            for j in range(9):
                if(i <=2):
                    if( j >= 3 and j <= 5):
                        Entry(self.frame, width = 2, justify = RIGHT,
                            textvariable = self.cells[i][j],bg="grey").grid(
                                row = i, column = j)
                    else:
                        Entry(self.frame, width = 2, justify = RIGHT,
                            textvariable = self.cells[i][j]).grid(
                                row = i, column = j)
                elif( i >=3 and i <=5):
                    if(j <=2 or j >=6):
                        Entry(self.frame, width = 2, justify = RIGHT,
                            textvariable = self.cells[i][j],bg="grey").grid(
                                row = i, column = j)
                    else:
                        Entry(self.frame, width = 2, justify = RIGHT,
                            textvariable = self.cells[i][j]).grid(
                                row = i, column = j)
                elif(i > 5):
                    if(j >=3 and j <=5):
                        Entry(self.frame, width = 2, justify = RIGHT,
                            textvariable = self.cells[i][j], bg ="grey").grid(
                                row = i, column = j)
                    else:
                       Entry(self.frame, width = 2, justify = RIGHT,
                            textvariable = self.cells[i][j]).grid(
                                row = i, column = j)

        Button(self.window, text = "validate").pack(side = LEFT)

        Button(self.window, text = "delete").pack(side = LEFT)

        Button(self.window, text = "new Game", command = self.printField).pack( side = LEFT)
        # create an event loop

        self.window.mainloop()

        def printField(self):

            self.preGrid()
            self.frame.update()
            pass
über einen Button Event).
BlackJack

@Back2basic: Die sollten automatisch neu gezeichnet werden wenn das nötig ist und Du nicht irgendwas machst was mit ereignisbasierter GUI-Programmierung nicht harmoniert. Also immer nur kurz etwas machen und die Kontrolle dann wieder an die GUI-Hauptschleife zurück geben. Das Du da einen `update()`-Aufruf hast lässt ahnen, dass Du da etwas grundsätzlich falsch angehst.
Back2basic
User
Beiträge: 23
Registriert: Montag 23. April 2012, 09:53

ich möchte ein sudoku Feld bauen und falls nötig das Feld neu generieren.

Das natürlich mit Hilfe eines Buttons...

Jemand eine Idee wie ich das am besten machen könnte?

mfg
BlackJack

@Back2basic: Was meinst Du denn mit das Feld neu generieren? Eigentlich musst Du es doch nur aktualisieren. Die Textvariablen hast Du ja in einer Datenstruktur. Wobei ich da wohl eher die `Entry`-Objekte genommen hätte, weil man dann auch Optionen davon ändern kann, wie die Hintergrundfarbe.

Man könnte das Sudoku-Feld, also die Anzeige, als eigenes Widget umsetzen.
Back2basic
User
Beiträge: 23
Registriert: Montag 23. April 2012, 09:53

Ganz genau, ich will nur die Entrys aktualisieren, aber tkinter ist mir recht neu und ich wollte es auf anhieb auch nicht so kompliziert gestalten.
Nur wie kann ich jetzt mein Entrys die alle im frame liegen aktualisieren??
Sirius3
User
Beiträge: 17778
Registriert: Sonntag 21. Oktober 2012, 17:20

@Back2basic: falls das bei BlackJacks Antwort nicht deutlich geworden ist: Du generierst nur einmal das Feld und änderst nur den Inhalt der Entrys bei Bedarf. Ein "self.frame.update()" ist dabei unnötig, da die Anzeige automatisch aktualisiert wird, wenn sich etwas am Inhalt ändert.
BlackJack

@Back2basic: Du hast doch die `cells`-Datenstruktur, das müssten doch irgendwelche `Tkinter.*Var`-Objekte sein, und die haben eine `set()`-Methode um den Inhalt neu zu setzen. Das musst Du machen.
Antworten