如何使Notebook标签内按钮触发的addBox在同框架内生成Entry
解决Entry显示在框架外的问题
嘿,我一眼就看出问题所在啦!你点击按钮生成的Entry之所以跑到框架外面,是因为你在addBox函数里创建Entry时,把它的父组件设成了root(主窗口),而不是我们需要的page1标签页框架。Tkinter里每个组件的父容器直接决定了它会显示在哪个区域,所以咱们只要改这一点就行。
具体修改步骤
- 在
addBox函数里,把创建Entry的代码从ent = Entry(root)改成ent = Entry(page1),这样Entry就会被放到page1框架里面了。 - 如果你想让Entry和按钮一样宽、布局更美观,可以给
pack()加上fill="x"参数,让它自动填充框架的水平空间,再加个pady小间距避免组件挤在一起。
修改后的完整代码
from tkinter import * import tkinter.ttk as ttk # 注释掉background模块(若你本地有该模块可自行解开) # import background as background #------------------------------------ def addBox(): print ("ADD") # 关键修改:将父组件从root改为page1,优化pack参数提升布局效果 ent = Entry(page1) ent.pack(fill="x", pady=2) all_entries.append( ent ) #------------------------------------ all_entries = [] root = Tk() root.title('Notebook Demo') # 设置GUI窗口尺寸与位置 w = 600 h = 400 sw = root.winfo_screenwidth() sh = root.winfo_screenheight() x = (sw - w) / 2 y = (sh - h) / 2 root.geometry('%dx%d+%d+%d' % (w, h, x, y)) root.config(background = '#A9A9A9') rows = 0 while rows < 50: root.rowconfigure(rows, weight=1) root.columnconfigure(rows, weight=1) rows += 1 nb = ttk.Notebook(root) page1 = ttk.Frame(nb) nb.add(page1, text='RDT & On-Air') page2 = ttk.Frame(nb) nb.add(page2, text='Existing Sites') page3 = ttk.Frame(nb) nb.add(page3, text='All Data') # 移除重复的nb.pack()调用,仅需一次即可让Notebook填充整个窗口 nb.pack(expand = 1, fill = "both") btn1 = ttk.Button(page1, text = "Add Site Code", command=addBox) btn1.pack(fill="x", padx=10, pady=10) # 给按钮添加边距,布局更舒适 root.mainloop()
另外我还帮你优化了一处小细节:之前你重复调用了三次nb.pack(),其实只需要调用一次就能让Notebook填充整个窗口,多余的调用可以删掉,让代码更整洁。
内容的提问来源于stack exchange,提问作者user11630968
相关产品推荐
相关产品推荐

