使用Tkinter在子窗口内创建标签

时间:2013-11-21 02:54:22

标签: python widget tkinter labels

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

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对象。

2 个答案:

答案 0 :(得分:1)

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

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

将其替换为(将new toplevel设为其父级):

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

答案 1 :(得分:1)

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

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

首先,您将self作为父项传递给Label。如果您希望它显示在self._optionsPanel上,则必须将 作为父级传递。

其次,pack返回None,因此self._optionsPanelLabel将为None,因此调用grid的尝试将打印异常追溯到{{1}并立即退出该函数。我愿意打赌你在你的代码中多次犯了同样的错误,所以你可能会把各种各样的错误弄错了。

第三,您无法在同一个小部件上调用stderrpack。或者,你可以,但是一旦你这样做,grid就会撤消。 (这会破坏同一容器中的任何其他小部件pack,因此在多个小部件上同时调用packpack是一个更大的问题。)