如何使用TkInter的文本小部件进行正确的滚动?

时间:2018-01-24 16:13:13

标签: python python-2.7 tkinter textbox

我正在尝试使用TkInter的Text小部件编写一个简单的GUI,当我在其中滚动时,我遇到了一个奇怪的行为。

当我到达文本的末尾时,有时候,我在窗口小部件的底部会出现一个空行(有时候没有)......

在这里你可以看到空白行: At the bottom : the blank line

而这一次,没有...... At the bottom : no blank line

或者我当然不希望看到这个空白行。

这是一个简单的代码片段,用于说明我的问题。使用它:使用向上/向下箭头,主页/结束/向上翻页/向下翻页键向上和向下滚动。 有一段时间,你应该看到空白行......

import sys,Tkinter

escape,up,down,home,end,pageup,pagedown = 27,38,40,36,35,33,34

class HText ( Tkinter.Text ):
    def __init__(self,parent,lines,w,h ):
        Tkinter.Text.__init__( self,parent )
        self.config( takefocus=True,width=w,height=h )
        self._len   = len( lines )
        self._index = 0
        self.config( state=Tkinter.NORMAL )
        for i,t in enumerate( lines ):
            self.insert( Tkinter.END,'%-4d : %s\n'%(i,t),'#%d'%i )
        self.focus( 1 )
    def focus (self,on):
        self.tag_config( '#%d'%self._index,background='#daf' if on else 'white' )
    def move (self,keycode):
        delta = { up:-1,down:+1,home:-self._len,end:self._len,pageup:-20,pagedown:+20 }.get( keycode,0 )
        index = max( 0,min( self._index+delta,self._len-1 ))
        if index != self._index :
            self.focus( 0 )
            self._index = index
            self.see( '#%d.first'%self._index )
            self.focus( 1 )

def Gui ( text ):
    self = Tkinter.Tk()
    self.bind('<Escape>',lambda e : self.quit())
    self.bind('<Key>'   ,lambda e : htext.move( e.keycode ))
    htext = HText( self,text.split('\n'),120,30 )
    htext.pack()
    self.mainloop()
    self.destroy()

Gui( open( sys.argv[0] ).read()*10 )

你看到我做错了吗? 这是TkInter中的错误吗?

顺便说一下,我在Windows 7 x64下使用python 2.7。

提前感谢您的时间。

Hadrien

1 个答案:

答案 0 :(得分:1)

完成字符串插入后,使用此行删除最后一个换行符:

htext.delete('end-1c', 'end')