带滚动条的窗口
由于滚动条不能绑定窗口或框架,只能在窗口下创建frame,在frame下创建canvas,滚动条绑定canvas
- 创建窗口,固定其尺寸,不允许修改
- 创建画布 - 创建滚动条 - 画布和滚动条放在同一个parent下
- 创建frame,其尺寸占画布宽、高的90%
- 结合窗口、画布、frame,创建带滚动条的窗口
- 为滚动条设置滚动范围(canvas绑定滚动条要设置scrollregion才能生效)
from tkinter import *
def create_win(title=None, size_str=None):
win = Tk()
win.title(title)
win.geometry(size_str)
win.resizable(0,0)
return win
def create_canvas(parent):
canvas = Canvas(parent)
canvas.pack(fill=Y, side=LEFT)
bar = Scrollbar(canvas)
bar.place(relx=0.95, relheight=1.0)
bar.configure(command=canvas.yview)
canvas.config(yscrollcommand=bar.set)
return canvas
def create_frame(canvas):
w = canvas.winfo_reqwidth()
h = canvas.winfo_reqheight()
frame = Frame(canvas, width=w*0.9, height=h*0.9)
return frame, w, h
def win_with_bar(title=None, size_str=None):
win = create_win(title=title, size_str=size_str) #创建窗口
canvas = create_canvas(win) #创建与滚动条绑定的canvas
frame, w, h = create_frame(canvas) #创建frame
#把frame放在canvas的中心位置,受滚动条影响,中心点横坐标略有偏移
canvas.create_window((w/2-10, h/2), window=frame)
return win, canvas, frame, h
def set_scrollregion(canvas, frame, h):
L = [i.winfo_reqheight() for i in frame.winfo_children()] #组件高度累加
frame_h = sum(L) + 10 #部件总高度,加上边距10,作为frame的高度
y1 = (h - frame_h)/2 #滚动范围的开始位置:(画布高度 - frame高度) / 2
y2 = y1 + frame_h #滚动范围的结束位置:开始位置 + frame高度
canvas.config(scrollregion=(0, y1, 0, y2))
'''
#应用程序:创建窗口、画布、frame——在frame中创建部件——根据部件高度,设置滚动范围
win, canvas, frame, h = win_with_bar(title='标题', size_str=None)
for i in range(50): Label(frame, text='占位标签'+str(i)).pack()
set_scrollregion(canvas, frame, h)
'''
常用窗口:标签 + 滚动文本框 + 按钮
- 此函数不带参数
- 仅在函数内部导入模块
- 窗口、框架、标签、文本框、按钮都有名称,并全部返回
- 后期可以调用所有组件,也可以调用部分组件
def label_text_button_win():
import tkinter
win = tkinter.Tk()
win.title("标题")
frame = tkinter.Frame(win)
frame.pack(padx=20, pady=20)
label = tkinter.Label(frame, text="文本行", anchor='sw')
label.pack(fill='x')
from tkinter import scrolledtext
text = scrolledtext.ScrolledText(frame, width=30, height