How to attach a Scrollbar to a Text widget?

前端 未结 3 697
北荒
北荒 2020-11-28 07:54

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.scro         


        
相关标签:
3条回答
  • 2020-11-28 08:34

    You can use tkinter frame for it, this is very simple way =>

    import tkinter as tk
    from tkinter import *
    root = tk.Tk()
    
    f = tk.Frame(root)
    f.place(x=10, y=20)
    
    scrollbar = Scrollbar(f)
    t = tk.Text(f, height=10, width=10, yscrollcommand=scrollbar.set)
    scrollbar.config(command=t.yview)
    scrollbar.pack(side=RIGHT, fill=Y)
    t.pack(side="left")
    
    root.mainloop()
    
    0 讨论(0)
  • 2020-11-28 08:57

    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!

    0 讨论(0)
  • 2020-11-28 08:59

    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.

    0 讨论(0)
提交回复
热议问题