почему я не могу получить доступ к переменной в моем классе. python

#python #wxpython

#python #wxpython

Вопрос:

Я создал панель в своем основном классе. Затем я хотел создать кнопку, которая переходит на панель. Я создал отдельный класс для кнопки с именем panel_in_button и установил main в его параметрах в надежде, что смогу наследовать панель в моем основном классе, а затем использовать ее в своем классе panel_in_button, но по какой-то странной причине моя кнопка не отображается при запуске программы. Программа работает нормально, за исключением этого. Помогите, пожалуйста. Вот ошибка, которую я получаю, но я не думаю, что это имеет какое-либо отношение к тому, почему я не могу получить доступ к панели.

Предупреждение (из модуля предупреждений): Файл «C:Python27GUI practice.py «, строка 19 app=wx.PySimpleApp() #При этом запускается программа wxPyDeprecationWarning: С использованием устаревшего класса PySimpleApp.

 import wx

class main(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id, "My window", size=(300, 200))
        panel=wx.Panel(self)

class panel_in_button(main):
    def __init__(self):
        button = wx.Button(main.panel, label="exit",pos=(130,10), size=(60, 60))
        self.Bind(wx.EVT_BUTTON, self.closebutton, button)
        self.Bind(wx.EVT_CLOSE, self.closewindow)

    def closebutton(self, event):
       self.Close(True)

    def closewindow(self, event):
        self.Destroy()

if __name__=="__main__":
    app=wx.PySimpleApp() #This runs the program
    frame=main(parent=None, id=-1)#Displays the program
    frame.Show()
    app.MainLoop()
 

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

1. Вы никогда не используете panel_in_button класс вообще, поэтому он ничего не делает.

2. Что вы имеете в виду, говоря, что я никогда не использовал его?

3. @user3757068, ты никогда нигде ее не вызываешь.

Ответ №1:

Вы не можете написать код таким образом. main — это класс, а не экземпляр класса. Вы не должны вызывать метод класса напрямую. Вместо этого вам нужно создать его экземпляр, а затем вызвать метод вашего объекта. Нигде в этом коде вы не создаете экземпляр panel_in_button. В любом случае, я не рекомендую программировать таким образом. Вот очищенная версия:

 import wx

class main(wx.Frame):
    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id, "My window", size=(300, 200))
        panel=wx.Panel(self)

        button = wx.Button(panel, label="exit",pos=(130,10), size=(60, 60))
        self.Bind(wx.EVT_BUTTON, self.closebutton, button)
        self.Bind(wx.EVT_CLOSE, self.closewindow)

    def closebutton(self, event):
        self.Close(True)

    def closewindow(self, event):
        self.Destroy()

if __name__=="__main__":
    app=wx.App(False) #This runs the program
    frame=main(parent=None, id=-1)#Displays the program
    frame.Show()
    app.MainLoop()
 

Это объединяет два класса в один. Я также заменил ссылку на wx.PySimpleApp, поскольку она устарела. Я бы порекомендовал вам взглянуть на размеры вместо абсолютного позиционирования. Сайзеры определенно стоят того, чтобы их изучить.

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

1. Вы действительно можете вызвать класс напрямую — именно так вы создаете его экземпляр.

2. @BrenBarn — Да, я знаю. Но вы не должны использовать его так, как это было в OP. Это вызовет ошибку TypeError в отношении несвязанного метода.