• 关于

    Canvas标签和Canvas对象

    的搜索结果

回答

您只能将滚动条与几个小部件关联,而根小部件和框架不属于该小部件组。 最常见的解决方案是创建一个canvas小部件,并将滚动条与该小部件关联起来。然后,在画布中嵌入包含标签小部件的框架。确定框架的宽度/高度,并将其输入到画布滚动区域选项中,以便滚动区域与框架的大小完全匹配。 为什么要将小部件放在框架中而不是直接放在画布中呢?附加到画布上的滚动条只能滚动使用create_方法之一创建的项。不能使用包、位置或网格滚动添加到画布中的项。通过使用框架,您可以在框架内使用这些方法,然后为框架调用create_window一次。 将文本项直接绘制到画布上并不十分困难,因此,如果框架嵌入到画布中解决方案过于复杂,您可能需要重新考虑这种方法。因为您正在创建一个网格,所以每个文本项的坐标将非常容易计算,特别是如果每一行的高度相同(如果使用单一字体,则很可能是相同的高度)。 对于直接在画布上绘图,只需计算出使用的字体的行高(有相应的命令)。然后,每个y坐标为行*(lineheight+间距)。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("<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 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("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas)) populate(frame) root.mainloop()

kun坤 2019-12-25 21:59:57 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站