Reputation: 370
I am trying to use Dunn's refactored Menubar code but always run into problems with it. Here's the code:
#!/usr/bin/env python
import wx
class Darkscreen(wx.Frame):
def __init__(self, parent, id):
style = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, parent, id, 'Darkscreen10b1', size=(340, 200), style=style)
panel = wx.Panel(self, -1)
panel.SetBackgroundColour("Black")
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
self.createMenuBar()
self.Centre()
def menuData(self):
return [("&File", (
("&Quit\tCtrl+Q", "Quit", self.OnCloseWindow))),
("&Color", (
("&Black", "", self.OnBlack, wx.ITEM_RADIO),
("&White", "", self.OnWhite, wx.ITEM_RADIO),
("&Red", "", self.OnRed, wx.ITEM_RADIO),
("&Green", "", self.OnGreen, wx.ITEM_RADIO),
("&Blue", "", self.OnBlue, wx.ITEM_RADIO)))]
def createMenuBar(self):
menuBar = wx.MenuBar()
for eachMenuData in self.menuData():
menuLabel = eachMenuData[0]
menuItems = eachMenuData[1]
menuBar.Append(self.createMenu(menuItems), menuLabel)
self.SetMenuBar(menuBar)
def createMenu(self, menuData):
menu = wx.Menu()
for eachItem in menuData:
if len(eachItem) == 2:
label = eachItem[0]
subMenu = self.createMenu(eachItem[1])
menu.AppendMenu(wx.NewId(), label, subMenu)
else:
self.createMenuItem(menu, *eachItem)
return menu
def createMenuItem(self, menu, label, status, handler, kind=wx.ITEM_NORMAL):
if not label:
menu.AppendSeparator()
return
menuItem = menu.Append(-1, label, status, kind)
self.Bind(wx.EVT_MENU, handler, menuItem)
def OnBlack(self, event):
panel.SetBackgroundColour("Black")
def OnWhite(self, event):
panel.SetBackgroundColour("White")
def OnRed(self, event):
panel.SetBackgroundColour("Red")
def OnGreen(self, event):
panel.SetBackgroundColour("Green")
def OnBlue(self, event):
panel.SetBackgroundColour("Blue")
def OnCloseWindow(self, event):
self.Destroy()
if __name__ == '__main__':
app = wx.App(redirect=True, filename="dserr.txt")
frame = Darkscreen(parent=None, id=-1)
frame.Show()
app.MainLoop()
Here's the error:
Traceback (most recent call last):
File "L:\Rodney's\Development\Python\Working\darkscreen\darkscreen.py", line 67, in <module>
frame = Darkscreen(parent=None, id=-1)
File "L:\Rodney's\Development\Python\Working\darkscreen\darkscreen.py", line 13, in __init__
self.createMenuBar()
File "L:\Rodney's\Development\Python\Working\darkscreen\darkscreen.py", line 31, in createMenuBar
menuBar.Append(self.createMenu(menuItems), menuLabel)
File "L:\Rodney's\Development\Python\Working\darkscreen\darkscreen.py", line 42, in createMenu
self.createMenuItem(menu, *eachItem)
TypeError: createMenuItem() takes at most 6 arguments (14 given)
I have followed this code in my head dozens of time and I cannot figure out what's wrong. I have added and taken away parentheses everwhere in the menuData object to no avail.
Upvotes: 0
Views: 295
Reputation: 12158
The issue is in Parenthesized forms:
A parenthesized expression list yields whatever that expression list yields: if the list contains at least one comma, it yields a tuple; otherwise, it yields the single expression that makes up the expression list.
See also this example:
>>> for x in ('hello'):
... print x
...
h
e
l
l
o
Adding a comma creates a tuple:
>>> for x in ('hello',):
... print x
...
hello
Your first list item reads:
("&File", (("&Quit\tCtrl+Q", "Quit", self.OnCloseWindow) )
# ^-- no comma here
So your code expects an iterable, but as the comma is missing, it starts iterating over the string value "&Quit\tCtrl+Q"
(14 characters). Adding a comma where indicated creates a tuple and fixes your code.
Upvotes: 1