【问题标题】:Width of canvas and of frame is not working. Canvas with a scrollbar inside a frame is not working. The whole frame is not visible画布和框架的宽度不起作用。框架内带有滚动条的画布无法正常工作。整个框架不可见
【发布时间】:2021-01-31 12:53:45
【问题描述】:

我想在窗口左侧有一个宽度为 320 的框架,其中有一个画布,我必须在其中显示来自文件的数据。 该画布上将有许多小部件(数据),因此我还想在其中使用滚动条。 当我使用 pack() 时,窗口上没有显示任何内容 - 甚至 bg="sky blue" 的框架也不可见。请告诉我有什么问题。我已经尝试了 fill=BOTH、expand=True 等的所有组合。但是,我无法做出我想要的。


root = Tk()
root.state('zoomed')   #zooms the screen to maxm whenever executed
root.geometry('550x650')
root.minsize(550,650)

#Frame inside root
ContactDetails_frame = Frame(root,width=320,bg='sky blue',bd=2, relief=RIDGE)
ContactDetails_frame.pack(side=LEFT,fill=BOTH)

#Canvas inside the frame
canvas = Canvas(ContactDetails_frame,width=320,bg='sky blue',scrollregion=(30,0,1000,1000))
canvas.pack(fill=BOTH,expand=True)

#Vertical scrollbar for canvas
scrollbar = Scrollbar(canvas,orient=VERTICAL)
scrollbar.pack(side=RIGHT,fill=Y,expand=True)

#Attach scrollbar to canvas
canvas.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=canvas.yview)

#Here are the widgets
FirstName = Label(canvas, text="First name: ", font=(12),bg='sky blue',fg='black')
canvas.create_window(10,175, window=FirstName)

MiddleName = Label(canvas, text="Middle name: ",font=(12),bg='sky blue',fg='black')
canvas.create_window(10,195, window=MiddleName)

LastName = Label(canvas, text="Last name: ",font=(12),bg='sky blue',fg='black')
canvas.create_window(10,215, window=LastName)

NickName = Label(canvas, text="Nick name: ",font=(12),bg='sky blue',fg='black')
canvas.create_window(10,235, window=NickName)

Note = Label(canvas, text="Note: ",font=(12),bg='sky blue',fg='black')
canvas.create_window(10,855, window=Note)


root.mainloop()

【问题讨论】:

  • 尝试将滚动条的父级更改为ContactDetails_frame。

标签: python user-interface tkinter canvas frame


【解决方案1】:

当您将滚动条装入画布时,画布将缩小以适应滚动条。几乎没有充分的理由将滚动条放在画布内,因为它将覆盖边缘上的任何对象。在大多数情况下,画布和滚动条需要有一个共同的父级。

canvas = Canvas(ContactDetails_frame, ...)
scrollbar = Scrollbar(ContactDetails_frame, ...)

scrollbar.pack(side="right",fill=Y)   
canvas.pack(side="left", fill=BOTH,expand=True)

【讨论】:

    【解决方案2】:

    尝试为框架和画布指定高度,这可能对你有用 注意 frame 和 canvas 的单位不同,这意味着 宽度为 320 的框架小于宽度为 320 的画布 由于单位不同。类似,高度也是这样

    关于 tkinter 的笔记,您可以访问:

    https://mycodenotein.netlify.app

    【讨论】:

    • 谢谢。但这并没有解决我的问题。添加高度没有帮助。
    • "注意 frame 和 canvas 的单位是不同的,这意味着宽度为 320 的 frame 比宽度为 320 的 canvas 由于单位不同" 这根本不是真的。在这两种情况下,320 都代表像素数。
    • 非常感谢你告诉我这件事,基本上每当我用 tkinter 制作 gui 时,我总是发现框架和小部件(如 Text 和 Button)如果具有相同的宽度和高度,那么框架似乎比文本小小部件这就是为什么我认为画布小部件也一样。但是现在我测试了它,发现相同宽度和高度的画布和框架大小相同。再次非常感谢你告诉我这个
    • 文本和按钮以及其他一些小部件将宽度视为字符数,但框架和画布以像素为单位。
    猜你喜欢
    • 2020-03-17
    • 2018-01-16
    • 2018-07-13
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 2022-06-29
    • 1970-01-01
    相关资源
    最近更新 更多