Seite 1 von 1

Re: tkinter frame neu zeichnen

Verfasst: Donnerstag 9. Januar 2014, 13:00
von Back2basic
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).

Re: tkinter frame neu zeichnen

Verfasst: Donnerstag 9. Januar 2014, 13:47
von 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.

Re: tkinter frame neu zeichnen

Verfasst: Donnerstag 9. Januar 2014, 13:50
von Back2basic
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

Re: tkinter frame neu zeichnen

Verfasst: Donnerstag 9. Januar 2014, 14:04
von 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.

Re: tkinter frame neu zeichnen

Verfasst: Donnerstag 9. Januar 2014, 14:06
von Back2basic
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??

Re: tkinter frame neu zeichnen

Verfasst: Donnerstag 9. Januar 2014, 14:06
von Sirius3
@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.

Re: tkinter frame neu zeichnen

Verfasst: Donnerstag 9. Januar 2014, 14:56
von 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.