Zachciało mi się zabawy w programowanie i na początek wymyśliłem sobie że skorzystam z jakiegoś gotowca. Znalazłem takiego tutaj i zrobiłem wszystko dokładnie krok po kroku jak na filmie. Niestety ale po wybraniu opcji “Build and Go” program się*kompiluje, tyle tylko że nic po za tym, no może oprócz tego że odpala się konsola. Co może być nie tak, skoro wszystko sprawdziłem po sto razy a mimo to nie mogę uruchomić tego programu?
No i problem się rozwiązał. Po głębokich poszukiwaniach w sieci, okazało się że winowajcą jest Python.framework, a raczej różne wersje tego pliku. Próbowałem to naprawić ręcznie, ale narobiłem więcej szkód aniżeli dobrego
W końcu skończyło się na tym że zainstalowałem Leoparda na nowo plus Xcode i obecnie wszystko śmiga aż miło ![]()
Jesli nie chcesz miec problemow z PyObjC to nie instaluj zadnych zewnetrznych wersji Python’a (np. ActivePython) tylko trzymaj sie tej dostarczanej z systemem. Jesli zainstalujesz cos z zewnatrz to bedziesz musiel doinstalowac caly pakiet PyObjC, co jest pracochlonne i irytujace. Przerabialem to probujac zrobic update Python’a do 2.6. Skonczylo sie na tym, ze usunalem 2.6 i wrocilem do systemowego 2.5 :(.
Instalowałjuż nic nie będę. Miałem różne wersje Pythona dlatego, iż nie wiedziałem wcześniej że przy instalacji Leoparda jest on standardową częścią systemu i dogrywałem Pythona ręcznie dawno temu. Trochęmnie nerwów i czasu kosztowało poszukiwanie rozwiązania.
Teraz mam tylko nadzieję że zapału mi nie zabraknie ![]()
PyObjC to swietna sprawa, wg mnie. Elastycznosc Python’a doskonale sie komponuje z potega Cocoa. Co prawda jest kilka denerwujacych spraw (np. obsluga panelu typu “sheet” proszacego o np. otwarcie pliku), trzeba sie nauczyc tlumaczyc selektory ObjectiveC na nazwy metod Python’a (zamiana “:” na “_”) itp, ale jak sie czlowiek przyzwyczai to idzie z gorki :).
Zycze wytrwalosci i powodzenia.
Proszę zawodowców o wyrozumiałość za poniższe pytanie, ale trochę mnie to męczy i będę wdzięczny za odpowiedź.
Napiszcie mi proszę do czego dokładnie służy Cocoa Bindings i czy jest potrzeba używania tego czegoś w połączeniu z Pythonem?
Wiem że w sieci są artykuły na temat Cocoa Bindings, ale mój angielski jest marny i wolałbym aby mi to wyjaśnił ktoś zaznajomiony z tematem.
No to mam kolejną prośbę, będę wdzięczny za przełożenie poniższego kodu w Obj-C na Pythona. Kombinuję, ale coś muszę robić źle bo cały czas wyskakuje mi błąd o atrybutach.
(void) sound: (NSSound *)sound didFinishPlaying: (BOOL)playbackSuccessful
Mówią że do “trzech razy sztuka”, tak więc spróbuję po raz trzeci zadać pytanie w kwestii Pythona, może tym razem będzie odzew.
Tak więc, w ramach nauki Pythona wymyśliłem sobie że napiszę odtwarzacz MP3. Jak na razie wszystko działa w miarę tak jak chcę. Dzisiaj przyszła pora aby pobrać czas z pliku i oczywiście zacząć odliczanie czasu do zera po rozpoczęciu odtwarzania. Do pobrania czasu i wyświetleniu go napisałem coś takiego (proszę o wyrozumiałość w kwestii nazewnictwa
) :
def dlugosc(self):
self.czas_z_pliku = self.plik.duration()
self.minuty_z_pliku = “%d” % (self.czas_z_pliku / 60)
self.sekundy_z_pliku = “%d” % (self.czas_z_pliku % 60)
dwukropek = “:”
self.sformatowany_czas = “%s%s%s” % (self.minuty_z_pliku, dwukropek, self.sekundy_z_pliku)
self.czas.setStringValue_(self.sformatowany_czas)
Wszystko pięknie ładnie pokazuje, tylko teraz tak się zastanawiam czy po takiej prezentacji czasu, będę w stanie jakoś sensownie zacząć odliczanie do zera? Dobrze to wykombinowałem czy też powinienem jakoś inaczej to zrobić?
Wydaje mi sie, ze jesli bedziesz chcial robic odliczanie do zera to i tak bedziesz trzymal czas trwania utworu w osobnej wlasnosci, zas sam kod odliczajacy czas i formatujacy odpowiednio trzymal w osobnym watku, zeby sobie nie zamulic UI.
Co do samego przeliczania i formatowania czasu to jest to troche “pod gorke”, bo wiele moglbys skrocic, np.
def dlugosc(self):
myCzasZPliku = self.plik.duration()
myMinuty = myCzasZPliku / 60
mySekundy = myCzasZPliku % 60
myWlasciwyCzas = "%d:%d" % (myMinuty, mySekundy)
self.czas.setStringValue_(myWlasciwyCzas) # To by bylo dobrze wpiac jako binding.
Poza tym proponuje, zebys przeszukal API Python’a i Cocoa pod katem operacji na czasie. Powinno tam byc cos, co przelicza ilosc sekund na dni, godziny, minuty i sekundy. Ten kod, ktory jest teraz ogranicza sie do do minut…
Pozdrawiam i zycze powodzenia :).
EDIT: Tak teraz sobie pomyslalem, ze generalnie rzecz biorac to powinienes miec kod formatujacy czas w postaci odrebnej funkcji/metody, zeby go nie dublowac.
Dzięki BilboBaggins za odpowiedź. To co wymyśliłem i tak chyba będę musiał sobie odpuścić, bo dzisiaj znalazłem poważną wadę tego rozwiązania. W przypadku gdy utwór trwa np 1.09 to wyświetla się 1.9, tak więc jest babol z tą resztą z dzielenia. Co do przeszukiwania API Cocoa i Pythona w kwestii czasu, to jest moduł “time” w Pythonie, tylko nie wiem jeszcze czy się przyda, a jeśli chodzi o Cocoa to czasami mam dość spore kłopoty żeby to przełożyć na Pythona więc raczej Cocoa sobie odpuszczę.
Faktycznie, o tym nie pomyslalem.
Poprawka:
def dlugosc(self):
myCzasZPliku = self.plik.duration()
myMinuty = myCzasZPliku / 60
mySekundy = myCzasZPliku % 60
myWlasciwyCzas = "%d:%s" % (myMinuty, str(mySekundy).zfill(2))
self.czas.setStringValue_(myWlasciwyCzas) # To by bylo dobrze wpiac jako binding.
Tez sie przyjrzalem temu modulowi, ale nie ma tam interesujacej Cie funkcji.
Generalnie rzecz biorac uzywanie Cocoa w Python’ie to kwestia przeniesienia skladni ObjectiveC na skladnie Python’a. Jesli chcesz latwo wgryzc sie w PyObjC to polecam najpierw zapoznanie sie (chocby tylko wstepne) z metodyka programowania w Cocoa z uzyciem ObjectiveC. Kluczem jest zrozumienie dokumentacji i zapamietanie, ze “:” w selektorach trzeba tlumaczyc na “_” ;). Co prawda troche zamoty jest z obsluga sheet’ow, ale w dokumentacji PyObjC znajdziesz niezbedne wskazowki.
Zycze wytrwalosci i powodzenia.
W module “time” faktycznie niczego nie znalazłem co mogłoby się przydać, ale znalazłem moduł “datetime” a w nim coś takiego jak “timedelta”. Jutro trzeba będzie przetestować.
Heh, dawno nie programowalem na serio w Python’ie, czego efektem jest skleroza :).
Oczywiscie, obiekty klasy timedelta swietnie sie na Twoje potrzeby nadaja.
Ponizej przykladowy kod. Co prawda nie obsluguje on dni, ale w przypadku odtwarzacza MP3 chyba mozna to pominac ;). Zeby rozszerzyc funkcje o obsluge dni trzebaby przerobic wyrazenie regularne, ktorym filtruje reprezentacje obiektu timedelta.
def BTHHumanReadableTime(aSecondsCount = 0):
try:
myDelta = timedelta(seconds = aSecondsCount)
except:
myDelta = ''
myRegex = re.compile(r'(?P<hours>[0-9]{1,2}):(?P<minutes>[0-9]{1,2}):(?P<seconds>[0-9]{1,2})')
myStringTime = myRegex.match(str(myDelta))
if myStringTime == None:
return '00:00' # Something has gone wrong?
else:
if myStringTime.group('hours') != '0':
return '%s:%s:%s' % ( myStringTime.group('hours').zfill(2), myStringTime.group('minutes').zfill(2), myStringTime.group('seconds').zfill(2) )
else:
return '%s:%s' % ( myStringTime.group('minutes').zfill(2), myStringTime.group('seconds').zfill(2) )
Mysle, ze taki “formatter” powinien dac rade :).
PS. Czy istnieje opcja podzielenia sie efektem Twojej pracy?
No to najpierw przerwa na zdobycie głębszej wiedzy na temat wyrażeń regularnych ![]()
Dzięki za powyższy kod, jeśli mogę to spróbuję go wykorzystać.
Co do dzielenia, to chodzi Ci o obecny stan prac? Na razie nie działa wszystko jeszcze tak jakbym chciał. Nie zmieniają się np stany niektórych przycisków po naciśnięciu innego, który taką zmianę powinien wywołać. Jeśli jesteś jednak zainteresowany tym co mam obecnie to mogę Ci podesłać to co do tej pory zrobiłem.
Wlasnie zauwazylem, ze forum postanowilo usunac znaczki “<” i “>” z wyrazenia regularnego :|. Juz poprawilem, ale jesli bedziesz miec jeszcze jakies problemy to daj znac, a wysle Ci plik *.py z ta funkcja :).
Wyrazenia regularne to prawdziwa potega. Jesli tylko bedziesz z nich umiejetnie korzystal to np. wyciagniecie danych z HTML’a bedzie pestka. Przydatna moze byc ta strona i ta wtykalka do Firefox’a :). Tylko pamietaj, zeby podawac regexy jako raw-string’i (stad ta literka r przed lancuchem tekstowym), bo inaczej silnik moze zwariowac :).
Ten kod (z racji miejsca jego publikacji) jest oczywiscie otwarty. Przyjmijmy, ze na GPL v.2. Wynika z tego, ze mozesz go wykorzystac :).
Co do Twojego kodu to zdaje sie na Ciebie. Jesli uznasz, ze projekt jest na tyle dojrzaly, zeby go pokazac Swiatu to ja z przyjemnoscia dopisuje sie do listy wysylki.
PS. Wpadlem wlasnie na pomysl, ze moznaby z tego zrobic subklase NSFormatter, zeby po prostu wpinac liczbe sekund utworu przez binding i formatowac, ale to juz zupelnie inna bajka :). Poza tym to dzieki za temat - przyjrze sie klasie NSDateFormatter i moze przepisze powyzsza funkcje na Cocoa :).
Trochę czasu zapewne jeszcze minie zanim zdecyduje się upublicznić efekty mojej pracy. Jednak jak tylko się uporam z tymi podstawowymi problemami, to pochwalę się tym co uda mi się*zrobić.
Dzięki BilboBaggins za wszystkie uwagi i pomoc ![]()
Dzisiaj wkleiłem podany przez Ciebie kod do przeliczania sekund i działa wyśmienicie.
Dzięki ![]()
Ciesze sie, ze jest OK. Co prawda ten kod przeszedl przez szybki prawie-jak-unit-test, ale nigdy nie mozna miec pewnosci, ze na produkcji nic sie nie posypie :).
A tak, troche na marginesie ale ciagle w temacie, dodam, ze i ja obiecalem sie porzadnie wziac do roboty i domknac jeden rozgrzebany przez siebie mini-projekcik :). Bedzie to cos, co powstalo w wyniku eksperymentu a przerodzilo sie w dosc ciekawa aplikacje :). Jeszcze tylko musze kilka elementow dopiescic i niedlugo puszcze na Swiat alfe :D.