2016-02-28 3 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

Я до сих пор не знаю, почему он не работает, но заменяя .pack METHODE на .grid Methode он работает, вот код обновляется

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

Вы уверены, что это ваш настоящий код? 'row',' column' и 'sticky' не являются допустимыми параметрами для' pack'. –

+0

На самом деле это было потому, что я попытался с сеткой, и я забыл изменить. Это сделано, и правильный код обновлен. –

+0

Ваша привязка происходит до того, как новый символ вставлен, поэтому он будет немного отставать. Будет ли он работать лучше, если вы привяжетесь к '' вместо' '? –

ответ

1

Я, наконец, нашел решение. Вместо .pack я использую .grid. Он не только решает проблему, но также лучше справляется с ростом!