栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python

概述

你只能将滚动条与几个小部件相关联,而根小部件和框架不属于该组小部件。
最常见的解决方案是创建画布小部件并将滚动条与该小部件关联。然后,在画布中嵌入包含标签小部件的框架。确定帧的宽度/高度并将其馈送到

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 2class 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("<Configure>", 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 2def 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("<Configure>", lambda event, canvas=canvas: onframeConfigure(canvas))populate(frame)root.mainloop()


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370459.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号