【问题标题】:Tkinter-How to add a Canvas/Frame in ttk.Notebook()Tkinter-如何在 ttk.Notebook() 中添加 Canvas/Frame
【发布时间】:2021-11-18 06:15:14
【问题描述】:

在 youtube 和 google 上搜索了很多之后,我学会了如何在 Canvas 中添加全屏滚动条。它看起来像this。但现在我想在ttk.Notebook() 中添加这个框架/画布作为标签,就像这个test project。但是当我输入book.add(main,text='Tab 1') 时,它会显示这个错误_tkinter.TclError: can't add .!frame.!canvas.!frame as slave of .!notebook。谁能知道如何将画布显示为框架并将其作为选项卡添加到 notebook() 中??

这里是主要代码:

from tkinter import *
from tkinter import ttk

root=Tk()
root.title('Scroll Bar Test')
root.geometry('500x400')

#Create Main Frame
main_frame=Frame(root)
main_frame.pack(fill=BOTH,expand=1)
#Create Canvas to add scrollbar
my_canvas=Canvas(main_frame)
my_canvas.pack(side=LEFT,fill=BOTH,expand=1)
#Create ScrollBar
my_scrollbar=ttk.Scrollbar(main_frame,orient=VERTICAL,command=my_canvas.yview)
my_scrollbar.pack(side=RIGHT,fill=Y)
#Adding ScrollBar to Canvas
my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_canvas.bind('<Configure>',lambda e: my_canvas.configure(scrollregion=my_canvas.bbox("all")))
#Creating Frame to show the Canvas
main=Frame(my_canvas)
#Showing Canvas into/as a Frame
my_canvas.create_window((0,0),window=main,anchor="nw")

for i in range(100):
      Button(main, text=f'Button {1+i} Yoo!',font='arial 15').pack()

#Create NoteBook
book=ttk.Notebook(root)
book.pack()
#
book.add(main,text='Tab 1')

root.mainloop()

【问题讨论】:

    标签: python tkinter canvas frame


    【解决方案1】:

    创建为 Tab1 和 Tab2 的两个框架,然后一个带有标签,另一个带有可垂直滚动的画布。

    from tkinter import *
    from tkinter import ttk
    
    def scroll(event, canvas):
        if canvas.yview() == (0.0, 1.0):
            return
        if event.num == 5 or event.delta < 0:
            canvas.yview_scroll(1, "unit")
        elif event.num == 4 or event.delta > 0:
            canvas.yview_scroll(-1, "unit")
    
    def configure(event):
        canvas = event.widget
        canvas.configure(scrollregion=canvas.bbox("all"))
    
    root = Tk()
    
    book = ttk.Notebook(root)
    
    tab1 = Frame(book, width=160, height=120)
    tab2 = Frame(book, width=160, height=120)
    
    tab1.pack_propagate(0)
    tab2.pack_propagate(0)
    
    book.add(tab1, text='TAB 1')
    book.add(tab2, text='TAB 2')
    book.pack(expand=1, fill=BOTH)
    
    canvas = Canvas(tab1)
    vscroll = Scrollbar(tab1, orient=VERTICAL, command=canvas.yview)
    vscroll.pack(side=RIGHT, fill=Y, expand=0)
    canvas.configure(yscrollcommand=vscroll.set)
    canvas.pack(side=LEFT, fill=BOTH, expand=1)
    
    frame = Frame(canvas)
    canvas.create_window((0, 0), window=frame, anchor=CENTER)
    labels = [Label(frame, text=f'Label {i:0>2d}', bg='green', fg='white', width=15) for i in range(20)]
    for label in labels:
        label.pack(side=TOP)
        label.bind('<4>', lambda event, canvas=canvas:scroll(event, canvas))
        label.bind('<5>', lambda event, canvas=canvas:scroll(event, canvas))
        label.bind('<MouseWheel>', lambda event, canvas=canvas:scroll(event, canvas))
    
    canvas.bind('<Configure>', configure)
    canvas.bind('<4>', lambda event, canvas=canvas:scroll(event, canvas))
    canvas.bind('<5>', lambda event, canvas=canvas:scroll(event, canvas))
    canvas.bind('<MouseWheel>', lambda event, canvas=canvas:scroll(event, canvas))
    
    label = Label(tab2, text="This is Tab 2", bg='green', fg='white', width=15)
    label.pack(side=LEFT, fill=NONE, expand=1)
    
    root.mainloop()
    

    【讨论】:

    • 它可以工作,它在框架中显示画布但滚动条不起作用。这是screenshot
    • 使用垂直滚动条更新代码。
    • 我在更新滚动条后问你。而且滚动条不起作用。它就像雕像/图片一样显示。
    • 不确定您现在的问题是什么,也许可以更新您的帖子以提供更多相关信息。不工作?我的代码,还是你的代码?
    • 看,我想要一个框架中的垂直滚动条,我在笔记本中用作标签。我不知道这怎么可能。你呢??
    【解决方案2】:

    您的代码中存在一些问题:

    • 应将main_frame(外框)而不是main(内框)添加到book
    • 应该在main 上绑定&lt;Configure&gt; 而不是my_canvas
    • 创建main_frame 作为book 的子代而不是root

    以下是修改后的代码:

    import tkinter as tk
    from tkinter import ttk
    
    root = tk.Tk()
    root.title('Scroll Bar Test')
    root.geometry('500x400')
    
    # Create NoteBook
    book = ttk.Notebook(root)
    book.pack(fill=tk.BOTH, expand=1)
    
    # Create Main Frame
    main_frame = tk.Frame(book)
    # put the main frame into notebook
    book.add(main_frame, text='Tab 1')
    
    # Create canvas inside main frame
    my_canvas = tk.Canvas(main_frame)
    my_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
    
    # Create ScrollBar inside main frame
    my_scrollbar = ttk.Scrollbar(main_frame, orient=tk.VERTICAL, command=my_canvas.yview)
    my_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
    
    my_canvas.configure(yscrollcommand=my_scrollbar.set)
    
    # Creating internal frame for the buttons
    main = tk.Frame(my_canvas)
    main.bind('<Configure>', lambda e: my_canvas.configure(scrollregion=my_canvas.bbox("all")))
    my_canvas.create_window((0,0), window=main, anchor="nw")
    
    for i in range(100):
        tk.Button(main, text=f'Button {1+i} Yoo!', font='arial 15').pack()
    
    root.mainloop()
    

    请注意,我已将from tkinter import * 更改为import tkinter as tk,因为不建议导入通配符。

    【讨论】:

    • 谢谢兄弟,我正在学习python。但我有一个疑问,一个专业的 Python 程序员如何知道一个包中存在多少个函数(如 tkinter、smtplib 等),以及它们的作用?嗯?
    猜你喜欢
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多