如何在Python tkinter中将滚动条添加到重叠的画布

时间:2019-08-28 16:59:45

标签: python-3.x tkinter tkinter-canvas

我正在尝试为学校项目创建一个应用程序,功能之一是消息传递服务,用户可以在其中相互发送消息,可以通过加载消息传递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,滚动条也不会滚动它。

1 个答案:

答案 0 :(得分:0)

  

,实质上,我的问题是我想使用坐标将另一个画布放置在主画布的顶部,并添加一个仅适合该较小画布右侧的滚动条。

我建议使用place packgrid都更适合创建可响应分辨率,窗口大小和字体变化的代码。

恕我直言,最简单的解决方案是使用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)
相关问题