Python tk 滚动条在文本超出屏幕后失效
每当我在这个框里填入文字时,水平滚动条都能正常工作,直到文字在屏幕上显示出来。
但是,如果行数超过了屏幕能显示的数量,当我把文字向下滚动时,水平滚动条就变得无效,直到文字又变得太长,无法再放在一行里。
这是我非常基础的代码:
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()
可惜我找不到合适的解决办法,尽管这个问题其实很简单。
有没有什么想法?
1 个回答
2
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()
这只是一个使用按钮的简单示例。你可以改变for循环中range()语句里的数字,看看效果。这样你就能理解这个代码了,然后可以根据自己的需要进行调整。希望这对你有帮助。