【问题标题】:Differences in pack() and grid() tkinterpack() 和 grid() tkinter 的区别
【发布时间】:2018-05-19 21:43:26
【问题描述】:

美好的一天。学习 tkinter,使用 Python 3.5。首先,我在 root() 中使用 pack() 处理帧,然后在打包帧内使用 grid() 取得了一些成功。然后我决定使用网格将框架放置在这些框架内的根和网格中。基本上从用户那里获取一些信息 - 用信息做一些事情 - 一些触发器来重置帧 - 重新开始。在 pack() 中的 destroy() 过程中,框架似乎被附加到根目录,而在 grid() 中,它们似乎被插入。这个对吗?代码示例的不同之处在于我使用的 pack() 示例:

另一方面 - 我也遇到了条目类型为 ('<class 'tkinter.Entry Object'>) 而不是 tkinter.Entry 的问题 - 我今天无法重现这一点。有没有办法读取 get() 不起作用的值?

谢谢

i = root.slaves()
for child in i[1].winfo_children():

但是在 grid() 示例中我需要使用:

i = root.grid_slaves()
for child in i[0].winfo_children():

使用 pack() 的最小工作示例:

def new():
    showEntries()
    D_setup()
    all_entries['D'] = D

def D_setup():
    dx = len(D)
    # D Label
    labD = Label(frame_for_D, text='Place to Enter Value')
    labD.grid(row = dx * 2, column = 0)
    # D Entry
    entD = Entry(frame_for_D, width=50)
    entD.grid(row = dx * 2 + 1, column=0)
    entD.delete(0,END)
    entD.insert(END, s[dx])
    # Append the last Entry
    D.append(entD)
    return

def showEntries():

    if len(D) == 0:
        return



    for number, ent in all_entries.items():
        if str(type(ent)) == "<class 'tkinter.Entry'>":
            print(type(ent))
            print (number, ent.get())
        elif str(type(ent)) == "<class 'list'>":
            print (number, [x.get() for x in ent])
    if len(D) > 5:
        i = root.slaves()
        for child in i[1].winfo_children():
            child.destroy()
        D.clear()
        all_entries.clear()
        D.clear()
        print(all_entries)
        print(D)
        raise SystemExit
    return


#------------------------------------

all_entries = {}
D = []
root = Tk()
root.configure(background = 'green')
# -- Define all frames
frame_for_buttons = Frame(root,background='black')
frame_for_D = Frame(root,background='red')
# -- pack all frames
frame_for_buttons.pack()
frame_for_D.pack()
# -- root
newTButton = Button(frame_for_buttons, text='New\n\n' +
                                             'Enter',
                    activebackground='red',
                    activeforeground='black',
                    borderwidth=10, foreground='black',
                    background='yellow',
                    highlightthickness=20,padx=5,pady=5,
                    command=new)
newTButton.grid(row=0, column=0)

root.mainloop()  

使用 grid() 的示例:

def new():

    showEntries()
    D_setup()
    all_entries['D'] = D

def D_setup():
    dx = len(D)
    # D Label
    labD = Label(frame_for_D, text='Place to Enter Value')
    labD.grid(row = dx * 2, column = dx)
    # D Entry
    entD = Entry(frame_for_D, width=50)
    entD.grid(row = dx * 2 + 1, column=dx)
    entD.delete(0,END)
    entD.insert(END, s[dx])
    # Append the Entry
    D.append(entD)
    return

def showEntries():

    if len(D) == 0:
        return

    for number, ent in all_entries.items():
        if str(type(ent)) == "<class 'tkinter.Entry'>":
            print(type(ent))
            print (number, ent.get())
        elif str(type(ent)) == "<class 'list'>":
            print([type(x) for x in ent])
            print (number, [x.get() for x in ent])
    if len(D) > 5:
        #i = frame_for_D.grid_slaves()      .winfo_children()
        i = root.grid_slaves()
        for child in i[0].winfo_children():
            child.destroy()
        D.clear()
        all_entries.clear()
        D.clear()
        print(all_entries)
        print(D)
        raise SystemExit
    return


#------------------------------------

all_entries = {}
D = []
root = Tk()
root.configure(background = 'green')
# -- Define all frames
frame_for_buttons = Frame(root,background='black')
frame_for_D = Frame(root,background='red')
# -- Grid all frames
frame_for_buttons.grid(row = 0, column = 0)
frame_for_D.grid(row = 1, column = 0, pady = 10, padx = 10)
# root
newTButton = Button(frame_for_buttons, text='New\n\n' +
                                             'Enter',
                    activebackground='red',
                    activeforeground='black',
                    borderwidth=10, foreground='black',
                    background='yellow',
                    highlightthickness=20,padx=5,pady=5,
                    command=new)
newTButton.grid(row=0, column=0)

root.mainloop()

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    在 pack() 中的 destroy() 过程中,框架似乎被附加到根目录,而在 grid() 中,它们似乎被插入。

    不完全是。在这两种情况下,它们都会根据它们的选项添加到框架中。对于pack,默认放置选项(例如:side)是将小部件放置在父/主可用空间的顶部。

    grid 的情况下,默认是使用同一父/主中所有其他小部件之后的第一个未占用行。如果未指定,列号将为零。

    最佳实践要求您始终至少应指定 side 选项和 pack,以及 rowcolumn 选项以及 grid,这样就不会混淆小部件的用途放置。

    我也遇到了条目是 type(') 而不是 tkinter.Entry 的问题

    这个问题没有任何意义。 Entry 创建的对象将始终为 &lt;class 'tkinter.Entry'&gt; 类型,而 get 方法在用于该类型的对象时将始终有效。

    【讨论】:

    • 谢谢。由于我无法重现该问题,并且您说 Entry 将始终返回 是否最好编辑我的问题以删除这部分问题?
    • 我发现我可以使用以下内容:i = root.winfo_children(); d = i.index(frame_for_D);对于 i[d].winfo_children() 中的孩子:; child.destroy() 这允许找到所需帧的正确索引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2015-03-21
    • 2020-09-15
    • 1970-01-01
    相关资源
    最近更新 更多