2016-02-28 135 views
2

我正在尝试使用tkinter小部件制作可滚动的文本。我希望滚动条仅在需要时出现(当我的文本小部件的一部分不可见时)。
我的程序会搜索每一个输入,如果是这样的话,如果它是滚动条出现,如果它不是。
它第一次运行良好,但如果我删除一些文本(所以滚动条消失),然后写一些,滚动条出现,但没有滑块!Python Tkinter Scrollable Text,滑块不出现

#-*-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) 

First trial

Second trial

我仍然不知道为什么它没有工作,但通过它的工作原理.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

你确定这是你的真实密码吗? “行”,“列”和“粘性”不是'pack'的有效选项。 –

+0

事实上,这是因为我尝试与网格,我忘记改变。它已完成并更新了正确的代码 –

+0

您的绑定在插入新角色之前发生,因此它总会滞后一点。如果你在''而不是''上绑定,它会更好吗? –

回答

1

我终于找到了解决方案。我使用.grid而不是.pack。 它不仅解决了问题,而且还处理起来更好!