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.