我试图使用tkinter小部件制作可滚动的文本。我希望滚动条仅在我需要时显示(当我的文本小部件的一部分无法显示时)。
如果是的话,我的程序会搜索每个输入的内容,如果是滚动条,则显示滚动条,如果不是,则不会。
它第一次运行良好,但如果我删除一些文本(所以滚动条消失),然后写一些,滚动条出现但没有滑块!
#-*-coding:latin-1-*
from tkinter import *
class TextScrollbar(Frame):
"""
A Text widget which can be scrolled.
Text widget with a scrollbar appearing only when you need it
(when there is text that you can see)
Use self.Text to acccess to your Text widget
"""
def __init__( self, master=None, cnf={}, **kw ):
#Creat a Frame which will contain the Text and the Scrollbar widget
Frame.__init__( self, master=None, cnf={}, **kw )
#Creat Scrollbar widget
self.ScrollBar=Scrollbar( self, orient='vertical' )
#Creat Text widget
self.Text=Text(self, cnf={}, **kw)
#Link between Text and Scrollbar widgets
self.Text.config( yscrollcommand=self.ScrollBar.set )
self.ScrollBar.config( command=self.Text.yview )
#Distribution of the Text widget in the frame
self.Text.pack( side='left', fill=BOTH, expand=1 )
def _typing(event):
"""Check whether you need a scrollbar or not"""
if Text.ScrollBar.get()==(0.0, 1.0):
self.ScrollBar.pack_forget()
else:
self.ScrollBar.pack( side='right', fill=Y, expand=1 )
self.Text.bind('<Key>',_typing)
root=Tk()
Text=TextScrollbar(root)
Text.pack(fill=BOTH, expand=1)
我仍然不知道它为什么不起作用,但用.grid方法替换.pack方法可以使用,这里代码更新了
#-*-coding:latin-1-*
from tkinter import *
class TextScrollbar(Frame):
"""
A Text widget which can be scrolled.
Text widget with a scrollbar appearing only when you need it
(when there is text that you can see)
Use self.Text to acccess to your Text widget
"""
def __init__( self, master=None, cnf={}, **kw ):
#Creat a Frame which will contain the Text and the Scrollbar widget
Frame.__init__( self, master=None, cnf={}, **kw )
self.grid_columnconfigure( 0, weight=1 )
self.grid_rowconfigure( 0, weight=1 )
#Creat Scrollbar widget
self.Scrollbar=Scrollbar( self, orient='vertical' )
#Creat Text widget
self.Text=Text( self, cnf={}, **kw )
#Link between Text and Scrollbar widgets
self.Text.config( yscrollcommand=self.Scrollbar.set )
self.Scrollbar.config( command=self.Text.yview )
#Distribution of the Text widget in the frame
self.Text.grid( row=0, column=0, sticky=N+S+E+W )
def TypingAndResizing(event):
"""Check whether you need a scrollbar or not"""
if Text.Scrollbar.get()==(0.0, 1.0):
self.Scrollbar.grid_forget()
else:
self.Scrollbar.grid( row=0, column=1, sticky=S+N )
self.Text.bind( '<KeyRelease>', TypingAndResizing )
self.Text.bind( '<Configure>', TypingAndResizing )
root=Tk()
Text=TextScrollbar(root)
Text.pack(fill=BOTH, expand=1)
答案 0 :(得分:1)
我终于找到了解决方案。而不是.pack我使用.grid。 它不仅解决了问题,而且处理升级也更好!