2013-11-21 24 views
0

我不知道为什么发生这种情况,但我试图从MenuBar创建一个Tkinter的“选项”子窗口。子窗口弹出,但当我尝试在子窗口内创建标签时,标签出现在主窗口中......我不知道为什么会发生这种情况。我一直在搜索互联网一段时间,无法找到我的问题的答案。这是代码。使用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对象。

+1

这是一次太多的代码(我们真的需要看到所有的所有菜单上的菜单项)并不够接近(它不能按原样运行,并且无法猜测需要将_make_添加到可运行状态的内容)。请参阅[SSCCE](http://sscce.org)获取有用信息。 – abarnert

+0

@abarnert它是如何太多,但几乎不足够?是的,它不会运行,因为它是部分的。我在顶部说过。我只想知道如何在该子窗口内创建一个标签......我可以将所有代码放在那里以便使其运行......但是您不会获得更少的代码。我不知道,我真的觉得好像你没有读到这个问题的全部细节。如果你运行的是slot(),代码应该运行得很好。mainloop()它应该用代码创建一个带有菜单栏的窗口,我要评估的命令是options。 –

+1

你认为我没看过什么部分?同时,如果您阅读了我的评论,它就会明确地解释代码太多而不够。我可以尝试重新说一下它:你“试图只显示必要的细节”,但是你包含了大量不必要的细节(例如'About ...'菜单项和它运行的代码),并且省略了一些必要的细节细节(如果通过添加一行可以使程序易于运行,那么添加一行,不要强迫我们猜测需要添加的内容)。再次,按照链接;它会在SO评论中解释得比我更好。 – abarnert

回答

1

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

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

用(设置新的顶级作为其父)替换它:

self._optionsPanelLabel = Label(self._optionsPanel, text = "New Pot Starting Value").pack() 
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._optionsPanelLabelNone,所以试图调用grid将打印异常回溯到stderr,并立即退出该功能。我敢打赌,你在代码中多次犯了同样的错误,所以你可能会把各种各样的错误联系起来。

第三,您不能在同一个小部件上调用packgrid。或者,相反,你可以,但是一旦你这样做,pack是撤消。 (这打破了任何其他部件pack编在同一个容器,因此调用多个部件都packgrid是一个更大的问题。)

+0

谢谢,我会记下那个... –

+1

你可以在同一个对象上调用pack和grid,它只是不会做你认为它会做的事情。如果您打包打包,然后打电话,打包将被有效忽略,反之亦然。你绝对不能做的是在一个小部件和另一个小部件上使用包,当两个人共享同一个父部件时。 –

+0

@BryanOakley:谢谢你的澄清;我会编辑答案。 – abarnert