Python TypeError при использовании Bind для wx.Button - PullRequest
0 голосов
/ 05 декабря 2011

У меня есть класс с именем WxFrame, который создает фрейм wxPython. Я добавил метод createRunButton, который получает self и pydepp, который является объектом класса PyDEPP

import wx

class WxFrame(wx.Frame):
    def __init__(self, parent, title):
        super(WxFrame, self).__init__(parent, title=title)
        self.Maximize()
        self.Show()

    def createRunButton(self,pydepp):
        #pydepp.run()
        self.runButton = wx.Button(self, label="Run")
        self.Bind(wx.EVT_BUTTON, pydepp.run, self.runButton

Это класс PyDEPP:

class PyDEPP:
    def run(self):
        print "running"

Я создаю его и запускаю с:

import wx
from gui.gui import WxFrame
from Depp.Depp import PyDEPP

class PyDEPPgui():
    """PyDEPPgui create doc string here ...."""
    def __init__(self,pydepp):
        self.app = wx.App(False)
         ##Create a wxframe and show it
        self.frame = WxFrame(None, "Cyclic Depp Data Collector - Ver. 0.1")
        self.frame.createRunButton(pydepp)
        self.frame.SetStatusText('wxPython GUI successfully initialised')

if __name__=='__main__':
    #Launch the program by calling the PyDEPPgui __init__ constructor
    pydepp = PyDEPP()
    pydeppgui = PyDEPPgui(pydepp)
    pydeppgui.app.MainLoop()

Я получаю ошибку при запуске приведенного выше кода: TypeError: run () принимает ровно 1 аргумент (2 дано)

Однако, если я закомментирую привязку и раскомментирую строку pydepp.run (), тогда она будет работать нормально.

Ответ очевиден, я уверен, но я никогда не изучал кодирование CompSci или OO.

Ответы [ 2 ]

2 голосов
/ 05 декабря 2011

Событие передается в качестве аргумента функции обратного вызова.Это должно работать:

class PyDEPP:
    def run(self, event):
        print "running"
1 голос
/ 05 декабря 2011

Когда событие инициируется, в функцию обратного вызова run () передаются два аргумента: объект, который вызвал событие, и объект wxEvent. Поскольку run принимает только один аргумент в вашем коде, интерпретатор выдает эту ошибку, которая сообщает вам, что вы предоставили слишком много аргументов.

Заменить

run(self):  # Expects one argument, but is passed two. TypeError thrown

с

run(self, event): # Expects two arguments, gets two arguments.  All is well

и должно работать.

Это один случай, когда ошибка многое говорит вам о том, что не так с кодом. Учитывая, что «run () принимает ровно 1 аргумент (2 дано)», вы сразу же знаете, что либо вы случайно передали дополнительный аргумент, либо run должен ожидать другого.

...