Я пытаюсь сделать прокручиваемый текст с помощью виджета 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)
Я до сих пор не знаю, почему он не работает, но заменяя .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)
Вы уверены, что это ваш настоящий код? 'row',' column' и 'sticky' не являются допустимыми параметрами для' pack'. –
На самом деле это было потому, что я попытался с сеткой, и я забыл изменить. Это сделано, и правильный код обновлен. –
Ваша привязка происходит до того, как новый символ вставлен, поэтому он будет немного отставать. Будет ли он работать лучше, если вы привяжетесь к '' вместо' '? –