Popularny post ethanak Napisano 7 sierpnia Popularny post Udostępnij Napisano 7 sierpnia Często pojawia się konieczność użycia pakietu płytko w konkretnej wersji. Szczególnie dla ESP32, gdzie różne wersje pakietów mogą działać inaczej, a wersje maior w ogóle nie są ze sobą kompatybilne - jest to wręcz niezbędne. Artuino IDE oczywiście pozwala zainstalować dowolną wersję pakietu, ale tylko jedną konkretną, a proces instalacji wcale nie jest taki szybki. Dodatkowo jeśli dokonaliśmy jakichś zmian w katalogu pakietu (w moim przypadku to dodanie nowych układów partycji i modyfikacja boards.txt) zaczyna być to niespecjalnie wygodne... Postanowiłem więc zrobić prosty przełącznik wersji. Działa dla ESP32, ale można go oczywiście zmodyfikować tak, aby działał dla dowolnych płytek. Rozwiązanie jest niestety linux-only, ale po drobnych zmianach (ścieżki, polecenia powinny działać tak samo) powinno ruszyć na Macu. A na pewno nowoczesny Windows pozwoli na zrobienie podobnego przełącznika... pozwoli, prawda? Kod jest stosunkowo prosty: #!/bin/bash #położenie docelowego pakietu ESP32 dstitem=${HOME}/.arduino15/packages/esp32 #tu są różne wersje srcdir=${HOME}/.arduinoESP32 if [ -n "$1" ]; then if [ "$1" = "off" ] ; then #przygotowanie do instalacji rm ${dstitem} echo "Gotowy do instalacji nowej wersji" exit 0 fi if [ "$1" = "show" ] ; then if a=$(readlink ${dstitem}) ; then basename $a else echo "Brak skonfigurowanej wersji" fi exit 0 fi # parametr to numer wersji src=${srcdir}/$1 if [ ! -d ${src} ] ; then echo "Brak wersji $1" else ln -sfn ${src} ${dstitem} echo "Ustawiona wersja $1" fi else #bez parametrów listuje zawartość katalogu ls ${srcdir} fi Jak tego użyć? Trzeba utworzyć plik o zawartości jak wyżej (ja nadałem mu nazwę espversion) i nadać mu prawa do wykonywania. Skrypt najlepiej utworzyć w katalogu gdzie przechowujemy własne polecenia (np. ~/bin/). Następnie trzeba sobie stworzyć katalog, który będzie zawierał wszystkie wersje pakietów. Ja utworzyłem do tego celu katalog ~/.arduinoESP32. Następnie należy kolejno zainstalować potrzebne wersje, a po instalacji przenieść zawartość pakietu do odpowiedniego miejsca. Przykładowo: po instalacji wersji 3.0.4 należy wykonać coś w stylu: mv ~/.arduino15/packages/esp32 ~/.arduinoESP32/3.0.4 Pamiętać należy, że przed jakąkolwiek próbą instalacji nowej wersji należy usunąć link ~/.arduino15/packages/esp32 - jeśli tego nie zrobimy, wersja zostanie nadpisana! Mamy więc teraz następujące możliwości: Listowanie dostępnych wersji: espversion Pokazanie która wersja jest aktualnie wybrana: espversion show Przygotowanie do instalacji nowej wersji (usunięcie linku): espversion off Zmiana wersji: espversion <numer_wersji> Tak więc teraz można sobie zmieniać wersje w locie, np: espversion 2.0.17 włączy wersję 2.0.17, o ile taką mamy przygotowaną. Pamiętać równie należy, że przy przełączaniu wersji Arduino IDE powinien być wyłączony! Jeśli ktoś korzysta z mojego pyrduino, należy przed kompilacją wydać polecenie: ardu -clean I to tyle. Przyjemnego przełączania życzy ethanak 5 Link do komentarza Share on other sites More sharing options...
Popularny post ethanak 11 sierpnia Autor tematu Popularny post Udostępnij 11 sierpnia No i jeszcze ciekawostka (dla tych co nie lubią terminala): wersja klikana: #!/bin/bash #położenie docelowego pakietu ESP32 dstitem=${HOME}/.arduino15/packages/esp32 #tu są różne wersje srcdir=${HOME}/.arduinoESP32 if a=$(readlink ${dstitem}) ; then cur="Aktualna wersja: "`basename $a` else cur="Brak aktualnej wersji" fi a=$(zenity --list --text="${cur}\nWybierz wersję" --extra-button Usuń --width 300 --height 300 --title "Selektor wersji ESP32 dla Arduino IDE" --column "Dostępne wersje" `ls ${srcdir} | sort -V`) if [ -z "$a" ] ; then exit 0 fi if [ $a = "Usuń" ] ; then rm ${dstitem} zenity --info --no-wrap --text="Usunięto wersję\nGotowy do instalacji" exit 0 fi src=${srcdir}/$a if [ ! -d ${src} ] ; then zenity --error --no-wrap --text "Brak wersji $a" exit 1 else ln -sfn ${src} ${dstitem} zenity --info --no-wrap --text "Ustawiona wersja $a" fi exit 0 Wymaga Zenity (jest w Ubuntu i podobnych). Jeśli ktoś naprawdę nie lubi GTK+ - Qarma jest podobno w 100% kompatybilna z Zenity, wystarczy sobie zainstalować i podmienić w skrypcie zenity na qarma. A tak to wygląda: Swoją drogą ciekawe czy ktoś się podejmie przerobienia tego na Windowsa 😉 3 Link do komentarza Share on other sites More sharing options...
H1M4W4R1 15 sierpnia Udostępnij 15 sierpnia (edytowany) Dla tych co nie umieją hodować pinginów: #!/usr/bin/env pwsh # Destination path for the ESP32 package $dstitem = "$($env:USERPROFILE)\AppData\Local\Arduino15\packages\esp32" # Directory containing different versions $srcdir = "$($env:USERPROFILE)\.arduinoESP32\" if ($args.Length -gt 0) { if ($args[0] -eq "off") { # Preparing for installation # Will ask for recurse operation as safety ;) Remove-Item -Path $dstitem -Force -ErrorAction SilentlyContinue Write-Host "Should be ready for new version installation" exit 0 } elseif ($args[0] -eq "show") { $a = Get-Item -Path $dstitem -ErrorAction SilentlyContinue if ($a) { $a | Get-Item | Select-Object -ExpandProperty Target | Split-Path -Leaf } else { Write-Host "No configured version" } exit 0 } # The argument is the version number $src = "$srcdir/$($args[0])" if (-not (Test-Path -Path $src -PathType Container)) { Write-Host "Version $($args[0]) not found" } else { New-Item -ItemType SymbolicLink -Path $dstitem -Target $src -Force | Out-Null Write-Host "Version $($args[0]) set" } } else { # List the contents of the directory without parameters Get-ChildItem -Path $srcdir | ForEach-Object { $_.Name } } Uwaga: może wymagać uprawnień administratora, bo Windows to szrot 😄 Edytowano 16 sierpnia przez H1M4W4R1 2 Link do komentarza Share on other sites More sharing options...
ethanak 15 sierpnia Autor tematu Udostępnij 15 sierpnia No to wersja w Pythonie: #!/usr/bin/env python3 import os,re,sys,subprocess from natsort import natsorted class esp32(object): dstitem=os.path.join(os.environ['HOME'],'.arduino15/packages/esp32') srcdir=os.path.join(os.environ['HOME'],'.arduinoESP32') def __init__(self): self.dy=list(x for x in os.listdir(self.__class__.srcdir) \ if re.match(r'\d+\.\d+\.\d+$',x)) self.availver = ['any'] pfx=set() for a in self.dy: pfx.add(int(a.split('.')[0])) pfx = sorted(list(pfx)) for a in pfx: self.availver.append('any %d.x' % a) self.dy=natsorted(self.dy) self.availver.extend(self.dy) if os.path.islink(self.__class__.dstitem): self.curversion=os.readlink(self.__class__.dstitem).split('/')[-1] else: self.curversion='0.0.0' def verlist(self): return list(self.availver) def curver(self): return self.curversion def setver(self, version): def versionSet(): if version == 'any': if self.curversion != '0.0.0': return None return self.dy[-1] if not version.startswith('any'): if self.curversion != '0.0.0' and version == self.curversion: print("Wersja %s jest już aktywna" % version) return None if version not in self.dy: raise Exception("Wersja %s nie jest zainstalowanaa" % version) return version ds=version.split()[1].split('.')[0] if self.curversion != '0.0.0': es=self.curversion.split('.')[0] if ds == es: print("Włączona wersja %s jest zgodna z wymaganiem %s.x" %\ (self.curversion, ds)) return None vr=None for a in self.dy[-1::-1]: b=a.split('.')[0] if b == ds: vr=a break if vr is None: raise Exception('Brak kandydata na wersję %s.x' % ds) return vr if version != 'off' and not re.match(r'\d+\.\d+\.\d+$',version) \ and not re.match(r'any(\s+\d+\..*)?$',version): raise Exception('Błędny numer wersji: '+version) if os.path.exists(self.__class__.dstitem): if not os.path.islink(self.__class__.dstitem): raise Exception('Docelowy katalog esp32 to nie link') if version !='off': v=versionSet() if v is None: return version = v if os.path.exists(self.__class__.dstitem): os.unlink(self.__class__.dstitem) if version == 'off': if self.curversion == '0.0.0': print("Pakiet esp32 jest już wyłączony") return else: print("Wyłączono core esp32:esp32") else: os.symlink(os.path.join(self.__class__.srcdir,version),self.__class__.dstitem) print ("Włączono wersję %s" % version) def install(self, version): if not re.match(r'\d+\.\d+\.\d+$',version): raise Exception('Błędny nymer wersji: '+version) if version in self.dy: raise Exception('Wersja %s jest już zainstalowana' % version) self.previous = None if os.path.exists(self.__class__.dstitem): if not os.path.islink(self.__class__.dstitem): raise Exception('%s to nie softlink' % self.__class__.dstitem) self.previous=os.readlink(self.__class__.dstitem) os.unlink(self.__class__.dstitem) dstpath=os.path.join(self.__class__.srcdir,version) #print("Można instalować na %s" % dstpath) try: subprocess.check_call(['arduino-cli','core','install','esp32:esp32@'+version ]) except: if self.previous: os.symlink(self.previous,self.__class__.dstitem) raise Exception('Instalacja nieudana') os.rename(self.__class__.dstitem,dstpath) os.symlink(dstpath,self.__class__.dstitem) print ("Zainstalowano wersję %s" % version) # to moje prywatne # mkboard=os.path.join(os.environ['HOME'],'Arduino/mkboard32.py') # if os.path.exists(mkboard): # subprocess.check_call([mkboard]) # print("Dodatkowe wpisy partycji zostały dodane") def avail(self,update=False): if update: subprocess.check_call(['arduino-cli','core','update-index']) di=os.path.join( os.path.dirname((os.path.dirname(self.__class__.dstitem))), 'package_esp32_index.json') import json f=open(di) packa=json.load(f)['packages'][0]['platforms'] f.close() return list(a['version'] for a in packa) if __name__ == '__main__': def helpme(s=None): if s: print(s,'\n') print("Użycie: %s command" % sys.argv[0]) print("""list - pokaż bieżącą i zainstalowane wersje avail [updated] - pokaż dostępne wersje install <wersja> - instaluj wersję switch <wersja> | off - przełącz wersję""") if s: exit(1) exit(0) esp=esp32() args=sys.argv[1:] if len(args) == 0: helpme ("Brak polecenia") cmd = args.pop(0) if cmd == 'list': cur = esp.curver() if cur != '0.0.0': print("Bieżąca wersja:", cur) from natsort import natsorted lista=natsorted(esp.dy) print("Dostępne wersje:",', '.join(lista)) exit(0) if cmd == 'install': try: ver=args.pop(0) except: helpme("Nie podano wersji") exit(1) try: esp.install(ver) except: print(str(sys.exc_info()[1])) exit(1) exit(0) if cmd == 'avail': upd=False if len(args) > 0: arg=args.pop(0) if arg == 'updated': upd=True else: helpme("Błędny parametr "+arg) try: vers=esp.avail(upd) except: print(str(sys.exc_info()[1])) exit(1) lista=[] wiersz=[] for a in vers: wiersz.append('%-8s' % a) if len(wiersz) >= 8: lista.append(''.join(wiersz)) wiersz=[] if len(wiersz) > 0: lista.append(''.join(wiersz)) for a in lista: print (a) exit(0) if cmd == 'switch': if len(args) < 1: helpme("Co mam przełączyć?") exit(1) try: esp.setver(' '.join(args)) except: print(str(sys.exc_info()[1])) exit(1) exit(0) helpme() Niektóre rzeczy mogą wydawać się dziwne, ale to ma działać jako moduł do pyrduino. Oczywiście trzeba poprawić ścieżki na początku, no i mieć arduino-cli zainstalowane. Jakby coś to plik w załączniku: espswitch.zip Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
ethanak 16 sierpnia Autor tematu Udostępnij 16 sierpnia (edytowany) No to jeszcze wersja dla różnych systemów operacyjnych: class esp32(object): if sys.platform.startswith('linux'): # Linux paths dstitem=os.path.join(os.environ['HOME'],'.arduino15/packages/esp32') srcdir=os.path.join(os.environ['HOME'],'.arduinoESP32') elif sys.platform.startswith('darwin'): # Mac parts - do usupełnienia dstitem = '' srcdir = '' elif sys.platform.startswith('win'): # Windows parts - do usupełnienia dstitem = '' srcdir = '' else: dstitem = '' srcdir = '' def __init__(self): # sprawdzenie czy ścieżki są prawidłowe (wystarczy jedna) if self.__class__.dstitem == '': s=sys.platform if s.startswith('darwin'): s='macos' raise Exception('Brak podanych ścieżek dla systemu %s' % s) # a to i dalej zostawiamy jak było self.dy=list(x for x in os.listdir(self.__class__.srcdir) \ if re.match(r'\d+\.\d+\.\d+$',x)) Kto chętny do poprawienia ścieżek i sprawdzenia na czymś innym niż Linux? Edytowano 16 sierpnia przez ethanak Link do komentarza Share on other sites More sharing options...
ethanak 16 sierpnia Autor tematu Udostępnij 16 sierpnia 17 godzin temu, H1M4W4R1 napisał: Dla tych co nie umieją hodować pinginów: A dla tych co słabo czytają: nie $dstitem = "$($env:USERPROFILE)\AppData\Local\Arduino15\packages\esp32\hardware\esp32\" ale $dstitem = "$($env:USERPROFILE)\AppData\Local\Arduino15\packages\esp32" 1 1 Link do komentarza Share on other sites More sharing options...
ethanak 17 sierpnia Autor tematu Udostępnij 17 sierpnia Dobra, chyba dość w temacie. Wersja mam nadzieję finalna... #!/usr/bin/env python3 import os,re,sys,subprocess from natsort import natsorted class esp32(object): if sys.platform.startswith('linux'): # Linux paths dstitem=os.path.join(os.environ['HOME'],'.arduino15/packages/esp32') srcdir=os.path.join(os.environ['HOME'],'.arduinoESP32') #postinstall = os.path.join(os.environ['HOME'],'Arduino','mkboard32.py') elif sys.platform.startswith('darwin'): # Mac paths - do uzupełnienia dstitem = '' srcdir = os.path.join(os.environ['HOME'],'.arduinoESP32') elif sys.platform.startswith('win'): # Windows paths - na odpowiedzialność kolegi H1M4W4R1 # Jak coś nie będzie działać to do niego dstitem = os.path.join(os.environ["USERPROFILE"],'AppData','Local','Arduino15','packages','esp32') srcdir = os.path.join(os.environ["USERPROFILE"],'.arduinoESP32') else: dstitem = '' srcdir = '' def __init__(self): if self.__class__.dstitem == '': s=sys.platform if s.startswith('darwin'): s='macos' raise Exception('Brak podanych ścieżek dla systemu %s' % s) self.proper = True if not os.path.isdir(self.__class__.srcdir): self.proper = False elif os.path.exists(self.__class__.dstitem) and \ not os.path.islink(self.__class__.dstitem): self.proper = False if not self.proper: return self.dy=list(x for x in os.listdir(self.__class__.srcdir) \ if re.match(r'\d+\.\d+\.\d+$',x)) self.availver = ['any'] pfx=set() for a in self.dy: pfx.add(int(a.split('.')[0])) pfx = sorted(list(pfx)) for a in pfx: self.availver.append('any %d.x' % a) self.dy=natsorted(self.dy) self.availver.extend(self.dy) if os.path.islink(self.__class__.dstitem): self.curversion=os.readlink(self.__class__.dstitem).split('/')[-1] else: self.curversion='0.0.0' def verlist(self): return list(self.availver) def curver(self): return self.curversion def setver(self, version): def versionSet(): if version == 'any': if self.curversion != '0.0.0': return None return self.dy[-1] if not version.startswith('any'): if self.curversion != '0.0.0' and version == self.curversion: print("Wersja %s jest już aktywna" % version) return None if version not in self.dy: raise Exception("Wersja %s nie jest zainstalowanaa" % version) return version ds=version.split()[1].split('.')[0] if self.curversion != '0.0.0': es=self.curversion.split('.')[0] if ds == es: print("Aktywna wersja %s jest zgodna z wymaganiem %s.x" %\ (self.curversion, ds)) return None vr=None for a in self.dy[-1::-1]: b=a.split('.')[0] if b == ds: vr=a break if vr is None: raise Exception('Brak kandydata na wersję %s.x' % ds) return vr if version != 'off' and not re.match(r'\d+\.\d+\.\d+$',version) \ and not re.match(r'any(\s+\d+\..*)?$',version): raise Exception('Błędny numer wersji: '+version) if os.path.exists(self.__class__.dstitem): if not os.path.islink(self.__class__.dstitem): raise Exception('Docelowy katalog esp32 to nie link') if version !='off': v=versionSet() if v is None: return version = v if os.path.exists(self.__class__.dstitem): os.unlink(self.__class__.dstitem) if version == 'off': if self.curversion == '0.0.0': print("Pakiet esp32 jest już wyłączony") return else: print("Wyłączono core esp32:esp32") else: os.symlink(os.path.join(self.__class__.srcdir,version),self.__class__.dstitem) print ("Aktywna wersja %s" % version) def install(self, version): if not re.match(r'\d+\.\d+\.\d+$',version): raise Exception('Błędny numer wersji: '+version) if version in self.dy: raise Exception('Wersja %s jest już zainstalowana' % version) self.previous = None if os.path.exists(self.__class__.dstitem): if not os.path.islink(self.__class__.dstitem): raise Exception('%s to nie softlink' % self.__class__.dstitem) self.previous=os.readlink(self.__class__.dstitem) os.unlink(self.__class__.dstitem) dstpath=os.path.join(self.__class__.srcdir,version) #print("Można instalować na %s" % dstpath) try: subprocess.check_call(['arduino-cli','core','install','esp32:esp32@'+version ]) except: if self.previous: os.symlink(self.previous,self.__class__.dstitem) raise Exception('Instalacja nieudana') os.rename(self.__class__.dstitem,dstpath) os.symlink(dstpath,self.__class__.dstitem) print ("Zainstalowano wersję %s" % version) if hasattr(self.__class__,'postinstall') and \ os.path.exists(self.__class__.postinstall): subprocess.check_call([self.__class__.postinstall]) print("Wykonano skrypt użytkownika") def avail(self,update=False): if update: subprocess.check_call(['arduino-cli','core','update-index']) di=os.path.join( os.path.dirname((os.path.dirname(self.__class__.dstitem))), 'package_esp32_index.json') import json f=open(di) packa=json.load(f)['packages'][0]['platforms'] f.close() return list(a['version'] for a in packa) def initialize(self): if not os.path.isdir(self.__class__.srcdir): os.mkdir(self.__class__.srcdir) print("Utworzono katalog",self.__class__.srcdir) if not os.path.exists(self.__class__.dstitem): return if os.path.islink(self.__class__.dstitem): raise Exception("Pakiet esp32 nie jest fizycznym katalogiem") path=os.path.join(self.__class__.dstitem,'hardware','esp32') dy=os.listdir(path) if len(dy) != 1 or not re.match(r'\d+\.\d+\.\d+$',dy[0]): raise Exception("Nieznana struktura pakietu esp32") dy=dy[0] print("Wykryto zainstalowaną wersję",dy) tget=os.path.join(self.__class__.srcdir,dy) if os.path.exists(tget): raise Exception("Katalog docelowy istnieje:", tget) os.rename(self.__class__.dstitem,tget) os.symlink(tget,self.__class__.dstitem) print("Przygotowano wersję",dy) if __name__ == '__main__': def helpme(s=None): if s: print(s,'\n') print("Użycie: %s command" % sys.argv[0]) print("""init - inicjalizacja struktury katalogów list - pokaż bieżącą i zainstalowane wersje avail [updated] - pokaż dostępne wersje install <wersja> - instaluj wersję switch <wersja> | off - przełącz wersję""") if s: exit(1) exit(0) esp=esp32() args=sys.argv[1:] if len(args) == 0: helpme ("Brak polecenia") cmd = args.pop(0) if cmd == 'init': if esp.proper: helpme("Przełącznik wygląda na zainicjalizowany") esp.initialize() exit(0) if not esp.proper: helpme("Przełącznik nie jest zainicjalizowany") if cmd == 'list': cur = esp.curver() if cur != '0.0.0': print("Bieżąca wersja:", cur) from natsort import natsorted lista=natsorted(esp.dy) print("Dostępne wersje:",', '.join(lista)) exit(0) if cmd == 'install': try: ver=args.pop(0) except: helpme("Nie podano wersji") exit(1) try: esp.install(ver) except: print(str(sys.exc_info()[1])) exit(1) exit(0) if cmd == 'avail': upd=False if len(args) > 0: arg=args.pop(0) if arg == 'updated': upd=True else: helpme("Błędny parametr "+arg) try: vers=esp.avail(upd) except: print(str(sys.exc_info()[1])) exit(1) lista=[] wiersz=[] for a in vers: wiersz.append('%-8s' % a) if len(wiersz) >= 8: lista.append(''.join(wiersz)) wiersz=[] if len(wiersz) > 0: lista.append(''.join(wiersz)) for a in lista: print (a) exit(0) if cmd == 'switch': if len(args) < 1: helpme("Co mam przełączyć?") exit(1) try: esp.setver(args.pop(0)) except: print(str(sys.exc_info()[1])) exit(1) exit(0) helpme() No i w załączniku to samo: espswitch2.zip Udanego przełączania! ethanak Link do komentarza Share on other sites More sharing options...
ethanak 21 sierpnia Autor tematu Udostępnij 21 sierpnia Uprzedzając pytania: Trzeba zainstalować Python3 Trzeba zainstalować moduł natsort. Warto zainstalować Arduino-cli (bez tego nie wszystko będzie działać) No i w razie czego poprawić scieżkę dstitem (u kol. @H1M4W4R1 były takie, ale nie muszą być). 1 Link do komentarza Share on other sites More sharing options...
Gość 23 sierpnia Udostępnij 23 sierpnia Dnia 21.08.2024 o 15:44, ethanak napisał: Trzeba zainstalować moduł natsort. Jak zainstalować? Do CMD na YT nie brakuje poradników, do PY jest cienko. xD Z ciekawości próbowałem to uruchomić bez tego natsortu, ale pokazuje się na ułamek sekundy czarne okno i znika. Link do komentarza Share on other sites More sharing options...
ethanak 23 sierpnia Autor tematu Udostępnij 23 sierpnia (edytowany) Polecenie pip wydajesz z cmd a nie konsoli pythona. A bogatszej dokumentacji niż do pythona dawno nie widziałem. Edytowano 23 sierpnia przez ethanak Link do komentarza Share on other sites More sharing options...
Gość 23 sierpnia Udostępnij 23 sierpnia I dalej nic... Link do komentarza Share on other sites More sharing options...
ethanak 23 sierpnia Autor tematu Udostępnij 23 sierpnia (edytowany) A skąd się ten dolar wziął? Robisz za cinkciarza? Czasem warto czytać co ten windows wypisuje... Edytowano 23 sierpnia przez ethanak Link do komentarza Share on other sites More sharing options...
Gość 23 sierpnia Udostępnij 23 sierpnia Bez $ też nie działa. xD Link do komentarza Share on other sites More sharing options...
ethanak 11 września Autor tematu Udostępnij 11 września Specjalnie dla niektórych: Plik espswitch.py w katalogu domowym. Link do komentarza Share on other sites More sharing options...
Gość 11 września Udostępnij 11 września Mam takie cos na pulpicie; Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »