【问题标题】:Creating a label inside of a child window with Tkinter使用 Tkinter 在子窗口内创建标签
【发布时间】:2013-11-21 02:54:22
【问题描述】:

我不知道为什么会这样,但我正在尝试使用 Tkinter 从 MenuBar 创建一个“选项”子窗口。子窗口弹出,但是当我尝试在子窗口中创建标签时,标签出现在主窗口上......我不知道为什么会这样。我已经在互联网上搜索了一段时间,但找不到我的问题的答案。这是代码。

class slot(Frame):
def __init__(self):
    self.root = Frame.__init__(self)
    # Set up the main window and the variables 
    self.master.title("Slot Machine")
    # Open in full screen
    self.w, self.h = self.master.winfo_screenwidth(), self.master.winfo_screenheight()
    self.master.geometry("%dx%d+0+0" % (self.w, self.h))
    # Add the drop down menu
    menubar = Menu(self.master)
    self.master.config(menu=menubar)
    fileMenu = Menu(menubar)
    fileMenu.add_command(
        label="New Game", 
        command=self.__init__,
        underline = 0
    )
    fileMenu.add_command(
        label="Options", 
        command=self.newStartingValue,
        underline = 0
    )
    fileMenu.add_command(
        label="Exit", 
        command=self.quit,
        underline = 0
    )
    fileMenu.add_separator()
    menubar.add_cascade(
        label = "File", 
        menu = fileMenu, 
        underline = 0
    )
    helpMenu = Menu(menubar)
    helpMenu.add_command(
        label="About...", 
        command=self.showHelp,
        underline = 0
    )
    menubar.add_cascade(label="Help", menu = helpMenu, underline = 0)
    # Manage the main window and center everything
    self.grid(sticky = W+E+N+S)
    self.master.rowconfigure(0, weight = 1)
    self.master.columnconfigure(0, weight = 1)
    for i in xrange(4):
        self.rowconfigure(i, weight = 1)
    for i in xrange(3):
        self.columnconfigure(i, weight = 1)

def showHelp(self):
    showinfo("About", "The One Armed Bandit is a simplistic slot machine game")
def newStartingValue(self):
    self._optionsPanel = Toplevel(self.root)
    self._optionsPanel.title("Options")
    self._optionsPanel.grid()
    self._optionsPanelLabel = Label(self, text = "New Pot Starting Value").pack()
    self._optionsPanelLabel.grid(row=0,column=1)

我试图只显示必要的细节。我认为这应该可以帮助您弄清楚。如果没有,我可以根据需要粘贴所有代码。 我不明白为什么标签没有被放入 self._optionsPanel 对象中。

【问题讨论】:

  • 这一次太多的代码(我们真的需要查看所有菜单上的所有菜单项)而且还远远不够(它不能按原样运行,而且不可能猜猜需要添加什么使其 make 可运行)。请参阅SSCCE 了解有用的指导。
  • @abarnert 怎么太多但还不够????是的,它没有运行,因为它是部分的。我在上面说过。我只想知道如何在该子窗口中创建一个标签...我可以将所有代码放在那里以使其运行...但是您不会得到更少的代码。我不知道,老实说,我觉得你好像没有阅读问题的全部细节。如果你运行 slot().mainloop() 代码应该运行得很好它应该使用该代码创建一个带有菜单栏的窗口,我要评估的命令是选项。
  • 您认为我没有阅读您问题的哪一部分?同时,如果您阅读我的评论,它会准确地解释代码太多而不够。我可以试着重新措辞一下:你“试图只显示必要的细节”,但你包含了大量不必要的细节(如About… 菜单项和它运行的代码),并遗漏了一些必要的细节(如果很容易通过添加一行使程序可运行,那么添加一行,不要强迫我们猜测需要添加什么)。再次点击链接;它会比我在 SO 评论中解释得更好。

标签: python widget tkinter labels


【解决方案1】:

在下一行中,代码在self(即主窗口内的框架)内创建了Label小部件。

self._optionsPanelLabel = Label(self, text = "New Pot Starting Value").pack()

将其替换为(将新顶层设置为其父级):

self._optionsPanelLabel = Label(self._optionsPanel, text = "New Pot Starting Value").pack()

【讨论】:

    【解决方案2】:

    最后两行代码至少存在三个问题:

    self._optionsPanelLabel = Label(self, text = "New Pot Starting Value").pack()
    self._optionsPanelLabel.grid(row=0,column=1)
    

    首先,您将 self 作为父级传递给 Label。如果您希望它出现在 self._optionsPanel 上,您必须将 that 作为父级传递。

    其次,pack 返回None,所以self._optionsPanelLabel 将是None,因此尝试调用grid 将打印异常回溯到stderr 并立即退出函数。我敢打赌你在你的代码中多次犯过同样的错误,所以你可能把各种各样的事情都搞错了。

    第三,你不能在同一个小部件上调用packgrid。或者,更确切地说,你可以,但一旦你这样做了,pack 就被撤消了。 (这会破坏同一容器中packed 的任何其他小部件,因此在多个小部件上同时调用packgrid 是一个更大的问题。)

    【讨论】:

    • 你可以在同一个对象上调用 pack 和 grid ,它只是不会做你认为它会做的事情。如果你先调用 pack 然后调用 grid,pack 将被有效地忽略,反之亦然。当两者共享同一个父级时,您绝对不能做的是在一个小部件上使用 pack 并在另一个上使用网格。
    • @BryanOakley:感谢您的澄清;我会编辑答案。
    猜你喜欢
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 2020-08-09
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多