#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 в отношении несвязанного метода.