tkinter:父级中显示的顶层框架

时间:2018-10-23 13:24:05

标签: python python-3.x tkinter

我目前在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的前面,我该如何实现?

2 个答案:

答案 0 :(得分:2)

您将帧f1f2设置为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

接下来,标签位于错误窗口的原因是,当标签尝试与f1f2连接时,由于值{{ 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()