【问题标题】:Toplevel displaying contents in previous frame上一帧显示内容的顶层
【发布时间】:2017-04-25 09:08:55
【问题描述】:

我有一个顶级类 DesignWindow,它包含一个 10x10 的按钮数组,当我以此处讨论的方式调用它时:Tkinter; Toplevel in a new class 它在最后一个窗口中创建窗口。

我做错了什么?唯一的区别是我的“根”窗口(带有菜单)是 tk.Frame 而不是引用问题中的 tk.Tk。

class MainWindow(tk.Frame):
    """Draw the main window"""
    def __init__(self, parent):
        tk.Frame.__init__(self, parent, background='grey')
        self.parent = parent
        self.menuscreen = MenuScreen(self)

        self.grid()

        self.menuscreen.design.grid(column=0, row=0)

class MenuScreen(tk.Frame):
    """Create the menu screen"""
    def __init__(self, parent):
        self.design = tk.Button(command=self.create_design_window, text="Design")

    def create_design_window(self):
        self.design_window = DesignWindow(self)

class DesignWindow(tk.Toplevel):
    """Frame for design mode"""
    def __init__(self, main):
        tk.Toplevel.__init__(self)

按钮的编辑生成:

     self.btn = [[0 for x in range(10)] for x in range(10)]
        for column in range(10):
            for row in range(10):
                self.btn[column][row] = tk.Button(main)
                self.btn[column][row].grid(column=column, row=row)

【问题讨论】:

  • MenuScreen.__init__ 是否不需要调用它是超级的,并且您不需要将父级传递给两个超级构造函数。
  • 真的很抱歉,忘记添加实际执行渲染位的顶级类:/
  • 您是否在问为什么应该在顶层的小部件却在另一个窗口中?如果是这样,您需要向我们展示您是如何在顶层创建窗口的。
  • 这听起来像我在问什么。至于我如何创建每个小部件,它是 tk.Button() 的一个实例,我不确定您是如何在顶层“创建一个窗口”的,并且没有看到任何提及。也许您可以链接一个解释这一点的资源?

标签: python tkinter


【解决方案1】:

我不确定您的答案中是否有足够的代码可以确定,但肯定有两个错误我马上就看到了。

首先,MenuScreen 没有调用它的超类的__init__。您需要将此添加到MenuScreen.__init__

tk.Frame.__init__(self, parent)

其次,您没有为MenuScreen 中的小部件提供父级,因此它们被添加到根窗口中。您应该养成始终提供父母的习惯:

self.design = tk.Button(self, ...)

你没有在DesignWindow 中展示你是如何创建任何小部件的,但我猜你正在犯同样的错误。您需要确保所有小部件都有明确的父级,否则它们最终会出现在根窗口中。

【讨论】:

  • 我正在关注这个:stackoverflow.com/questions/17466561/… 作为一种结构方式,所以不正确是否有意义?
  • @ThomasCarroll: “所以不这样做是有意义的” -- 对什么有意义吗?您必须调用超类的构造函数,并且必须显式地为每个小部件指定父级。
  • 我感觉好像我对这里发生的事情有一个根本的误解?我听从了你的建议,但由于小部件没有像以前那样加载,它给出了一个没有按钮的窗口。我将尝试重组我的程序,看看它是否会做出任何改变。
  • @ThomasCarroll:结构没有问题,您只是没有正确使用 tkinter。如果您对小部件进行子类化,则必须调用您所继承的小部件的__init__。当你创建一个小部件时,你必须告诉它哪个窗口是它的父窗口。如果您不告诉每个小部件其父级是什么,它会转到根窗口。如果您愿意提供Minimal, Complete and Verifiable Example,我们可能会更有帮助。
  • 好的,我已经编辑了我的帖子,所以你可以看到按钮是如何制作的,这里是主要的父项吗?看来我还没有在顶层定义“父级”。此外,当我现在运行程序时,根本不会显示任何小部件!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多