<p>使用Python3.3独立于平台解决此问题。</p>
<p>对于<code>Entry</code>小部件,您可以将变量绑定到此小部件的文本内容,如下所示(请注意<code>Entry</code>构造函数中的<code>textvariable</code>参数):</p>
<pre><code>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
</code></pre>
<p>但是,对于<code>Text</code>小部件,没有这样的变量绑定特性。类<code>Text</code>如果感兴趣的话,它的定义应该在Windows版本中python 3.3的%python dir%/Lib/tkinter/\uu init.py的第2927行开始。</p>
<p>如何用<code>Text</code>小部件最好地模拟这个变量绑定特性?我的想法是将一个<code>tkinter.StringVar</code>绑定到一个<code>Text</code>小部件,然后获取/设置所有文本。</p>
<h2><strong>更新:</strong></h2>
<p>最后,我继承了<code>tkinter.Frame</code>作为<code>Text</code>包装器,它接受了<code>textvariable</code>构造函数参数,该参数预期为<code>tkinter.Variable</code>实例。在下面的例子中,我没有继承<code>Text</code>的唯一原因是我也想要一个滚动条,但这并不重要。</p>
<p>下面是我的实验代码。与我最初的问题以及问题是如何解决的完全相关(?),重要的行是<code>self.textvariable.get = self.GetText</code>和<code>self.textvariable.set = self.SetText</code>。基本上,我正在重写传入的<code>tkinter.Variable</code>对象的get和set方法到我自己的设备。。。</p>
<pre><code>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() )
</code></pre>
<p>旁注:很明显,我来自不同的语言,基于间隔。对不起,我没办法。</p>
<p>我想我回答了我自己的问题。这是否是重写传入函数的<code>tkinter.Variable</code>对象的已知方法的正确方法,就像我刚才所做的那样,这是一个单独的问题,我将不得不询问/研究,即使这是一段私人代码,永远不会在我的应用程序外使用。我承认,这确实提出了一个问题,这是否是一个有效的解决办法。</p>