Python 带有Tkinter的嵌套布局
Tk文档(最后一节)说明可以使用Python 带有Tkinter的嵌套布局,python,tkinter,tkinter-layout,Python,Tkinter,Tkinter Layout,Tk文档(最后一节)说明可以使用Tk.frame实现嵌套布局。 以下小示例未按预期工作,而不是: 将tkinter作为tk导入 window=tk.tk() 窗几何(“250x100”) #第一级,作为父级的窗口 Label(window,text='Choose file:').grid(行=0,列=0,粘滞=tk.W) 按钮(窗口,text='Browse…').grid(行=1,列=0,粘性=tk.W) fr=tk.Frame(window.grid)(行=2,列=0,粘性=tk.W)
Tk.frame
实现嵌套布局。
以下小示例未按预期工作,而不是:
将tkinter作为tk导入
window=tk.tk()
窗几何(“250x100”)
#第一级,作为父级的窗口
Label(window,text='Choose file:').grid(行=0,列=0,粘滞=tk.W)
按钮(窗口,text='Browse…').grid(行=1,列=0,粘性=tk.W)
fr=tk.Frame(window.grid)(行=2,列=0,粘性=tk.W)
#嵌套,帧作为父对象
tk.Entry(fr.grid)(行=0,列=0,粘性=tk.W)
tk.Entry(fr.grid)(行=0,列=1,粘性=tk.W)
tk.mainloop()
它产生:
真正的UI要复杂得多,所以我真的希望使用嵌套网格,而不是一个包含多个列的网格。AFAIK,
tkinter
如果同时创建对象和网格,则不会产生直观的结果。这将为您提供与文档相同的结果:
import tkinter as tk
window = tk.Tk()
window.geometry('250x100')
# first level, window as parent
tk.Button(window, text='Browse ...').grid(row=1, column=0, sticky=tk.W)
tk.Label(window, text='Choose file:').grid(row=0, column=0, sticky=tk.W)
fr = tk.Frame(window)
fr.grid(row=2, column=0, sticky=tk.W)
# nested, frame as parent
entry1 = tk.Entry(fr)
entry1.grid(row=0, column=0, sticky=tk.W)
entry2 = tk.Entry(fr)
entry2.grid(row=0, column=1, sticky=tk.W)
tk.mainloop()
阅读,你的
fr
是None
因此父级是root
。只需几秒钟就可以验证fr
是否设置为你认为的值。布莱恩-你说得对,我太习惯静态类型语言了。但是为什么Python没有在这种情况下抛出错误呢?@Mikhail:因为没有要报告的错误。做你所做的是完全正确的,只是你期望发生的事情和记录发生的事情是两件不同的事情。这不是说“它不会产生好的结果”,而是它不会产生直观的结果。哦,我明白了-fr
不是框架对象。我想知道为什么python会毫无错误地接受这样的代码“如果您同时创建一个对象和网格,tkinter不会产生好的结果。”:您对此有任何参考。@Mikhail“我想知道为什么python会毫无错误地接受这样的代码”:这是默认值,您可以通过调用tk.NoDefaultRoot()