我在 tkinter 中实现了我自己的带有垂直和水平滚动条的文本字段类:
import tkinter as tk
import tkinter.ttk as ttk
class CustomText(tk.Frame):
def __init__(self, parent, *args, **kwargs):
super().__init__(parent)
yscrollbar = ttk.Scrollbar(self, orient=tk.VERTICAL)
xscrollbar = ttk.Scrollbar(self, orient=tk.HORIZONTAL)
self._text = tk.Text(self, *args,
xscrollcommand=xscrollbar.set,
yscrollcommand=yscrollbar.set,
**kwargs)
yscrollbar['command'] = self._text.yview
xscrollbar['command'] = self._text.xview
self.grid_columnconfigure(0, weight=1)
self.grid_rowconfigure(0, weight=1)
self._text.grid(row=0, column=0, sticky='NSEW')
yscrollbar.grid(row=0, column=1, sticky='NS')
xscrollbar.grid(row=1, column=0, sticky='EW')
def write(self, s):
self._text.insert(tk.END, s)
def clear(self):
self._text.delete(0.0, tk.END)
root = tk.Tk()
text = CustomText(root, wrap=tk.NONE)
text.pack()
text.write('*\n' * 100)
tk.mainloop()
当文本水平或垂直完全适合该字段时,相应的滚动条将变为非活动状态。如何在不需要时完全隐藏滚动条?

tkinter 中的控件可以通过多种方式隐藏。让我们考虑其中两个:
.grid_forget()或.pack_forget()(取决于使用的放置方法),然后用相同的方法再次放置。这种方法的不便之处在于,例如使用.pack()新放置的控件放置时,会被添加到“最后”(例如,如果元素严格按照从上到下放置,则widget将被“拉出”从中间加上.pack_forget()然后加到最底部的方法.pack)。在放置 via 时.grid(),您可以明确指定隐藏后再次放置小部件的位置,但这个地方必须是硬编码或在某处“记住”。.grid_remove()- 仅在使用 放置时有效.grid(),但在隐藏然后.grid()不带参数放置后,控件将准确返回到它被“拉出”的位置。以上信息取自En.SO 答案:显示和隐藏小部件 @BryanOakley
由于我们使用 将滚动条放置在框架内
.grid(),因此我们将使用第二种隐藏方法。当类小部件
Text想要发出其内容已更改并且需要重新绘制滚动条的信号时,它会调用通过xscrollcommand和参数指定的适当函数yscrollcommand。.set()滚动条方法通常在那里被替换。该方法
.set()采用两个参数:滚动条“滑块”的开始和结束位置(浮点格式从0.0to1.0转换为字符串,即 from'0.0'to'1.0')。当内容完全适合时,那么这些参数是相等的,分别是'0.0'- 开始,和'1.0'- 结束。在我们的实现中,我们将直接传递我们的函数,而不是指定方法,
.set()该函数将检查参数是否相等'0.0'和'1.0',如果它们匹配,则隐藏滚动条,反之亦然显示它。实施缺陷:隐藏滚动条时,父框架的大小会减小其宽度/高度(从下面的屏幕截图中的窗口大小可以看出)。
更新:删除了向滚动条对象中插入字段
visible,添加了方法返回的结果可见小部件的定义.grid_info()(如果小部件未打包到单元格中,则返回空字典)。