Cómo codificar el módulo tkinter “scrolledtext”

El siguiente código produce un ejemplo feo pero funcional de usar una barra de desplazamiento en un widget de texto y da como resultado un par de preguntas. Nota: esto se hace usando Python 3 en un cuadro de ventanas.

  1. La barra de desplazamiento que aparece se adjunta al marco y, aunque se desplaza por el contenido del cuadro de texto, preferiría que se adjuntara al widget de texto. No he podido hacer que esto suceda.

  2. Hay una serie de referencias a un módulo Tkinter llamado “scrolledtext” que se supone que es un mecanismo mucho mejor para agregar barras de desplazamiento a los cuadros de texto, pero no he encontrado ningún ejemplo de cómo importarlo y llamarlo como puedo ir al trabajo (probablemente necesite un ejemplo).


frame1 = tk.Frame(win,width=80, height=80,bg = '#808000') frame1.pack(fill='both', expand='yes') scrollbar = Scrollbar(frame1) scrollbar.pack(side=RIGHT, fill=Y) editArea = Text(frame1, width=10, height=10, wrap=WORD, yscrollcommand=scrollbar.set) editArea.pack() scrollbar.config(command=editArea.yview) editArea.place(x=10,y=30) 

Tenías razón, puedes usar el widget tkinter.scrolledtext desde el módulo tkinter.scrolledtext , así:

 import tkinter as tk import tkinter.scrolledtext as tkst win = tk.Tk() frame1 = tk.Frame( master = win, bg = '#808000' ) frame1.pack(fill='both', expand='yes') editArea = tkst.ScrolledText( master = frame1, wrap = tk.WORD, width = 20, height = 10 ) # Don't use widget.place(), use pack or grid instead, since # They behave better on scaling the window -- and you don't # have to calculate it manually! editArea.pack(padx=10, pady=10, fill=tk.BOTH, expand=True) # Adding some text, to see if scroll is working as we expect it editArea.insert(tk.INSERT, """\ Integer posuere erat a ante venenatis dapibus. Posuere velit aliquet. Aenean eu leo quam. Pellentesque ornare sem. Lacinia quam venenatis vestibulum. Nulla vitae elit libero, a pharetra augue. Cum sociis natoque penatibus et magnis dis. Parturient montes, nascetur ridiculus mus. """) win.mainloop() 

Y ahí tienes:

introduzca la descripción de la imagen aquí

Si bien el uso del widget ScrolledText puede ahorrarle algunas líneas de código, no está haciendo nada que no pueda hacer usted mismo. Hacerlo usted mismo ayudará a eliminar algunos de los misterios.

En realidad estás haciendo todo casi correcto. El error que estás cometiendo es que debes hacer que tu widget de texto llene su contenedor completamente en lugar de ser solo una pequeña parte de él.

La forma estándar de hacer esto es así:

 container = tk.Frame(...) text = tk.Text(container, ...) scrollbar = tk.Scrollbar(container, ...) scrollbar.pack(side="right", fill="y") text.pack(side="left", fill="both", expand=True) 

Eso es todo al respecto. Ahora, sin importar qué tan grande sea su contenedor debido al tamaño de las ventanas, etc., la barra de desplazamiento siempre aparecerá adjunta al widget de texto. Luego, trata este grupo completo de contenedores, widgets de texto y barras de desplazamiento como un solo widget cuando lo agrega a su GUI completa.

Tenga en cuenta que también puede usar la cuadrícula aquí. El paquete es más fácil si solo tienes una barra de desplazamiento vertical. Si tiene barras de desplazamiento tanto horizontales como verticales, la cuadrícula tiene un poco más de sentido.

Para completar la ilusión, puede establecer el ancho de borde del widget de texto en cero, y establecer el ancho de borde del marco que contiene a 1 con un relieve de hundido, y la barra de desplazamiento aparecerá como “en” el widget de texto.

Aquí hay un ejemplo completo de trabajo que se parece más o menos a tu ejemplo:

 import Tkinter as tk win = tk.Tk() win.configure(background="#808000") frame1 = tk.Frame(win,width=80, height=80,bg = '#ffffff', borderwidth=1, relief="sunken") scrollbar = tk.Scrollbar(frame1) editArea = tk.Text(frame1, width=10, height=10, wrap="word", yscrollcommand=scrollbar.set, borderwidth=0, highlightthickness=0) scrollbar.config(command=editArea.yview) scrollbar.pack(side="right", fill="y") editArea.pack(side="left", fill="both", expand=True) frame1.place(x=10,y=30) win.mainloop() 

Personalmente, no recomiendo hacer importaciones globales, y no recomiendo usar place, pero quería mantener esto lo más cerca posible del original.