tkinter.Text: vinculando uma variável ao conteúdo do texto do widget

Usando a plataforma Python 3.3 independente para esta pergunta.

Para oEntry widget, é possível vincular uma variável ao conteúdo de texto desse widget (observe otextvariable parâmetro emEntry construtor):

var = tkinter.StringVar()
entryField = tkinter.Entry(master, textvariable=var)
e.pack()

var.set("a new value") # entryField text now updated with this value
s = var.get() # whatever text now appears in entryField

Para oText widget, no entanto, não existe esse recurso de ligação variável. ClasseText a definição provavelmente deve começar na linha 2927 em% python dir% / Lib / tkinter / __ init__.py para Python 3.3 em versões do Windows, se estiver interessado.

Como posso emular melhor esse recurso de ligação variável com oText ferramenta? Minha idéia é vincular umtkinter.StringVar para umText widget e apenas obtenha / defina todo o texto.

Atualizar:

Acabei herdandotkinter.Frame como umText invólucro que leva em umtextvariable parâmetro construtor esperado como umtkinter.Variable instância. A única razão no meu exemplo abaixo, por que não herdei deText é só porque eu também queria uma barra de rolagem, mas isso não é importante.

O seguinte é o meu código experimental. Para uma relevância exata da minha pergunta original e como o problema foi resolvido (?), As linhas importantes sãoself.textvariable.get = self.GetText eself.textvariable.set = self.SetText. Basicamente, estou substituindo o pass-intkinter.Variable os métodos get e set do objeto para meus próprios dispositivos ...

class TextExtension( tkinter.Frame ):
    """Extends Frame.  Intended as a container for a Text field.  Better related data handling
    and has Y scrollbar now."""


    def __init__( self, master, textvariable = None, *args, **kwargs ):
        self.textvariable = textvariable
        if ( textvariable is not None ):
            if not ( isinstance( textvariable, tkinter.Variable ) ):
                raise TypeError( "tkinter.Variable type expected, {} given.".format( type( textvariable ) ) )
            self.textvariable.get = self.GetText
            self.textvariable.set = self.SetText

        # build
        self.YScrollbar = None
        self.Text = None

        super().__init__( master )

        self.YScrollbar = tkinter.Scrollbar( self, orient = tkinter.VERTICAL )

        self.Text = tkinter.Text( self, yscrollcommand = self.YScrollbar.set, *args, **kwargs )
        self.YScrollbar.config( command = self.Text.yview )
        self.YScrollbar.pack( side = tkinter.RIGHT, fill = tkinter.Y )

        self.Text.pack( side = tkinter.LEFT, fill = tkinter.BOTH, expand = 1 )


    def Clear( self ):
        self.Text.delete( 1.0, tkinter.END )


    def GetText( self ):
        text = self.Text.get( 1.0, tkinter.END )
        if ( text is not None ):
            text = text.strip()
        if ( text == "" ):
            text = None
        return text


    def SetText( self, value ):
        self.Clear()
        if ( value is not None ):
            self.Text.insert( tkinter.END, value.strip() )

Nota lateral: provavelmente é bastante óbvio que estou vindo de um idioma diferente com base no espaçamento. Sinto muito, não posso evitar.

Eu acho que respondi minha própria pergunta. Se é a coisa certa a fazer ou não para substituir os métodos conhecidos detkinter.Variable objetos passados para minhas funções como eu acabei de fazer é uma pergunta separada, que terei que fazer / pesquisar, mesmo que seja um código particular que nunca será usado fora do meu aplicativo. E reconheço que isso levanta a questão de saber se é uma solução eficaz.

questionAnswers(3)

yourAnswerToTheQuestion