Search code examples
scrollbarttk

Missing a vertical scrollbar on a tab with two adjacent textboxs


I tried to add two textboxs in a tab, each textbox has its own scrollbars.

With one textbox the scrollbars showing properly. However when I added another textbox, one vertical scrollbar on the first textbox disappears. I tried to change some grid positions but not worked.

Here is the result photo: enter image description here

Here is my code:

self.txtputthrough = tk.Text(self.tab2, height=25)
self.txtputthrough.grid(row=0, column=0, sticky="ns")
self.vsb4 = ttk.Scrollbar(self.tab2, command=self.txtputthrough.yview, orient="vertical")
self.vsb4.grid(row=0, column=1, sticky="ns")
self.hsb4 = ttk.Scrollbar(self.tab2, command=self.txtputthrough.xview, orient="horizontal")
self.hsb4.grid(row=1, column=0, columnspan=1, sticky="ew")
self.txtputthrough.configure(yscrollcommand=self.vsb4.set, xscrollcommand=self.hsb4.set)

self.txtputthrough2 = tk.Text(self.tab2, height=25)
self.txtputthrough2.grid(row=0, column=2, sticky="nsew")
self.vsb5 = ttk.Scrollbar(self.tab2, command=self.txtputthrough2.yview, orient="vertical")
self.vsb5.grid(row=0, column=4, sticky="ns") # if here is column number < 4 then no vertical scrollbar shown
self.hsb5 = ttk.Scrollbar(self.tab2, command=self.txtputthrough2.xview, orient="horizontal")
self.hsb5.grid(row=1, column=2, columnspan=1, sticky="ew")
self.txtputthrough2.configure(yscrollcommand=self.vsb5.set, xscrollcommand=self.hsb5.set)

Solution

  • Due to the default width size of textbox is 50. The grid put the left side of textbox in right position but the right side of textbox could not be shown because it expands over the window size (tab)

    Then my solution is create two frames and put each textbox in a frame, and let textboxes auto resize following the frames.

    Here is my codes:

    # Create frames
    self.frame1tab2=ttk.Frame(self.tab2)
    self.frame1tab2.grid(row=0, column=0, sticky='nsew')
    self.frame1tab2.rowconfigure(0, weight=1) # this will let frame auto resizes following the tab windows
    self.frame1tab2.columnconfigure(0, weight=1)
    self.frame1tab2.grid_propagate(True)
    
    self.frame2tab2=ttk.Frame(self.tab2)
    self.frame2tab2.grid(row=0, column=1, sticky='nsew')
    self.frame2tab2.rowconfigure(0, weight=1)
    self.frame2tab2.columnconfigure(0, weight=1)
    self.frame2tab2.grid_propagate(True)
    
    # Put textboxes into frames
    self.txtputthrough = tk.Text(self.frame1tab2)
    self.txtputthrough.grid(row=0, column=0, sticky="nsew") # this will let textbox auto resizes following the frame
    self.vsb6 = ttk.Scrollbar(self.frame1tab2, command=self.txtputthrough.yview, orient="vertical")
    self.vsb6.grid(row=0, column=1, sticky="wns")
    self.hsb6 = ttk.Scrollbar(self.frame1tab2, command=self.txtputthrough.xview, orient="horizontal")
    self.hsb6.grid(row=1, column=0, columnspan=1, sticky="ew")
    self.txtputthrough.configure(yscrollcommand=self.vsb6.set, xscrollcommand=self.hsb6.set)
    
    self.txtputthrough2 = tk.Text(self.frame2tab2, height=25)
    self.txtputthrough2.grid(row=0, column=0, sticky="nsew")
    self.vsb5 = ttk.Scrollbar(self.frame1tab2, command=self.txtputthrough.yview, orient="vertical")
    self.vsb5.grid(row=0, column=1, sticky="wns")
    self.hsb5 = ttk.Scrollbar(self.frame1tab2, command=self.txtputthrough.xview, orient="horizontal")
    self.hsb5.grid(row=1, column=0, columnspan=1, sticky="ew")
    self.txtputthrough.configure(yscrollcommand=self.vsb5.set, xscrollcommand=self.hsb5.set)