我目前在Tkinter的顶级实例有两个问题。
首先也是最重要的一点:我想显示一个弹出窗口,并在其中放置2个框架,以便在网格中更好地进行排列,但是它不起作用,因为我希望它能起作用:
import tkinter
root = tkinter.Tk()
tkinter.Button(root, text="ABC").grid(column=0, row=0)
tkinter.Label(root, text="FOO").grid(column=1, row=1)
win = tkinter.Toplevel()
f1 = tkinter.Frame(win).grid(row=0, column=0)
f2 = tkinter.Frame(win).grid(row=1, column=1)
tkinter.Label(f1, text="FRAME 1").grid()
tkinter.Label(f2, text="FRAME 2").grid()
root.mainloop()
我希望将“ FRAME 1”和“ FRAME 2”放置在“顶级”窗口中,但实际上它们放置在root
中。我该如何解决?
次要的,次要的不重要:上面代码中的弹出窗口在根窗口之后生成,而我希望将其放置在root
的前面,我该如何实现?
答案 0 :(得分:2)
您将帧f1
和f2
设置为grid()
命令的返回值,即None
,因此tkinter.Label(f1, text="FRAME 1").grid()
不起作用你期望的。
尝试这样的事情:
win = tkinter.Toplevel()
f1 = tkinter.Frame(win)
f1.grid(row=0, column=0)
tkinter.Label(f1, text="FRAME 1").grid()
答案 1 :(得分:2)
在将几何管理器设置为grid()
,pack()
或place()
时,您需要能够与该窗口小部件进行交互,然后需要将窗口小部件分配给变量,然后然后使用该变量名称在新行上应用几何图形管理器。这样,您的变量将不是None
的值,而是适当的小部件。发生这种情况是因为几何图形管理器均返回None
。
接下来,标签位于错误窗口的原因是,当标签尝试与f1
和f2
连接时,由于值{{ 1}},因此它默认为tkinter根窗口,以尝试放置在某物上。
通过解决None
问题,您还将解决标签问题。
要解决顶层窗口不在根窗口前面的问题,您可以做几件事。发生这种情况的主要原因是您的代码如何在None
处生成顶级,而不是稍后使用按钮或定时事件生成。
如果确实需要与root用户同时打开顶级窗口,则可以使用__init__
和一个函数来执行此操作,它将放置在顶部。如果在窗口打开时并不需要它,则可能需要将命令分配给按钮,以运行构建顶部窗口的功能。
以下是after()
的示例:
after()
以下是带有按钮的示例:
import tkinter as tk
root = tk.Tk()
def create_top():
win = tk.Toplevel(root)
f1 = tk.Frame(win)
f1.grid(row=0, column=0)
f2 = tk.Frame(win)
f2.grid(row=1, column=1)
tk.Label(f1, text="FRAME 1").grid()
tk.Label(f2, text="FRAME 2").grid()
tk.Button(root, text="ABC").grid(column=0, row=0)
tk.Label(root, text="FOO").grid(column=1, row=1)
root.after(10, create_top)
root.mainloop()