Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to attach a Scrollbar to a Text widget?

Tags:

python

tkinter

I am trying to attach a scrollbar to my Text field and have been unable to do so. Here is the segment of code:

self.scroller = Scrollbar(self.root) self.scroller.place(x=706, y=121) self.outputArea = Text(self.root, height=26, width=100)  self.outputArea.place(x=0, y=120) self.scroller.config(command=self.outputArea.yview) self.outputArea.config(state=DISABLED, yscrollcommand = self.scroller.set) 

This code is placing a very small scrollbar right next to my text field (and by very small, I mean that you can see the up and down arrows but nothing in between). I can scroll with it when my text field fills up, but is there a way to at the very least set the height of the scrollbar so that it appears to be the same height as the text field?

like image 485
jwebster Avatar asked Dec 12 '12 04:12

jwebster


People also ask

How do I add a scrollbar to my text widget?

In order to create a Text widget, we have to instantiate a text object. Adding multiple texts will require to add the ScrollBar. In order to add a scrollbar in the text widget, we can call the ScrolledText(root) function. This function generally creates a text field with a scrollbar.

How do I add a scrollbar to a text box in Python?

By default, the vertical scrollbars are available in the constructor and we don't need to have an orientation for the scrollbar. To attach a vertical scrollbar in a Tkinter text widget, you can use xscrollcommand and yscrollcommmand to set the value of vertical and horizontal scrollbars.

How do I add a scroll bar to a frame in Python?

Build A Paint Program With TKinter and Python For a particular application, we can also add a scrollbar in the frames. In order to add a scrollbar, we generally use to the Scrollbar(... options) function.


2 Answers

Tkinter has three geometry managers: pack, grid, and place.
Pack and grid are usually recommended over place.

You can use the grid manager's row and column options
to position the Scrollbar next to the Text widget.

Set the Scrollbar widget's command option to the Text's yview method.

scrollb = tkinter.Scrollbar(..., command=txt.yview) 

Set the Text widget's yscrollcommand option to the Scrollbar's set method.

txt['yscrollcommand'] = scrollb.set 

Here's a working example that makes use of ttk:

import tkinter import tkinter.ttk as ttk  class TextScrollCombo(ttk.Frame):      def __init__(self, *args, **kwargs):          super().__init__(*args, **kwargs)      # ensure a consistent GUI size         self.grid_propagate(False)     # implement stretchability         self.grid_rowconfigure(0, weight=1)         self.grid_columnconfigure(0, weight=1)      # create a Text widget         self.txt = tkinter.Text(self)         self.txt.grid(row=0, column=0, sticky="nsew", padx=2, pady=2)      # create a Scrollbar and associate it with txt         scrollb = ttk.Scrollbar(self, command=self.txt.yview)         scrollb.grid(row=0, column=1, sticky='nsew')         self.txt['yscrollcommand'] = scrollb.set  main_window = tkinter.Tk()  combo = TextScrollCombo(main_window) combo.pack(fill="both", expand=True) combo.config(width=600, height=600)  combo.txt.config(font=("consolas", 12), undo=True, wrap='word') combo.txt.config(borderwidth=3, relief="sunken")  style = ttk.Style() style.theme_use('clam')  main_window.mainloop() 

The part that will address your Scrollbar being small is sticky='nsew',
which you can read about → here.

Something that will be helpful for you to learn right now is that different Tkinter widgets can use different geometry managers within the same program as long as they do not share the same parent.


The tkinter.scrolledtext module contains a class called ScrolledText which is a compound widget (Text & Scrollbar).

import tkinter import tkinter.scrolledtext as scrolledtext  main_window = tkinter.Tk()  txt = scrolledtext.ScrolledText(main_window, undo=True) txt['font'] = ('consolas', '12') txt.pack(expand=True, fill='both')  main_window.mainloop() 

The way this is implemented is worth taking a look at.

like image 164
Honest Abe Avatar answered Oct 12 '22 21:10

Honest Abe


If you're working with an INPUT box, then a handy way using the scrolledtext function. It took me 4+ hours to find it. Don't ya love tkinter?

Two things to note... The additional import required import tkinter.scrolledtext as tkscrolled and you set default value using insert and read the value using get (more terrible naming)

This bit of code was central to making my 20 character wide by 10 lines text input box to work.

import tkinter.scrolledtext as tkscrolled import tkinter as tk  default_text = '1234' width, height = 20,10 TKScrollTXT = tkscrolled.ScrolledText(10, width=width, height=height, wrap='word')  # set default text if desired TKScrollTXT.insert(1.0, default_text) TKScrollTXT.pack(side=tk.LEFT) 

The scroll bars show up once reaching the height as defined in the call. They are grayed out and blend into the background well. It works great..... once you figure out the correct calls to make.

I hope this is relevant to your question!

like image 37
Mike from PSG Avatar answered Oct 12 '22 21:10

Mike from PSG