python为text添加滚动条_Python-向Tkinter中的一组小部件添加滚动条

小编典典

概述

你只能将滚动条与几个小部件相关联,而根小部件和框架不属于该组小部件。

最常见的解决方案是创建画布小部件并将滚动条与该小部件关联。然后,在画布中嵌入包含标签小部件的框架。确定帧的宽度/高度并将其馈送到canvas scrollregion选项中,以便scrollregion与帧的大小完全匹配。

为什么要将小部件放在框架中而不是直接放在画布中?附加到画布的滚动条只能滚动使用创建方法之一创建的项。不能将添加到画布中的项目滚动到“打包”、“放置”或“网格”。通过使用框架,可以在框架内使用这些方法,然后为框架调用一次create_window。

直接在画布上绘制文本项不是很困难,因此如果frame-embedded-in-a-canvas解决方案看起来太复杂,你可能需要重新考虑这种方法。由于你正在创建一个网格,因此每个文本项的坐标将非常容易计算,特别是如果每行的高度相同(如果你使用的是单个字体,则可能是相同的高度)。

对于直接在画布上绘制,只需计算出所使用字体的行高(并且有相应的命令)。然后,每个y坐标是row*(lineheight+spacing)。x坐标将是基于每列中最宽项的固定数字。如果为列中的所有项提供标记,则可以使用一个命令调整列中所有项的x坐标和宽度。

面向对象解决方案

下面是一个使用面向对象方法嵌入到画布解决方案中的框架示例:

import tkinter as tk # python 3

# import Tkinter as tk # python 2

class Example(tk.Frame):

def __init__(self, root):

tk.Frame.__init__(self, root)

self.canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")

self.frame = tk.Frame(self.canvas, background="#ffffff")

self.vsb = tk.Scrollbar(root, orient="vertical", command=self.canvas.yview)

self.canvas.configure(yscrollcommand=self.vsb.set)

self.vsb.pack(side="right", fill="y")

self.canvas.pack(side="left", fill="both", expand=True)

self.canvas.create_window((4,4), window=self.frame, anchor="nw",

tags="self.frame")

self.frame.bind("", self.onFrameConfigure)

self.populate()

def populate(self):

'''Put in some fake data'''

for row in range(100):

tk.Label(self.frame, text="%s" % row, width=3, borderwidth="1",

relief="solid").grid(row=row, column=0)

t="this is the second column for row %s" %row

tk.Label(self.frame, text=t).grid(row=row, column=1)

def onFrameConfigure(self, event):

'''Reset the scroll region to encompass the inner frame'''

self.canvas.configure(scrollregion=self.canvas.bbox("all"))

if __name__ == "__main__":

root=tk.Tk()

Example(root).pack(side="top", fill="both", expand=True)

root.mainloop()

程序解决方案

这是不使用类的解决方案:

import tkinter as tk # python 3

# import Tkinter as tk # python 2

def populate(frame):

'''Put in some fake data'''

for row in range(100):

tk.Label(frame, text="%s" % row, width=3, borderwidth="1",

relief="solid").grid(row=row, column=0)

t="this is the second column for row %s" %row

tk.Label(frame, text=t).grid(row=row, column=1)

def onFrameConfigure(canvas):

'''Reset the scroll region to encompass the inner frame'''

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

root = tk.Tk()

canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")

frame = tk.Frame(canvas, background="#ffffff")

vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview)

canvas.configure(yscrollcommand=vsb.set)

vsb.pack(side="right", fill="y")

canvas.pack(side="left", fill="both", expand=True)

canvas.create_window((4,4), window=frame, anchor="nw")

frame.bind("", lambda event, canvas=canvas: onFrameConfigure(canvas))

populate(frame)

root.mainloop()

2020-02-06

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值