Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Może tu się znajdzie ktoś kto mnie oświeci.
Mam sobie prosty programik z wykorzystaniem wxPython, problem w tym że przycisk "close" znajdujący sie na pierwszej zakładce po naciśnięciu wywala taki sobie błąd:
AttributeError: 'Program' object has no attribute 'Close'
Składniowo wszystko gra bo jak wstawiłam tam MessageBox to po naciśnięciu na button wyskakuje.
Nie trybię, o co mu chodzi z tym Close? Ryję przykłady w sieci, wszędzie jest I-DEN-TY-CZNIE.
kod:
import wx class Program(wx.App): def OnInit(self): Ramka = wx.Frame(None, -1, "Eld000pa",size=(300,200)) zak = wx.Notebook(Ramka, -1, style=wx.NB_TOP, pos=(10,20), size=(350,250)) Pan1 = wx.Panel(zak, -1) Pan2 = wx.Panel(zak, -1) Pan2.SetBackgroundColour('Blue') #dziala :) zak.AddPage(Pan1, "Prostokat") zak.AddPage(Pan2, "Trojkat") Tekst1 = wx.StaticText(Pan1, -1, "wx ssie", pos=(20,20)) Tekst2 = wx.StaticText(Pan2, -1, "Jakis tekst", pos=(50, 50)) button = wx.Button(Pan1, -1, 'close', pos=(70, 70), size=(50,50)) self.Bind(wx.EVT_BUTTON, self.OnClose) Ramka.Show() return -1 def OnClose(self, event): #self.Close() wx.MessageBox(u"Wciśnięto przycisk") #to smiga, a self.Close() nie :-( if __name__=='__main__': #app=wx.PySimpleApp() app=Program() app.MainLoop()
dopiero się tego uczę, nie mogę powiedzieć żeby to było aż tak bardzo intuicyjne i jasne więc jeśli znajdzie się tu ktoś kto będzie umiał pomóc/zaczarować tak żeby 'close' zamykało okienko to proszę o wyrozumiałość. Generalnie w wx są jakieś śmieszne zależności między tym wszystkim i trochę nie ogarniam co z czym i dlaczego.
Pozdrawiam.
///edit:
Oo, trzeba było się zdrzemnąć. Działa. Tylko zmieniłam z wx.App na wx.Frame i wprowadziłam kilka malutkich poprawek (tu słówko wyciąć, tam wkleić), jakby ktoś był ciekaw to poniżej jest kod do wglądu. Ogólnie nadal nie ogarniam, ale przynajmniej wiem ze trzeba się trzymać wx.Frame.
import wx class Program(wx.Frame): def __init__(self,parent,id): wx.Frame.__init__(self, parent,id, 'Eld000pa',size=(300,200)) self.panel=wx.Panel(self) zak = wx.Notebook(self.panel, -1, style=wx.NB_TOP, pos=(10,20), size=(350,250)) #zakladki Pan1 = wx.Panel(zak, -1) Pan2 = wx.Panel(zak, -1) Pan2.SetBackgroundColour('Blue') #dziala :) zak.AddPage(Pan1, "Prostokat") zak.AddPage(Pan2, "Trojkat") #zak.AddPage(Pan1, "Koleczko") #napisy Tekst1 = wx.StaticText(Pan1, -1, "wx ssie", pos=(20,20)) Tekst2 = wx.StaticText(Pan2, -1, "Jakis tekst", pos=(50, 50)) button = wx.Button(Pan1, -1, 'close', pos=(70, 70), size=(50,50)) self.Bind(wx.EVT_BUTTON, self.OnClose) def OnClose(self, event): self.Close() #wx.MessageBox(u"Wciśnięto przycisk") if __name__=='__main__': app=wx.PySimpleApp() frame = Program(parent=None, id=-1) frame.Show() app.MainLoop()
Ostatnio edytowany przez Trin (2012-05-01 09:03:59)
Offline
Imho komunikat jest jasny. 'Program' object has no attribute 'Close' - klasa program nie ma atrybutu/metody Close. No i faktycznie nie ma, więc wywołanie czegoś czego nie ma to powoduje. Możesz zaglądać do dokumentacji wx by poznać atrybuty i metody klas. Część jest dziedziczona, więc trzeba patrzeć z tego co widzę też po rodzicach. Ale może lepiej byłoby użyć jakiegoś IDE dla Pythona, które taki błąd wychwyci.
Offline
Moźe w tym miejscu nie self.close ma być a COŚINNEGO.close ?
Nie bylo w Pythonie czegoś takiego jak .__doc__ ?
Ostatnio edytowany przez TheAnt (2012-05-01 11:41:21)
Offline
Ant - nie kombinuj :D
kamikaze - ano rację Ci muszę przyznać, miałam trochę dość czytania dokumentacji i chciałam "sama". Thx.
..wx jest dość dziwne.
Offline
jak na ironię, jak przestałam kombinować jak przysłowiowy koń pod górę to zaczęło iść. Ant, polecam wx :D
Offline
pomógłby mi ktoś ogarnąć, co jest grane że nie wpisuje do pliku tekstowego tego co zaznaczy użytkownik tylko jeden wariant odpowiedzi na który się uparł (inną niż zaznaczona?)
tu kod, bo długawy.
a ja już ślepnę i nie widzę.
W klasie pierwszego okna np. nie wpisuje wieku, a także prawidłowej płci.
http://wklej.dug.net.pl/4159
Ostatnio edytowany przez Trin (2012-05-08 23:00:54)
Offline
No bo: if (self.cb1.GetValue()=='True') co to jest? GetValue() zwraca bool nie string. Powinno być if (self.cb1.GetValue()==True), wtedy działa.
Offline
Oo kamikaze - wiedziałam że nikt mi nie odpowie tak jak Ty:)
dzięki, poplątałam się w tych widżetach przez moment stad błedy za które mi dosłownie wstyd :<
Offline