代码之家  ›  专栏  ›  技术社区  ›  Captain'Flam

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

  •  -2
  • Captain'Flam  · 技术社区  · 7 年前

    我正在尝试使用TkInter的文本小部件编写一个简单的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中的一个bug吗?

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

    提前感谢您的时间。

    哈德里安

    1 回复  |  直到 7 年前
        1
  •  1
  •   Nae    7 年前

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

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