0

0

Tkinter:实现可滚动Frame的正确方法

聖光之護

聖光之護

发布时间:2025-08-29 18:10:15

|

478人浏览过

|

来源于php中文网

原创

tkinter:实现可滚动frame的正确方法

本文将深入探讨Tkinter中如何创建一个可滚动Frame,解决在添加大量子控件时窗口尺寸固定的问题。我们将重点关注Canvas和Scrollbar的正确配置,避免Frame尺寸和滚动区域更新的常见错误。通过清晰的代码示例和详细的解释,你将学会如何创建一个能够容纳动态数量子控件,并且带有垂直滚动条的Frame。

在Tkinter中,实现可滚动Frame的关键在于使用Canvas组件,并将需要滚动的Frame嵌入到Canvas中。同时,需要配置Scrollbar来控制Canvas的滚动行为。以下是实现可滚动Frame的步骤和注意事项:

1. 创建主窗口和必要的Frame:

首先,创建一个主窗口,并在其中创建一个用于包含可滚动内容的Frame,以及一个用于显示标题和其他控件的Frame(如果需要)。

from tkinter import *

root = Tk()
root.title('Profile Editor')

# Frame for title and add button
titleFrame = Frame(root)
titleFrame.grid(row=0, column=0, padx=10, pady=5)

# Button to add a new check
addGCheckButton = Button(titleFrame, text='+', font=('Courier', 14), command=lambda: addCheck('g', gChecksFrame))
addGCheckButton.grid(row=0, column=1, padx=1, pady=5)

2. 创建Canvas和Scrollbar:

创建一个Canvas组件,并将其放置在titleFrame中。同时,创建一个Scrollbar组件,并将其与Canvas的垂直滚动条关联起来。

# Frame for canvas and scrollbar
checkFrame = Frame(titleFrame)
checkFrame.grid(row=1, column=0, padx=5, pady=5, sticky='nw')
checkFrame.grid_rowconfigure(0, weight=1)
checkFrame.grid_columnconfigure(0, weight=1)

# Canvas for scrollbar
scrollCanvas = Canvas(checkFrame, bg='yellow')
scrollCanvas.grid(row=0, column=0, sticky='news')

# Link scrollbar to canvas
gScrollbar = Scrollbar(checkFrame, orient='vertical', command=scrollCanvas.yview)
gScrollbar.grid(row=0, column=1, sticky='ns')
scrollCanvas.configure(yscrollcommand=gScrollbar.set)

3. 创建内部Frame并嵌入Canvas:

创建一个Frame组件,用于包含实际需要滚动的子控件。将这个Frame嵌入到Canvas中,并使用create_window方法将其放置在Canvas的左上角。

韩国商城购物MORNING MALL
韩国商城购物MORNING MALL

主要增加论坛整合,在后台内置网银,快钱支付宝等实时在线支付平台 支付宝支付方式改成在收银台统一支付 并且修改了收到已付款定单后台显示定单确认功能[这功能非常强大,自动确认] 并且增加了商城内短信功能,商城店主可以自由与会员之间实时交谈。 改正给ID添加积分后,登陆到前台,在 MEMBER LOGIN 下面的积分仍然显示为0的问题 修改 订单确认 中 投递&包装方法 没有根据前面的选择而改

下载
# Create frame to contain checks
gChecksFrame = Frame(scrollCanvas, bg='blue')
scrollCanvas.create_window((0, 0), window=gChecksFrame, anchor='nw')

4. 动态添加子控件:

创建一个函数,用于动态地向gChecksFrame中添加子控件。每次添加子控件后,需要更新Canvas的scrollregion,以便Scrollbar能够正确地控制滚动范围。

gCheckList = []

def addCheck(type, homeFrame):
    '''adds a new row to the profile editor which allows the user to input a check'''
    checkLength = 14
    listLength = len(gCheckList)

    checkFrame = Frame(homeFrame)
    checkFrame.grid(row=listLength, column=0, padx=10, pady=5)

    checkName = Text(checkFrame, width=10, height=1, font=('Courier',12))
    checkName.grid(row=0, column=0, padx=10, pady=5)

    gCheckList.append(checkFrame)

    homeFrame.update_idletasks()

    return

5. 绑定Configure事件更新滚动区域:

关键的一步是绑定gChecksFrame的事件,并在事件处理函数中更新Canvas的scrollregion。这样,当gChecksFrame的尺寸发生变化时,Canvas的滚动区域也会自动更新。

# update canvas scrollregion whenever gChecksFrame is resized
gChecksFrame.bind("", lambda e: scrollCanvas.config(scrollregion=scrollCanvas.bbox("all")))

完整代码示例:

from tkinter import *

gCheckList = []

