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

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

Предупреждение (из модуля предупреждений): Файл "C:\Python27\GUI 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 ответ

Решение

Вы не можете написать код таким образом. 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, поскольку это устарело. Я бы порекомендовал вам взглянуть на размеры вместо абсолютного позиционирования. Сайзеры определенно стоят усилий, чтобы учиться.

Другие вопросы по тегам