Python tk scrollbar becomes inactive once text is

2019-06-04 20:55发布

问题:

Whenever I'm filling the box with text, horizontal scrollbar work fine until the text is seen on the screen.

However if the number of lines is greater than can be seen on the screen and I scroll the text down, the horizontal scrollbar becomes inactive up to the point when text is too long to fit one line again

Here's my really basic code:

from Tkinter import *
import Tkinter,tkFileDialog, tkFont

w = Label(root, text="Hello, world!")
w.pack()


textfr=Frame(root)
t=Text(textfr, width=100, height=10,font=("Arial",12),wrap=NONE)
t.insert('1.0', 'here is my text to insert')

Yscroll=Scrollbar(textfr, orient=VERTICAL)
Xscroll=Scrollbar(textfr, orient=HORIZONTAL)

t.configure(yscrollcommand=Yscroll.set)
t.configure(xscrollcommand=Xscroll.set)

Yscroll.config(command=t.yview)
Xscroll.config(command=t.xview)


        #pack everything

Yscroll.pack(side=RIGHT,fill=Y)
Xscroll.pack(side=BOTTOM,fill=X)
t.pack(side=LEFT, fill=BOTH, expand=TRUE)
textfr.pack(side=TOP, fill=BOTH, expand=TRUE)


root.mainloop()

Alas I couldn't find/google proper solution, even though the problem is really basic

Any ideas?

回答1:

from Tkinter import *

class AutoScrollbar(Scrollbar):
    # a scrollbar that hides itself if it's not needed.  only
    # works if you use the grid geometry manager.
    def set(self, lo, hi):
        if float(lo) <= 0.0 and float(hi) >= 1.0:
            # grid_remove is currently missing from Tkinter!
            self.tk.call("grid", "remove", self)
        else:
            self.grid()
        Scrollbar.set(self, lo, hi)
    def pack(self, **kw):
        raise TclError, "cannot use pack with this widget"
    def place(self, **kw):
        raise TclError, "cannot use place with this widget"


root = Tk()

vscrollbar = AutoScrollbar(root)
vscrollbar.grid(row=0, column=1, sticky=N+S)
hscrollbar = AutoScrollbar(root, orient=HORIZONTAL)
hscrollbar.grid(row=1, column=0, sticky=E+W)

canvas = Canvas(root,
                yscrollcommand=vscrollbar.set,
                xscrollcommand=hscrollbar.set)
canvas.grid(row=0, column=0, sticky=N+S+E+W)

vscrollbar.config(command=canvas.yview)
hscrollbar.config(command=canvas.xview)

# make the canvas expandable
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

#
# create canvas contents

frame = Frame(canvas)
frame.rowconfigure(1, weight=1)
frame.columnconfigure(1, weight=1)

rows = 20
for i in range(1,rows):
    for j in range(1,50):
        button = Button(frame, padx=7, pady=7, text="[%d,%d]" % (i,j))
        button.grid(row=i, column=j, sticky='news')

canvas.create_window(0, 0, anchor=NW, window=frame)

frame.update_idletasks()

canvas.config(scrollregion=canvas.bbox("all"))

root.mainloop()

This is just a quick example using buttons. Change the numbers in the range() statements of the for loops to get an idea for it, you should be able to adapt this code then your suit yours, hope this helps.