def addCheck(type, homeFrame):
    '''adds a new row to the profile editor which allows the user to input a check'''
    checkLength = 14
    listLength = len(gCheckList)

    checkFrame = Frame(homeFrame)
    checkFrame.grid(row=listLength, column=0, padx=10, pady=5)

    checkName = Text(checkFrame, width=10, height=1, font=('Courier',12))
    checkName.grid(row=0, column=0, padx=10, pady=5)

    gCheckList.append(checkFrame)

    homeFrame.update_idletasks()

    return

#creates root
root = Tk()
root.title = 'Profile Editor'

#Frame for title
titleFrame = Frame(root)
titleFrame.grid(row=0,column=0,padx=10,pady=5)

#Creates a new check row to be added into the program
addGCheckButton = Button(titleFrame, text='+', font=('Courier',14), command=lambda: addCheck('g', gChecksFrame))
addGCheckButton.grid(row=0,column=1,padx=1,pady=5)

#frame for canvas
checkFrame = Frame(titleFrame)
checkFrame.grid(row=1,column=0,padx=5,pady=5, sticky='nw')
checkFrame.grid_rowconfigure(0,weight=1)
checkFrame.grid_columnconfigure(0,weight=1)

#canvas for scrollbar
scrollCanvas = Canvas(checkFrame, bg='yellow')
scrollCanvas.grid(row=0,column=0,sticky='news')

#link scrollbar to canvas
gScrollbar = Scrollbar(checkFrame, orient='vertical',command=scrollCanvas.yview)
gScrollbar.grid(row=0,column=1,sticky='ns')
scrollCanvas.configure(yscrollcommand=gScrollbar.set)

#Create frame to contain checks
gChecksFrame = Frame(scrollCanvas, bg='blue')
scrollCanvas.create_window((0,0),window=gChecksFrame, anchor='nw')

# update canvas scrollregion whenever gChecksFrame is resized
gChecksFrame.bind("", lambda e: scrollCanvas.config(scrollregion=scrollCanvas.bbox("all")))

root.mainloop()

注意事项:

  • 不要调用checkFrame.grid_propagate(False),这会导致checkFrame无法根据子控件的大小自动调整尺寸。
  • 不要使用gChecksFrame.grid(...),因为gChecksFrame已经通过create_window方法嵌入到Canvas中。
  • 务必绑定事件并更新scrollregion,否则Scrollbar将无法正常工作。
  • 根据需要调整窗口大小和子控件的布局,以获得最佳的用户体验。

通过遵循这些步骤和注意事项,你就可以在Tkinter中创建一个功能完善的可滚动Frame,从而轻松地处理大量动态生成的子控件。

相关专题

更多
html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

507

2023.10.23

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

11

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

4

2026.01.21

无人机驾驶证报考 uom民用无人机综合管理平台官网
无人机驾驶证报考 uom民用无人机综合管理平台官网

无人机驾驶证(CAAC执照)报考需年满16周岁,初中以上学历,身体健康(矫正视力1.0以上,无严重疾病),且无犯罪记录。个人需通过民航局授权的训练机构报名,经理论(法规、原理)、模拟飞行、实操(GPS/姿态模式)及地面站训练后考试合格,通常15-25天拿证。

16

2026.01.21

Python多线程合集
Python多线程合集

本专题整合了Python多线程相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.21

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.21

windows激活码分享 windows一键激活教程指南
windows激活码分享 windows一键激活教程指南

Windows 10/11一键激活可以通过PowerShell脚本或KMS工具实现永久或长期激活。最推荐的简便方法是打开PowerShell(管理员),运行 irm https://get.activated.win | iex 脚本,按提示选择数字激活(选项1)。其他方法包括使用HEU KMS Activator工具进行智能激活。

2

2026.01.21

excel表格操作技巧大全 表格制作excel教程
excel表格操作技巧大全 表格制作excel教程

Excel表格操作的核心技巧在于 熟练使用快捷键、数据处理函数及视图工具,如Ctrl+C/V(复制粘贴)、Alt+=(自动求和)、条件格式、数据验证及数据透视表。掌握这些可大幅提升数据分析与办公效率,实现快速录入、查找、筛选和汇总。

6

2026.01.21

毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm
毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm

毒蘑菇VOLUMESHADER_BM测试网站网址为https://toolwa.com/vsbm/,该平台基于WebGL技术通过渲染高复杂度三维分形图形评估设备图形处理能力,用户可通过拖动彩色物体观察画面流畅度判断GPU与CPU协同性能;测试兼容多种设备,但中低端手机易卡顿或崩溃,高端机型可能因发热降频影响表现,桌面端需启用独立显卡并使用支持WebGL的主流浏览器以确保准确结果

23

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号