wxpython phoenix утверждает, что аргументы инициализации фрейма неверны

#python #user-interface #wxpython #python-3.5

#python #пользовательский интерфейс #wxpython #python-3.5

Вопрос:

Я пытаюсь создать простое окно с меню в wx python 3.0.4. На самом деле я получаю сообщение об ошибке:

ошибка типа wx.Frame.init(self, ID_ANY, «Title», DefaultPosition, (350 200), DEFAULT_FRAME_STYLE, FrameNameStr): Frame():

аргументы не соответствовали ни одному перегруженному вызову: перегрузка 1: слишком много

перегрузка аргументов 2: аргумент 1 имеет неожиданный тип ‘StandardID’

Даже этот код взят из документации. Может кто-нибудь сказать мне, что я делаю не так, пожалуйста?

 import wx
from wx import *

class MainWindow(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, ID_ANY, "Title", DefaultPosition, (350,200), DEFAULT_FRAME_STYLE, FrameNameStr)
        self.Bind(wx.EVT_CLOSE, self.OnClose)

        menuBar = wx.MenuBar()
        menu = wx.Menu()
        m_exit = menu.Append(wx.ID_EXIT, "Eamp;xit", "Close window and exit program.")
        self.Bind(wx.EVT_MENU, self.OnClose, m_exit)
        menuBar.Append(menu, "amp;File")
        menu = wx.Menu()
        m_about = menu.Append(wx.ID_ABOUT, "amp;About", "Information about this program")
        self.Bind(wx.EVT_MENU, self.OnAbout, m_about)
        menuBar.Append(menu, "amp;Help")
        self.SetMenuBar(menuBar)

        self.main_panel = MainPanel(self)

    def OnClose(self, e):
        self.Close()

    def OnAbout(self, event):
        dlg = AboutBox(self)
        dlg.ShowModal()
        dlg.Destroy()


class MainPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

class AboutBox(wx.MessageDialog):
    def __init__(self, parent):
        wx.MessageDialog.__init__(parent, "About", "About", wx.OK | wx.ICON_INFORMATION, pos=DefaultPosition)
        self.CentreOnParent(wx.BOTH)
        self.SetFocus()


if __name__ == "__main__":
    app = wx.App(False)
    frame = MainWindow()
    frame.Show()
    app.MainLoop()
 

Ответ №1:

 Frame(parent, id=ID_ANY, title="", pos=DefaultPosition,
  size=DefaultSize, style=DEFAULT_FRAME_STYLE, name=FrameNameStr)
 

Вы пропустили родительский аргумент.

Рабочий код

 import wx

class MainWindow(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(
            self, None, wx.ID_ANY, "Title", wx.DefaultPosition, (350,200),
            wx.DEFAULT_FRAME_STYLE, wx.FrameNameStr)
        self.Bind(wx.EVT_CLOSE, self.OnClose)

        menuBar = wx.MenuBar()
        menu = wx.Menu()
        m_exit = menu.Append(
            wx.ID_EXIT, "Eamp;xit", "Close window and exit program.")
        self.Bind(wx.EVT_MENU, self.OnClose, m_exit)
        menuBar.Append(menu, "amp;File")
        menu = wx.Menu()
        m_about = menu.Append(
            wx.ID_ABOUT, "amp;About", "Information about this program")
        self.Bind(wx.EVT_MENU, self.OnAbout, m_about)
        menuBar.Append(menu, "amp;Help")
        self.SetMenuBar(menuBar)

        self.main_panel = MainPanel(self)

    def OnClose(self, e):
        self.Destroy()

    def OnAbout(self, event):
        dlg = AboutBox(self)
        dlg.ShowModal()
        dlg.Destroy()


class MainPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

class AboutBox(wx.MessageDialog):
    def __init__(self, parent):
        wx.MessageDialog.__init__(
            self, parent, "About", "About", wx.OK | wx.ICON_INFORMATION,
            pos=wx.DefaultPosition)
        self.CentreOnParent(wx.BOTH)


if __name__ == "__main__":
    app = wx.App(False)
    frame = MainWindow()
    frame.Show()
    app.MainLoop()
 

Комментарии:

1. каким должен быть родительский элемент? приложение wx?

2. Родительский элемент управления в данном случае использует None в качестве своего главного окна и не является дочерним элементом чего-либо.

3. если я не добавлю туда ни одного, я получу: TypeError: для дескриптора ‘ init ‘ требуется объект ‘sip.simplewrapper’, но получен ‘NoneType’