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.
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.