【问题标题】:tkinter: Frame in Toplevel displayed in parenttkinter:在父级中显示的顶层框架
【发布时间】:2019-03-27 18:19:30
【问题描述】:

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

【问题讨论】:

  • 为了将窗口移到顶部,this 可能会对您有所帮助

标签: python python-3.x tkinter


【解决方案1】:

您将帧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()

【讨论】:

    【解决方案2】:

    当您将几何管理器设置为grid()pack()place() 时,您需要稍后能够与该小部件进行交互,您需要将小部件分配给一个变量,然后将几何管理器应用到使用该变量名称的新行。这样,您的变量将不是 None 的值,而是正确的小部件。发生这种情况是因为几何管理器都返回 None

    接下来,您的标签位于错误窗口的原因是,当您的标签尝试与 f1f2 连接时,由于值为 None,因此它们无法找到合适的 tkinter 容器,因此默认为到根 tkinter 窗口以尝试放置在某些东西上。

    通过修复None 问题,您还将解决标签问题。

    要解决顶层窗口不在根窗口前面的问题,您可以做几件事。发生这种情况的主要原因是您的代码如何在 __init__ 生成顶层而不是稍后使用按钮或定时事件。

    如果您确实需要以 root 身份同时打开顶级窗口,您可以使用 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()
    

    这是一个带有按钮的示例:

    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", command=create_top).grid(column=0, row=0)
    tk.Label(root, text="FOO").grid(column=1, row=1)
    
    root.mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多