python-3.x - 如何在 Python tkinter 中将滚动条添加到重叠的画布
问题描述
我正在尝试为学校项目制作应用程序,其中一个功能是消息传递服务,用户可以在其中相互发送消息,这是通过加载消息传递 GUI 的按钮访问的。我已经在程序开始时添加了一个画布作为主 GUI 的背景,但是对于消息界面,我添加了另一个重叠的画布,并将使用滚动条滚动消息并显示它们。
本质上,我的问题是我想使用坐标将另一个画布放在主画布的顶部,并添加一个仅适合这个较小画布右侧的滚动条。
提前致谢 :)
我尝试使用 pack()、grid()、place() 和 canvas.create_window() 为其添加滚动条,但是在所有情况下,滚动条都不会出现,也不会填充第二个画布的整个右侧,或未放置在正确的位置。我得到的最接近的是 place() 函数,我设法使用“relx”、“rely”和“relheight”定位滚动条和画布,但是滚动条没有滚动画布。
root = Tk() #creates the GUI
root.title("Eclass")
root.iconbitmap(default='icon.ico') #sets icon
root.state('zoomed')
backgroundcolour = root.cget("bg")
screen_width = root.winfo_screenwidth() - 15
screen_height = root.winfo_screenheight()
canvas = Canvas(root, width = screen_width, height = screen_height)
def messaging():
canvas.delete("all")
msg_canvas = Canvas(canvas, width = 1530, height = 730, bg = "red")
#canvas.create_window(1123,600, window = msg_canvas) this is where I tried to add the second canvas using the create_Window function
msg_canvas.place(relx=0.186, rely=0.227)
msg_scrollbar = Scrollbar(canvas, orient="vertical",command=msg_canvas.yview)
msg_scrollbar.place(relx=0.975,rely=0.2295, relheight = 0.717)
msg_canvas.config(scrollregion=msg_canvas.bbox(ALL))
我希望画布放置在通过 relx 给出的当前坐标内,并依赖或在之前的试验中使用 canvas.create_window() 中的坐标,然后我希望 msg_scrollbar 位于 msg_canvas 的右侧并填充到它的 Y(滚动条的高度应该与画布的高度相同)。实际上,画布和滚动条位于正确的坐标中,但是滚动条即使在移动后也不会滚动 msg_canvas。
解决方案
,本质上,我的问题是我想使用坐标将另一个画布放在主画布的顶部,并添加一个仅适合这个较小画布右侧的滚动条。
我建议不要使用place
. 两者pack
都grid
更适合创建响应分辨率、窗口大小和字体变化的代码。
恕我直言,最简单的解决方案是使用pack
将主画布放在底部,然后在剩余空间中将滚动条放在右侧,将辅助画布放在左侧。注意:顺序很重要,因为每次调用pack
它都会用完给定侧的所有空间,从而减少未来小部件的可用空间。
canvas.pack(side="bottom", fill="both", expand=True)
msg_scrollbar.pack(side="right", fill="y")
msg_canvas.pack(side="left", fill="both", expand=True)
您可以使用 完成相同的操作grid
,但需要额外的代码行来配置行和列的权重。grid
顺序并不重要,因为您明确设置行和列。
msg_canvas.grid(row=0, column=0, sticky="nsew")
msg_scrollbar.grid(row=0, column=1, sticky="ns")
canvas.grid(row=1, column=0, columnspan=2, sticky="nsew")
root.grid_rowconfigure((0,1), weight=1)
root.grid_columnconfigure(0, weight=1)
推荐阅读
- spring-boot - 将身份验证/授权移动到单独的微服务,然后结合网关(zuul + eureka 服务器)
- java - Vert.x 中的 sharedData AsyncMap 的寿命有多长?
- c# - log4net - 使用 .config 文件部分 (WebService/IIS) 配置存储库 [MyProject] 时出错
- android - 如何在 Flutter 中使用 Circle Items 制作 ListView 或 PageView 并调整当前 Circle 的大小?
- prolog - 在prolog中制作自然数规则的正确方法是什么?
- java - 即使使用设置,Eclipse 内容辅助自动完成也无法正常工作
- python - 字符串包含换行符 (\n),如何使用正则表达式将 \n 替换为 \n?
- c++ - 对全局变量的非常量引用的无效初始化
- r - r 中的最大值
- html - 为什么 Microsoft Edge 强调此跨度并将其视为链接?