用户希望在 Tkinter 界面的右侧创建一个可以独立滚动的画布区域,并将其他控件放置在上面。但目前画布不能滚动,也不能扩展窗口的高度。
解决方案
-
导入Tkinter库并定义一个MainApplication类作为程序的主窗口。
-
在MainApplication类中,定义窗口的布局,包括菜单栏、左侧的笔记本和右侧的滚动画布区域。
-
在右侧滚动画布区域中,创建一个画布(Canvas)和一个滚动条(Scrollbar)。
-
将画布滚动条的滚动条与画布的滚动位置相关联,以便当滚动条被拖动时,画布中的内容也会相应滚动。
-
将一个框架(Frame)作为画布内容的容器,并将它放置在画布中。
-
在框架中放置想要在画布中显示的控件,如文本标签、按钮等。
-
使用bind()方法将框架的事件绑定到一个回调函数onTickerConfigure,以便在框架的大小发生改变时,调整画布的滚动区域。
-
最后,使用grid()方法将框架放置在画布中,并设置其sticky属性为’nsew’,以便框架可以随着窗口的大小变化而调整大小。
代码例子
import tkinter as tk
class MainApplication(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.grid()
self.master = master
# 设置窗口布局
self.window = tk.Frame(self, relief=tk.SUNKEN)
self.window.grid(sticky='nsew')
# 设置菜单栏
self._menuSetup()
# 设置滚动画布区域
self._windowSetup()
def _windowSetup(self):
# 创建画布和滚动条
self.tickerCanvas = tk.Canvas(self.window, borderwidth=0)
self.tickerScroll = tk.Scrollbar(self.window, orient='vertical', command=self.tickerCanvas.yview())
self.tickerCanvas.configure(yscrollcommand=self.tickerScroll.set)
# 将画布和滚动条放置在窗口中
self.tickerCanvas.pack(side='left', fill='both', expand=True)
self.tickerScroll.pack(side='right', fill='y')
# 创建框架作为画布内容的容器
self.ticker = tk.Frame(self.tickerCanvas, borderwidth=0)
# 将框架放置在画布中
self.tickerCanvas.create_window((4, 4), window=self.ticker, anchor='nw', tags=self.ticker)
# 将框架的<Configure>事件绑定到onTickerConfigure回调函数
self.ticker.bind('<Configure>', self.onTickerConfigure)
# 在框架中放置控件
for i in range(20):
text = tk.Label(self.ticker, text=f'This is a test entry {i}')
text.pack(side='top', fill='x')
def onTickerConfigure(self, event):
# 调整画布的滚动区域
self.tickerCanvas.configure(scrollregion=self.tickerCanvas.bbox('all'))
if __name__ == '__main__':
# 创建Tkinter窗口
root = tk.Tk()
# 创建MainApplication对象
app = MainApplication(root)
# 启动Tkinter事件循环
root.mainloop()
在上面的代码中,我们使用 了grid()和pack()方法来布局窗口和其包含的控件。我们还使用了一种称为事件绑定的技术来在框架的大小发生改变时调整画布的滚动区域。