无法将滚动条与从日志生成的标签的相当大的显示合并在一起文件数据对 Tkinter 提出了挑战。出现此问题的原因是滚动条对特定小部件类型的限制,不包括用于显示小部件网格的滚动条。
存在多种解决方案来克服此限制。对于更简单的垂直或水平显示,文本小部件与 window_create 方法相结合提供了一个可行的选择。然而,这可能不足以满足更复杂的布局。更全面的方法涉及使用带有关联滚动条的画布小部件。将包含标签小部件的框架嵌入到该画布中。通过调整scrollregion选项以匹配框架尺寸,您可以有效地启用小部件的滚动。
将小部件合并到框架中而不是直接合并到画布中是有利的,因为画布滚动条只能操作通过特定方法创建的项目。出于滚动目的,无法识别将项目打包、放置或网格化到画布上。然而,框架允许在其范围内使用这些方法,并且后续的窗口创建会导致包含框架。
将文本元素直接绘制到画布上是另一种选择。这种方法需要确定字体的行高,随后定义每个文本项的 y 坐标。 X 坐标根据每列中最宽的项目保持固定。按列标记项目可以通过单个命令调整列中的所有项目。
下面是frame-embedded-in-canvas的面向对象实现解决方案:
导入 tkinter as tk</p> <p>class 示例(tk.Frame):</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">def __init__(self, parent): tk.Frame.__init__(self, parent) self.canvas = tk.Canvas(self, borderwidth=0, background="#ffffff") self.frame = tk.Frame(self.canvas, background="#ffffff") self.vsb = tk.Scrollbar(self, 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 = Example(root) example.pack(side="top", fill="both", expand=True) root.mainloop()
这是一种不使用的替代解决方案一个类:
导入 tkinter as tk</p> <p>def populate(frame):</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">'''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"))
根= tk.Tk()
canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")
frame = tk.Frame(canvas, background="#ffffff")
vsb = tk.Scrollbar(根,东方=“垂直”, 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 事件、canvas=canvas: onFrameConfigure(canvas))
填充(frame)
root.mainloop()
以上是如何向 Tkinter 中的一组小部件添加滚动条,特别是在处理从日志文件数据生成的大量标签时?的详细内容。更多信息请关注PHP中文网其他相关文章!