wxPython 多个 windows 范围问题

wxPython multiple windows scope issue

我正在尝试通过创建一个简单的应用程序来组织行程来磨练我的 Python 技能。该应用程序的基础是您输入要添加的任务,然后弹出另一个 window 询问任务的截止日期和优先级。第二个 window 有一个提交按钮,可以将所有收集到的信息添加到多列列表框中。

我的问题是在何处创建一个数组来保存信息以便添加。我不能把它添加到add函数本身,因为它需要被其他函数引用。

我试过将它添加到我的主窗口的 __init__,但那是我卡住的地方。我不知道如何在数组存在后引用它。简单地引用名称 (toAdd) 给我例外

Traceback (most recent call last):
  File "Making GUI - First Shot (Development).py", line 60, in AddItem
    toAdd.append(appendItem)
NameError: global name 'toAdd' is not defined

这是我的代码:

import wx

class mainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(650, 500))

        panel = wx.Panel(self)

        vbox = wx.BoxSizer(wx.VERTICAL)

        hbox1 = wx.BoxSizer(wx.HORIZONTAL)

        hbox2 = wx.BoxSizer(wx.HORIZONTAL)

        menubar = wx.MenuBar()

        topFont = wx.Font(20, wx.SWISS, wx.NORMAL, wx.NORMAL)

        self.topLabel = wx.StaticText(panel, size = (-1, -1), label="Itinerary")

        font = wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL)

        self.topLabel.SetFont(topFont)

        vbox.Add(self.topLabel, 0, wx.ALL, 2)

        vbox.Add((-1, 10))

        self.listBox = wx.ListCtrl(panel, style = wx.LC_REPORT)
        self.listBox.InsertColumn(0, "Priority", width = 150)
        self.listBox.InsertColumn(0, "Due Date (if applicable)", width = 250)
        self.listBox.InsertColumn(0, "Task", width=250)

        self.listBox.SetFont(font)
        vbox.Add(self.listBox, 1, wx.EXPAND | wx.ALL, 2)

        hbox1.Add((5, -1))

        self.newItemInput = wx.TextCtrl(panel, size = (400, -1))
        hbox2.Add(self.newItemInput, 1, wx.ALIGN_LEFT | wx.ALL, 1)

        self.submitButton = wx.Button(panel, size = (100, -1))
        self.submitButton.SetLabel("Hello")
        self.Bind(wx.EVT_BUTTON, self.AddItem, self.submitButton)
        hbox2.Add(self.submitButton,  1, wx.ALIGN_RIGHT | wx.ALL, 2)

        vbox.Add(hbox1, 0, wx.ALL, 2)
        vbox.Add(hbox2, 0, wx.EXPAND | wx.ALL, 2)

        vbox.Add((-1, 35))

        panel.SetSizer(vbox)

        self.Show(True)

        toAdd = []

    def AddItem(self, event):
        appendItem = self.newItemInput.GetValue()
        toAdd.append(appendItem)
        confirmBox = wx.Frame(frame, title = "Task Details", size = (300, 150))
        confirmVert = wx.BoxSizer(wx.VERTICAL)
        confirmHoriz1 = wx.BoxSizer(wx.HORIZONTAL)
        confirmHoriz2 = wx.BoxSizer(wx.HORIZONTAL)
        confirmHoriz3 = wx.BoxSizer(wx.HORIZONTAL)
        confirmHoriz4 = wx.BoxSizer(wx.HORIZONTAL)

        confirmPrompt = wx.StaticText(confirmBox, size = (25, -1), label = "Due Date for " + toAdd[0])
        confirmHoriz1.Add(confirmPrompt, 1, wx.EXPAND | wx.ALIGN_CENTER)

        addingDate = wx.TextCtrl(confirmBox, size = (25, -1))
        confirmHoriz2.Add(addingDate, 1, wx.EXPAND | wx.ALIGN_CENTER)

        confirmPriority = wx.StaticText(confirmBox, size = (25, -1), label = "Priority")
        confirmHoriz3.Add(confirmPriority, 1, wx.EXPAND | wx.ALIGN_CENTER)

        addingPriority = wx.TextCtrl(confirmBox, size = (25, -1))
        confirmHoriz4.Add(addingPriority, 1, wx.EXPAND | wx.ALIGN_CENTER)

        addListButton = wx.Button(confirmBox, size = (-1, 25), label = "Submit")

        confirmVert.Add(confirmHoriz1, 0, wx.EXPAND | wx.ALIGN_CENTER)
        confirmVert.Add(confirmHoriz2, 0, wx.EXPAND | wx.ALIGN_CENTER)
        confirmVert.Add(confirmHoriz3, 0, wx.EXPAND | wx.ALIGN_CENTER)
        confirmVert.Add(confirmHoriz4, 0, wx.EXPAND | wx.ALIGN_CENTER)
        confirmVert.Add(addListButton, 0, wx.EXPAND | wx.ALIGN_CENTER)

        def itemSubmit(self):
            date = addingDate.GetValue()
            priority = addingPriority.GetValue()
            toAdd.append(date)
            toAdd.append(priority)
            panel.listBox.Append(toAdd)

        confirmBox.Bind(wx.EVT_BUTTON, itemSubmit, addListButton)



        confirmBox.SetSizer(confirmVert)
        confirmBox.Show()

app = wx.App(False)
frame = mainWindow(None, "Itinerary Manager")

app.MainLoop()

我该如何让 AddItem 将信息追加到 toAdd,以便我可以将 toAdd 追加到主 window 上的 ListCtrl?

为您的数据项使用 self 引用,因此声明

toAdd = []

作为

self.toAdd[]

这也应该适用于您的其他变量。 每个 class 方法的第一个参数,包括 init,始终是对 class 当前实例的引用。按照惯例,此参数始终命名为 self。这不是规则,只是约定俗成。