我不知道为什么会这样,但我正在尝试使用来自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对象。
答案 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}并立即退出该函数。我愿意打赌你在你的代码中多次犯了同样的错误,所以你可能会把各种各样的错误弄错了。
第三,您无法在同一个小部件上调用stderr
和pack
。或者,你可以,但是一旦你这样做,grid
就会撤消。 (这会破坏同一容器中的任何其他小部件pack
,因此在多个小部件上同时调用pack
和pack
是一个更大的问题。)