Как работает stringvar с textvariable? - PullRequest
       13

Как работает stringvar с textvariable?

0 голосов
/ 23 сентября 2019

Я пишу шахматную программу и не могу получить куски для вывода, так как я изменил текст с определения переменной text на text, и теперь я не могу заставить работать строку для вывода фигур.Я определяю кнопки в цикле for, и он ничего не выводит в квадратах.Код

def drawboard(self):

        x=0
        y=0
        for column in range(self.n):
            self.changecolours()
            x=x+1
            y=0
            for row in range(self.n):
                y=y+1
                colour = self.colours[self.colourindex]
                pos=(x,9-y)
                buttons=(tk.Button(self.boardframe, padx=10,  textvariable=lambda position=pos: self.placepieces(position), borderwidth=0, bg=colour,  relief="solid", font=self.piecefont, command=lambda position=pos: self.movepiece(position)  ))
                buttons.grid(column=(x-1), row=(y-1), sticky="W"+"E"+"N"+"S" )
                self.changecolours()
    @classmethod
    def placepieces(cls, position):
        black=Black()
        white=White()
        squareposition=position
        icon=tk.Stringvar("")
        if squareposition in white.position.values():
            for key in white.position:
                value=white.position.get(key)
                if value==squareposition:
                    if key.endswith("pawn"):
                        icon.set(white.pawntype[key])
                    elif key=="king":
                        icon.set(white.PIECES.get("KING"))
                    elif key=="queen":
                        icon.set(white.PIECES.get("QUEEN"))
                    elif key.endswith("bishop"):
                        icon.set(white.PIECES.get("BISHOP"))
                    elif key.endswith("knight"):
                        icon.set(white.PIECES.get("KNIGHT"))
                    else:
                        icon.set(white.PIECES.get("ROOK"))


                else:
                    pass
        elif squareposition in black.position.values():
            for key in black.position:
                value=black.position.get(key)
                if value==squareposition:
                    if key.endswith("pawn"):
                        icon.set(black.pawntype.get(key))
                    elif key=="king":
                        icon.set(black.PIECES.get("KING"))
                    elif key=="queen":
                        icon.set(black.PIECES.get("QUEEN"))
                    elif key.endswith("bishop"):
                        icon.set(black.PIECES.get("BISHOP"))
                    elif key.endswith("knight"):
                        icon.set(black.PIECES.get("KNIGHT"))
                    else:
                        icon.set(black.PIECES.get("ROOK"))                 
                    break

                else:
                    pass
        else:
            icon.set("")
        return icon

1 Ответ

1 голос
/ 23 сентября 2019

Как работает stringvar с textvariable?

В случае Button вы можете настроить отображение текста одним из двух способов: с жестко закодированной строкой (например: text='click me') или с атрибутом textvariable.

Атрибут textvariable должен быть установлен для экземпляра одного из специальных объектов переменных tkinter StringVar, IntVar, DoubleVar или BooleanVar (например: var=tk.StringVar(); Button(..., textvariable=var)).При настройке с экземпляром одной из этих переменных текст на кнопке будет отображать любое значение переменной.

Внутренне, когда вы задаете textvariable, tkinter будет принимать строковое представление этоговозьмите объект и создайте переменную tcl во встроенном интерпретаторе.Таким образом, хотя он может принять стандартную переменную, команду или даже лямбду, в конечном итоге он создает внутреннюю переменную tcl с этим именем и связывает эту внутреннюю переменную с нижележащим виджетом tcl.Если вы не используете одну из специальных переменных, вам будет трудно получить или установить значение этой переменной.

Например, рассмотрите следующий набор команд:

var = tk.StringVar(value="hello")
tk.Button(root, textvariable=var)

Когда этот код выполняется, текст, который появляется на кнопке, будет hello.Если вы измените переменную в любое время (например: var.set("goodbye")), кнопка автоматически изменится, чтобы показать новое значение.

...