【发布时间】:2014-02-02 04:51:36
【问题描述】:
对这个问题使用 Python 3.3 平台无关。
对于Entry 小部件,您可以像这样将变量绑定到该小部件的文本内容(注意Entry 构造函数中的textvariable 参数):
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
但是对于Text 小部件,没有这样的变量绑定功能。如果有兴趣,对于 Windows 版本中的 Python 3.3,Text 类的定义可能应该从 %python dir%/Lib/tkinter/__init__.py 中的第 2927 行开始。
如何使用Text 小部件最好地模拟此变量绑定功能?我的想法是将tkinter.StringVar 绑定到Text 小部件,然后获取/设置所有文本。
更新:
我最终继承了 tkinter.Frame 作为 Text 包装器,它接收 textvariable 构造函数参数,预期作为 tkinter.Variable 实例。在下面的示例中,我没有从 Text 继承的唯一原因是因为我也想要一个滚动条,但这并不重要。
以下是我的实验代码。为了与我最初的问题以及问题是如何解决的(?)完全相关,重要的几行是self.textvariable.get = self.GetText 和self.textvariable.set = self.SetText。基本上,我将传入的 tkinter.Variable 对象的 get 和 set 方法覆盖到我自己的设备上......
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() )
旁注:很明显,我来自基于间距的不同语言。对不起,我无能为力。
我想我回答了我自己的问题。这是否是正确的做法来覆盖传递给我的函数的tkinter.Variable 对象的已知方法,就像我刚才所做的那样,这是一个单独的问题,我必须提出/研究,即使这是一段私人代码永远不会在我的应用程序之外使用。我承认这确实引出了一个问题,这是否是一个有效的解决方案。
【问题讨论】:
标签: python python-3.x tkinter