Új hozzászólás Aktív témák
-
kovisoft
őstag
válasz
kovisoft
#4448
üzenetére
Ha esetleg nem akarsz bajlódni az output átirányítással (vagy nem tudod, hogyan kell pontosan csinálni a gépeden), akkor cseréld le az utolsó print sort valami ilyesmire, ez a képernyő helyett egy x.txt file-ba írja az eredményt:
with open("x.txt","w") as f:f.write(formatted_combinations) -
kovisoft
őstag
Csak a te eredeti programodat tettem bele egy x.py file-ba, a c:\ kezdetű sorok pedig az én gépemen kiadott parancsok voltak a command prompttal együtt, de nálad nyilván valami egészen más könyvtár lenne használva, már ha egyáltalán Windowsod van, és nem valami más oprendszer. De nem muszáj úgy csinálnod, ahogy én, akár programból is megnyithatsz egy file-t, és beleirathatod a végeredmény stringet.
Illetve az jutott még eszembe, hogy egyáltalán honnan tudod, hogy 9030 sort kaptál eredményül, ha nem tetted ki valahogyan az outputot egy file-ba? Vagy csak annyi történt, hogy a terminál outputot másoltad ki? Mert akkor lehet, hogy a terminál buffer méretének a limitjébe futottál bele.
-
kovisoft
őstag
Az egészet beraktam egy x.py file-ba, és az alábbi módon futtattam (Windows, Python 3.12.5), a standard outputot átírányítva az x.txt file-ba:
c:\Work\python>python x.py > x.txt
c:\Work\python>type x.txt | find /c /v ""
299018Linuxon hasonlóan menne, de ott a
wc -l x.txtparanccsal lehet megkapni a sorok számát. -
kovisoft
őstag
for y in range (led_brightness, 0, -1):Itt gondolom a led_brightness listán szeretnél visszafelé végigmenni, de ezt nem így kell csinálni. Ha a range-et használod, akkor kell a len is, és akkor az y csak az adott elem indexe lesz, azzal még indexelni kell a listát (szerk: sőt asszem még 1-et ki is kell vonni):
for y in range(len(led_brightness), 0, -1):
print(led_brightness[y-1])De egyszerűbb a reversed-del megfordítani a listát:
for y in reversed(led_brightness):
print(y)
Szerk2: vagy még így:for y in led_brightness[::-1]:
print(y) -
kovisoft
őstag
válasz
J0shu4M1ll3r
#4268
üzenetére
Permutációval roppant egyszerű a dolog. Egy ciklusban végigmész a permutations([...]) által visszaadott listán, aminek mindegy eleme egy mondjuk x tömb lesz az aktuális permutációval. Az x tömb a nyolc ismeretlen számot jelöli (x[0]-tól x[7]-ig). Ezekre beteszel 6 darab if-et (olyasmit, mint amit te is felírtál, csak nem egyedi változókkal, hanem a tömb elemeivel), amiben ellenőrzöd az egyes vonalak mentén az összegeket. Ha bármelyik nem 26, akkor continue. A legvégén pedig kiiratod az x-et.
Házi feladatokat nem igazán oldunk meg más helyett, de ha van bármi kód kezdeményed, és elakadsz, akkor szívesen segítünk.
Szerk: Csak egy megjegyzés, hogy ne zavarjunk még jobban össze: én a fix számokat nem vettem bele a permutációba, mint sztanozs. Én csak a 8 ismeretlent permutálnám.
-
kovisoft
őstag
válasz
J0shu4M1ll3r
#4265
üzenetére
Ha valamilyen backtrack-szerű algoritmust akarsz használni, akkor a számokat ne egyedi változókban tárold, hanem pl. tömbben, és akkor egységesen tudod tölteni őket. A feltételeidet ugyanúgy fel tudod írni pl. 2+X[0]+X[1]+X[2]+X[3]==26 formában,
De talán az axioma által is említett permutáció generálás a legegyszerűbb: az itertools modul permutations([3,5,6,8,9,10,11,12]) függvényével le tudod generálni a maradék nyolc szám összes permutációját, ezek közül kell azokat kiválogatni, ahol minden vonalra teljesül, hogy a számok összege 26.
-
kovisoft
őstag
Az if-ben dupla == az egyenlőségvizsgálat.
A json konfig mintában azt látom, hogy csak deviceId-k és azon belül pinNumber-ök vannak definiálva, ezzel a konfiggal leginkább csak hardkódolni tudod. De ha kiegészítheted a konfigot, akkor felvehetsz plusz attribútumokat, amikkel megadhatod, hogy az adott device vagy az adott device adott pin-je milyen másik device milyen pin-jével nem működhet együtt. Pl. a "pinNumber" mellé felvehetsz egy "conflictingDeviceId" és egy "conflictingPinNumber" mezőt. Ide beírod, hogy mivel nem tud együtt működni. A kódban pedig gpo["conflictingPinNumber"]-ként tudsz rá hivatkozni.
-
kovisoft
őstag
Ez villogást (vagy ha nem lámpáról lenne szó, akkor egyéb mellékhatást) okozhatna, valószínűleg az sem véletlen, hogy nem azt csinálja a program, hogy először mindent kikapcsol, aztán bekapcsolja azokat, amiket be kell. De persze, ha ez nem zavaró, akkor úgy is lehet csinálni, ahogy írod.
-
kovisoft
őstag
Én sem vágom, hogy itt ki kinek mikor mit küld, mit hív, stb. De szerintem az első cikus végzi a device_state-ben megkapott device-ok megadott pin-jeinek a bekapcsolását. És a powered_pins-ben összegyűjti azokat a pin-eket, amiket bekapcsolt. Utána a második ciklus pedig azt csinálhatja, hogy végigmegy az összes device összes pin-jén, és azokat kikapcsolja, amiket az első ciklus nem kapcsolt be. Azaz a végére pontosan azok lesznek bekapcsolva, amiknek bekapcsolva kell lenniük, az összes többi pedig ki lesz kapcsolva.
Tehát ha jól gondolom, akkor az első ciklusba tudnál betenni valami feltételvizsgálatot, hogy ha be tudod azonosítani azt az eszközt és a pin-eket, amik a zöld és piros lámpákat jelentik, akkor a zöldet ne kapcsolja be, ha a pirosat be kellene kapcsolni.
Nem tudom, meg lehet-e oldani mondjuk, hogy a konfigban hamarabb szerepeljen a piros lámpa pin-je, mert akkor mire a zöldre kerül a ciklus, addigra már lehetne látni, hogy a pirost be kell-e kapcsolni.
Ha ez nem járható út, akkor esetleg csinálhatsz az egész elé egy harmadik ciklust, ami kb. ugyanazt csinálja, mint a mostani első ciklus, de ténylegesen nem kapcsol pin-t, csak megjegyzi egy változóban, hogy a pirosat be kellene-e kapcsolni. És ha ez a változó be van állítva, akkor a bekapcsoló ciklusban kihagyja a zöldet.
Persze ehhez tudni kellene, hogy tényleg a processTallyData az a függvény, ami a kapcsolgatást végzi. Ezt mondjuk ki tudod próbálni, ha kikommentezed benne a bekapcsolást, és attól elmúlik a lámpák bekapcsolása.
-
kovisoft
őstag
Szerintem nem a setStates függvény az, amit keresel. Ha megnézed, a setStates és a GPO_off gyakorlatilag pont ugyanazt csinálja: kikapcsolja az összes bekonfigurált pint. És a setStates csak induláskor van egyszer meghívva, miután a konfig be lett olvasva.
Nem értem, hogy pontosan hogyan működik maga a program, hogyan lehet neki utasításokat adni, de szerintem a GPIO.output hívásokat kellene végignézned, hogy melyik lehet az, amelyik neked a lámpákat vezérli, és oda lehetne betenni egy olyan feltételt, hogy a zöldet ne kapcsolja, ha egyúttal a pirosat is kellene kapcsolnia. Ez valószínűleg a processTallyData lehet, mert az on_flash ránézésre egyetlen pint villogtat.
-
kovisoft
őstag
válasz
jerry311
#4114
üzenetére
Az RGBXmasTree egy származtatott class, a close() csak annyit csinál, hogy meghívja a base class (super class) ugyanilyen nevű metódusát. A base class talán valami SPIDevice, ennek a close() metódusa választja ténylegesen le az eszközt. De ez nem kapcsolgatja a LED-eket.
-
kovisoft
őstag
válasz
kovisoft
#4108
üzenetére
Nem az van, hogy a konstruktor kikapcsolja a LED-eket? És amikor egy külön scriptben van csak a close(), akkor lefut a konstruktor, kikapcsolja a LED-eket, nem a close() kapcsolja ki? Mert akkor a végén kell egy tree.off(), az kapcsolná ki, nem a close().
Persze csak találgatok.
-
kovisoft
őstag
Azt nem tudom, hogy Blenderben be lehet-e állítani, hogy megjelenítse a tab karaktereket, de az szinte biztos, hogy abban is be lehet állítani, hogy szóközöket vagy tab-okat akarsz-e használni. Rákeresve a neten láttam pl. ilyen menüpontot: Format -> Convert Whitespace -> To Spaces. Meg a beállításokban is láttam ilyet: File -> Text Editor -> Tabs as Spaces.
-
kovisoft
őstag
Wordben sem látod, ha nincs beállítva, hogy mutassa a speciális karaktereket. És ha normális IDE-t vagy szövegszerkesztőt használsz Pythonhoz, akkor ott is be lehet kapcsolni, hogy mutassa vagy hogy automatikusan mondjuk szóközt tegyen be akkor is, ha tab-ot nyomsz. Milyen szövegszerkesztőt használsz? Biztos, hogy nincs benne ilyen beállítás?
-
kovisoft
őstag
válasz
kovisoft
#3996
üzenetére
Annyit még kiegészítésképpen, hogy a Python érzékeny az indentálásra, hiszen ezzel jelezzük a blokkokat a kódban. Mindenképpen egységes tabulálást kellene használni, de leginkább javasolt, ha mindenhol egységesen szóközöket használsz, hiszen a tab-ok mérete állítható, sőt van szövegszerkesztő, amely soft és hard tabokat vegyesen használ (pl. 1 tab leütés = 4 szóköz, 2 tab leütés = 1 db 8-as tab karakter
) .A miértekről sokat lehet olvasni, ha mondjuk rákeresel a python space tab keresőszavakra, pl: Tabs or Spaces?
-
kovisoft
őstag
Ha nem olyan a szövegszerkesztőd, hogy meg tudná mutatni a speciális karaktereket, akkor pl. nézd meg, hogy a sor elejétől elindulva jobbra nyilat nyomogatva karakterenként egyesével halad vagy ugrik egy tabulátor-pozíciónyit. És hogy mi a helyzet egy másik sorban. Vagy töröld ki az if előtti karaktereket és gépeld be újra (ha szóközöket használsz a kódban, akkor szóközökkel). Ugyanígy a map előtti karakterekre is csináld meg ugyanezt.
-
kovisoft
őstag
válasz
Victoryus
#3990
üzenetére
Évszámból lehet 1 milliárd, intervallumból max 2*100 ezer van a feladat szerint. Az befér a memóriába. A set nem jó, mert nem elég az intervallumok végeiben az ismétlődéseket kiiktatni, hanem kompletten ki kell hagyni az átfedő tartományokat. Valami összefésüléses logikát kellene követned, mint amit axioma is javasolt. Mindig attól függ, hogy éppen melyik intervallum listán lépsz előre, hogy éppen melyikben kisebb a következő elem. Ha jól értem a feladatot, akkor feltehetjük, hogy mindkét intervallum lista rendezett.
-
kovisoft
őstag
válasz
arcoskönyv
#3985
üzenetére
Jogos, benéztem, valóban nem a file-t, hanem a readlines() eredményét adja vissza. Akkor én is a with open konstrukciót javaslom.
-
kovisoft
őstag
válasz
arcoskönyv
#3982
üzenetére
A garbage collector nem fogja automatikusan bezárni a file-t, ha megszűnik a hivatkozás a file objektumra. Explicit le kell zárnod a file-t, ha már nem használod. Az itt említett with open a te esetetben nem járható, hiszen a függvényed visszatér és vissza kellene adnia a file objektumot, viszont a with open blokkból kilépve automatikusan záródik a file.
A programból véglegesen kilépve az oprendszer felszabadítja a lefoglalt erőforrásokat, de erre nem lenne szabad hagyatkozni.
Nagyobb gond lehet file-ba írásnál, ha kimarad a close, mert az írás bufferelve történik, és egyáltalán nem biztos, hogy amikor egy write-ot kiadtál, akkor ténylegesen ki is íródott az adat a file-ba, mert lehet, hogy csak a következő flush-nál vagy a close-nál fog kiíródni, és ez kimaradhat, ha nincs close és aztán mondjuk elhasal a program.
-
kovisoft
őstag
válasz
Hege1234
#3868
üzenetére
Őszintén szólva kezdem elveszteni a fonalat
, de igen, valami olyasmire gondoltam, mint az rjust() rész, amit írsz. A lényeg az, hogy ha ugyanannyi számjegyből állnak a számaid, akkor a string (azaz ábécé szerinti) rendezés ugyanazt a sorrendet adja, mint a számok nagyság szerinti rendezése.Amúgy biztos, hogy jó az a regex2? Nem inkább [1-9][0-9]* kellene [1-9]*[0-9] helyett? Mert az utóbbi azt jelenti, hogy csak az utolsó számjegy lehet 0 és 9 közötti, a többi 1 és 9 közötti. Szerintem inkább az kellene, hogy az első számjegy 1 és 9 közötti, a többi 0 és 9 közötti. Persze az egésznek csak 3 vagy több jegyű számoknál van jelentősége, season és episode meg nem szokott akkora lenni.
-
kovisoft
őstag
válasz
Hege1234
#3866
üzenetére
Ha teljesen random stringek lehetnek, és azt sem lehet tudni, hogy hány darab szám jellegű rész van bennük és azok hol helyezkednek el a stringen belül, akkor én hagynám a replace() és társait, és inkább valami ilyesmit csinálnék:
- feldarabolnám egy listába az adott stringet olyan részekre, amikben vagy minden karakter csupa számjegy, vagy minden karakter csupa nem-számjegy
- a nem-számjegy elemeket békén hagynám
- a csupa számjegyből álló elemeket kiegészíteném balról nullákkal úgy, hogy a teljes szám hossza valami fix érték legyen (pl. ha nincsenek 10 számjegynél hosszabb számok, akkor legyen minden szám 10 jegyű)
- ebből a listából visszaépítenék egy stringet
- az így kapott string alapján rendezném a stringjeimet, itt már nem lenne gond a rendezéssel, hiszen minden szám ugyanannyi jegyű, tehát a lexikografikus rendezés egyúttal nagyságrendi rendezést is jelentNem tudok olyan egyszerű split() hívást, ami a fenti darabolást elvégezné, úgyhogy szerintem erre kellene írni egy ciklust, ami számjegy/nem-számjegy mentén vágna. A visszaépítés már csak egy join() lesz.
-
kovisoft
őstag
válasz
Hege1234
#3864
üzenetére
Azt ugye neked kellene valahogy eldöntened, hogy az ilyen (és egyéb) kivételes eseteket hogyan szeretnéd rendezni, és ehhez idomítani a sort_key() függvényt. A ValueError lekezelése szerintem jó ötlet. Ha pl. azt szeretnéd, hogy a kivételek a végére kerüljenek, akkor érdemes a sort_key() visszatérési értékében a listát mondjuk egy 0-val kezdeni, ha tudta int-ként értelmezni, és 1-gyel kezdeni, ha nem tudta (és ilyenkor mögé tenni az eredeti stringet).
Pl. egy lehetséges megoldás:def sort_key(s):
x=s.replace('.',' ').replace('-',' ').split()
try:
return [0, int(x[0]),int(x[2])]
except ValueError:
return [1, s] -
kovisoft
őstag
válasz
Hege1234
#3862
üzenetére
Írj egy függvényt, ami generál egy kulcsot a rendezéshez, és ezt add meg a sort()-nak. A függvény pl. csinálhatja azt, hogy szétdobja az adott stringet szóközök mentén, veszi az első és harmadik oszlopot integerként, és ebből generálja a kulcsot. Itt egy példa, ez a szétdobás előtt lecseréli a . és - karaktereket szóközre:
def sort_key(s):
x=s.replace('.',' ').replace('-',' ').split()
return [int(x[0]),int(x[2])]
És ezt a függvényt add meg a sort()-nak:merged_jsons_title.sort(key=sort_key) -
kovisoft
őstag
válasz
#97623552
#3853
üzenetére
Az még a probléma, hogy a kep1 és kep2 változóid csak szimpla lokális változóként vannak felvéve, ezért amikor a button_clicked() függvényből kilép, akkor azok meg is szűnnek létezni, és így a betöltött képek azonnal ki is dobódnak, nem tudnak megjelenni a vásznon.
Ami változókat meg akarsz őrizni, azokat szintén class memberváltozóként kellene felvenni. Jelen esetben tippre talán elég annyi, ha a kep1 és kep2 helyett self.kep1 és self.kep2-t írsz.
-
kovisoft
őstag
válasz
olivera88
#3817
üzenetére
Múltkor azt írtad, hogy nem értem, amit írtál, pedig szerintem te nem érted, amit én írok. Nem azt mondom, hogy mivel tudod, hogy melyik fájlban mennyi mező van, ezért állítsd be kézzel az n változót mindig arra az adott értékre. Ennek nyilván semmi értelme. Hanem azt mondom, hogy a fájlból egy megfelelő függvényhívással kérd le programból, hogy hány mezőt tartalmaz, ez kerüljön az n-be.
Sajnos konkrét példaprogrammal nem tudok szolgálni, mert nem ismerem a Magics-et. Csak a doksijában próbáltam keresgélni, de ez alapján nem volt egyértelmű számomra, hogy milyen függvényhívással lehetne lekérni egy adott fájl mezőinek a számát. A tippjeimet leírtam a korábbi hozzászólásaimban.
Ezért írtam alternatív megoldásként, hogy esetleg addig olvasd egymás után a mezőket, amíg egy olyan exceptiont nem kapsz, ami arra utal, hogy olyan sorszámú mező már nincs a fájlban. Viszont ha ilyenkor nem dob exceptiont, és semmilyen más módon sem jelzi a hibás mezőszámot, akkor ez nem járható út.
-
kovisoft
őstag
válasz
kovisoft
#3810
üzenetére
Próbáltam olyan példaprogramot keresni, ahol ez a két dolog egybe van gyúrva, de sajnos nem találok ilyet. Talán a codes_grib_iterator vagy codes_keys_iterator használható valahogy.
De ha ezzel nem jutsz előrébb, akkor próbáld ki azt, hogy mi történik, ha túl nagy grib_field_position-t adsz meg. Valószínűleg ilyenkor kapsz valamilyen exceptiont. Ezt az exceptiont elkaphatod és arra használhatod, hogy kilépj a ciklusból. A ciklus maga meg legyen végtelen vagy menjen valami nagy számig.
-
kovisoft
őstag
válasz
olivera88
#3809
üzenetére
Pedig szerintem értettem, hogy mire irányult a kérdésed. A linkelt oldalon van egy példa, amiben egy n változót használ arra, hogy meddig menjen. Ebbe az n változóba kell a ciklus előtt beletenni azt az értéket, amennyi mező van az adott file-ban. Ezt pedig az idézett megjegyzés szerint a grib_count adja meg. De mindezt úgy mondom, hogy ténylegesen nem ismerem az adott csomagot.
Alternatív megoldásként azt is el tudom képzelni, hogy ha valami hibával tér vissza az mgrib() függvény abban az esetben, amikor túl nagy grib_field_position van neki átadva, akkor ezt a hibát is el lehet kapni, és akkor kilépni a ciklusból. Ebben az esetben a ciklus maga lehet egy végtelen ciklus.
-
kovisoft
őstag
válasz
olivera88
#3806
üzenetére
Ha a Magics-ről van szó, akkor ezen az oldalon azt írja, hogy:
"To know the number of fields in your grib files, you can use the tool grib_count of the ecCodes package."
-
kovisoft
őstag
-
kovisoft
őstag
válasz
stellaz
#3744
üzenetére
Ez a módszer 120-ig működik, de 121-re már nem, mivel csak a max 7-tel való oszthatóságot vizsgálod, így a 121-re is azt mondja, hogy prím, pedig az a 11*11.
A szám négyzetgyökéig meg kellene nézni a lehetséges osztókat.
Szerk: A másik probléma, hogy nem így kell vizsgálni az oszthatóságot, mert ez nagy számoknál hibás eredményt ad, pl. 1234567891234567890/7%1 == 0 és 1234567891234567891/7%1 == 0, pedig mindkettő nem lehet. Az oszthatóságot inkább így kellene vizsgálni: 1234567891234567890%7 == 0 (mert pl. 1234567891234567891%7 == 1).
-
kovisoft
őstag
válasz
feketedini
#3634
üzenetére
Azért van, mert a második "if" nem "elif", ezért minkét "if" egymástól függetlenül végrehajtódik, majd mivel a második "if" hamis lesz, ezért ennek az "else" ága is lefut.
Másik probléma, hogy amikor b a legnagyobb, akkor nem a b-t, hanem akkor is az a-t iratod ki.
-
kovisoft
őstag
válasz
Hege1234
#3563
üzenetére
Csináltam egy próbát az update()-tel és "list1"-et és "list2"-t tartalmazó dict-ekkel. Ez lett az eredmény, az update() után bekerült a dict-be mindkettő (a sortörést én adtam hozzá, hogy olvashatóbb legyen):
> d1 = {"list1":{"cim":"Családi videó....","Minőség":"SD","Képarány":"4:3","Időtartam":"01:26:24","Készült":"1993"}}
> d2 = {"list2":{"cim":"Családi videó....","Minőség":"SD","Képarány":"4:3","Időtartam":"01:26:24","Készült":"1993"}}
> print(d1)
{'list1': {'cim': 'Családi videó....', 'Minőség': 'SD', 'Képarány': '4:3', 'Időtartam': '01:26:24', 'Készült': '1993'}}
> d1.update(d2)
> print(d1)
{'list1': {'cim': 'Családi videó....', 'Minőség': 'SD', 'Képarány': '4:3', 'Időtartam': '01:26:24', 'Készült': '1993'},
'list2': {'cim': 'Családi videó....', 'Minőség': 'SD', 'Képarány': '4:3', 'Időtartam': '01:26:24', 'Készült': '1993'}} -
kovisoft
őstag
-
kovisoft
őstag
-
kovisoft
őstag
válasz
Luxoros
#3478
üzenetére
Én a teljes (másképpen hibapont nélküli) kombinációk generálásáról írtam. Ha hibapontos totókulcsot akarsz generálni, az lényegesen nehezebb feladat (én speciel nem is ismerek rá módszert, de nem mélyedtem el a témában - tudna ilyet is a NumPy?). Ha viszont más által már korábban generált totókulcsot szeretnél alkalmazni a saját tippjeidre, az egy egyszerű behelyettesítés.
-
kovisoft
őstag
válasz
Luxoros
#3475
üzenetére
Ezzel a megközelítéssel nehéz lesz általánosan megoldani N db kétesély kombinációinak előállítását (de még a 4 db-ét is). Ugyanis most pl. az első függvényben elölről kezdve lecserélsz sorban 1, 2, 3, 4 tippet, de mindig csak elölről kezdve. Valójában mondjuk amikor 2 tippet cseréltél le a kétesélyek közül, akkor azt nem csak úgy kell, hogy az első kettőt, hanem az 1-3, 1-4, 2-3, 2-4, 3-4 párokat is, ami összesen 4 alatt a 2. És mindezt végigcsinálni 1-4 db lecserélt értékre.
Könnyebb egy olyan úton elindulni, hogy mindegyik kétesélyt úgy tekinted, mint ha egy bit lenne egy bináris számban. 4 db kétesély esetén ez azt jelenti, hogy a 4 bites (0-15-ig terjedő) számok bitjeinek kell megfeleltetni, hogy melyik kétesélyből éppen melyiket teszed bele a kombinációba.
Hogyan kell generálni a következő kombinációt? Ha az első pozícióban a kétesélyből az első értéknél jársz, akkor most veszed a második értéket, és kiíratod a kombinációt. Ellenkező esetben veszed újra az első értéket, de egyúttal továbblépsz a következő kétesélyes pozícióra, és ott is végigcsinálod ugyanezt, egészen addig, amíg már nem kell továbblépned (vagy végére értél a tömbnek). Akkor van vége, amikor már nem tudsz továbblépni, mert már minden kétesélyes pozícióban a második értéket írattad ki. Ez a módszer kis módosítással háromesélyes tippekre is működik, sőt akár vegyesen két- és háromesélyesekre is, csak tudnod kell, hogy melyik pozícióban mik a szóba jöhető értékek.
-
kovisoft
őstag
Ez egy Dialog, nem egy Edit control. Vagy az van, hogy ez tényleg már maga a terminál ablak, és akkor ebből nem fogsz tudni szöveget kiolvasni. Vagy pedig mégsem sikerült eltalálni. Esetleg egymáson van több control is és csak a legelsőt kaptad vissza, de igazából annak valamilyen childja lenne a keresett control. Sorry, ehhez én már kevés vagyok, eddig is jobbára csak tippelgettem.
-
kovisoft
őstag
Nem biztos, hogy az alábbi kód működik, de valami ilyesmire gondoltam, hogy ha mondjuk fixen mindig ugyanott nyílik meg az applikáció és van egy x, y koordinátád, ami a terminál ablakba esik, akkor lekéred, hogy melyik control van ezen a pozíción, aztán kiíratod ennek valamilyen azonosítóját:
top_wnd = app.top_window().wrapper_object()
control = top_wnd.from_point(x, y)Én továbbra is kételkedem benne, hogy ez egy sima edit control lenne és hogy ki tudnád innen olvasni a megjelenített szöveget. De ne legyen igazam.
-
kovisoft
őstag
A from_point-tal kapcsolatban csak arra gondoltam, hogy a saját gépeden próbaképpen meg tudnád nézni, hogy x, y koordináta alapján melyik window-t adja vissza és az milyen típusú. És talán ez alapján már tudnál írni egy univerzális lekérdezést (az nyilván már nem x, y koordináta alapján menne, hanem típus vagy egyéb azonosító alapján).
Amúgy én némileg kételkedem abban, hogy a terminál ablak egy szimpla edit control lenne. Legalábbis ha szimulálnia kell tudni mindenféle terminál fícsört, mint pl. színezés, akkor ez lehet, hogy inkább valami speciális ablak lesz, aminek valami saját renderelése van, és akkor abból nem fogsz tudni kiolvasni szöveget. A beírás sem úgy megy, gondolom, hogy beleírsz egy edit controlba valami szöveget, hanem inkább a lenyomott billentyűket adod át, nem?
-
kovisoft
őstag
Lehet, hogy nem azt az edit controlt találtad meg, amiben a szöveg van (egyáltalán edit controlban van?). Valami alapján be kellene azonosítanod, hogy melyik child window-t keresed. Ha nem megy auto_id, class, window title, hierarchia, stb alapján, akkor esetleg megpróbálkozhatsz koordináta alapján: .from_point(x, y). De csak tippelek, mert nincs tapasztalatom a pywinauto-val.
-
kovisoft
őstag
A control_type="Tab" egy TabControl-t választ ki, mutatja is a hibaüzenet, hogy egy TabControlWrapper objektumról van szó. Mint ahogy írták előttem, ennek nincs Edit attribútuma.
Szerintem a tab-nak az edit controlját kellene megkeresni, ami tippre a tab-nak valami childja lehet, de nem ismerem az applikációt. És gondolom control_type="Edit" kellene az EditWrapper lekéréséhez, annak lesz majd Edit attribútuma.
-
kovisoft
őstag
válasz
magortaltos
#3305
üzenetére
Ha python 2.x-et használsz, akkor próbáld meg így:
print("\033[%d;%dH%s" % (y, x, text))
-
kovisoft
őstag
válasz
jbalint18
#3085
üzenetére
Igen, szerintem az volt az eredendő probléma, hogy egyenlőtlenségek helyett egyenletekkel dolgoztál. Ezért is kellett bevezetned a 6 tonna fiktív sort, mert enélkül egyenletként nem jött ki megoldás, mivel az egyenlet bal oldalát a sorok egy lineáris kombinációjával ki lehetett nullázni, de ugyanez a lineáris kombináció nem nullázta ki a jobb oldalát. Furcsa is volt nekem, hogy míg bal_ineq-nak (azaz egyenlőtlenségnek) nevezted el a mátrixodat, addig azt az A_eq (azaz egyenlőség) paraméternek adtad át az A_ub (upper bound) helyett.
-
kovisoft
őstag
válasz
lanszelot
#3072
üzenetére
Az eredeti kérdésed (hogyan kell egy adott .py-t elindítani) meg lett válaszolva. Utána viszont abba a problémába futottál bele, hogy nem megy nálad a django, valószínűleg valami telepítési probléma miatt. Ezért javasolták neked a django és/vagy a python újratelepítését, esetleg másik verzió felrakását. Én még soha nem használtam djangot, ezért nem tudom neked pontosan elmondani, hogyan kell djangot telepíteni. De biztos vagyok benne, hogy erről bőven lehet a neten találni leírást (pl. ezt, de nyilván fontos, hogy miből milyen verziót használsz). A python telepítése/leszedése pedig Windows alatt pont ugyanúgy történik, mint bármilyen más program telepítése/leszedése.
-
kovisoft
őstag
válasz
lanszelot
#3050
üzenetére
Az linkelt képeden az első hibaüzenet azért van, mert nem adtad meg a python3 elérési útvonalát, így nem tudta azt elindítani. Add meg itt a python3 teljes elérési útvonalát.
A második hibaüzenet pedig azért, mert aztán valahogy mégis elindítottad a pythont, ezt mutatja a 3 kacsacsőr (>>>) prompt is. És aztán pythonon belül akartad úgy indítani a manage.py-t, hogy beírtad szimplán a nevét. De belülről így kell indítani:
exec(open("manage.py").read()) -
kovisoft
őstag
Ha úgy kérsz másoktól segítséget, hogy azok, akiktől ezt várod, nem értik meg, mit szeretnél, és ezért nem is tudnak segíteni, na az az "egyéni szoc".
Én pl. csak ezeket nem értettem meg abból, amit írtál, de lehet, hogy bennem van a hiba:
Mi ez az "ini file"? Ez tartalmaz valami programkódot, hogy futtatni lehet? Mit jelent az, hogy ini file-okat futtat
phytonpython program alatt? Ami titkosítva van, az milyen módszerrel van titkosítva? ini file-t vagy python kódot kellene php-re fordítani? Vagy ez az ini file-nak nevezett valami ez maga egy python kód? -
kovisoft
őstag
Nézd meg ezt, hátha nálad is valami ilyen probléma van.
-
kovisoft
őstag
válasz
garga pista
#2991
üzenetére
Maga a hiba arról szól, hogy amikor a payload-ot be akarná tölteni, akkor megnézi, hogy amit beolvas, az 0x01020304-gyel kezdődik-e (big endian módban, azaz a payload a 0x04, 0x03, 0x02, 0x01 byte-okkal kezdődik-e). És nem ezt találja. Belenézve egy ilyen bin file-ba, ez a payload a 0x80-as offsetnél kezdődik, tehát jó lenne tudni, hogy mit csinál előtte a decode.py programod a file első 128 byte-jával. Tippre először be kellene olvasnia a read_header()-ben egy 16 byte-os header magic-et és egy 112 byte-os headert, és akkor el is jutna a 0x80-as offsethez, onnan jöhetne a payload.
-
kovisoft
őstag
válasz
garga pista
#2988
üzenetére
Az, hogy "nem akarja kinyitni", pontosabban mit jelent? Dob valami exceptiont?
-
kovisoft
őstag
válasz
Fecogame
#2982
üzenetére
Ha be tudsz lépni böngészőben, akkor nézd meg a belépés utáni oldal forráskódját is, és hogy abban hogyan szerepel a felhasználóneved. A kód ilyen formában keresi: <b>username</b></span>, de valószínűleg már változott az oldal és most másként jeleníti meg, tehát ennek megfelelően kellene módosítani a SEARCH_STR változót is.
Viszont ha az egésszel nem akarsz foglalkozni, akkor kommentezd ki az elif SEARCH_STR blokkot, és akkor kihagyja ezt az ellenőrzést. Ettől függetlenül már beléptetett, ha jó a jelszó. Ez utóbbi megoldásnak annyi a hátránya, hogy nem fogsz róla tudni, ha mégis valami hiba lépett fel login közben, és nem sikerült a belépés.
-
kovisoft
őstag
válasz
GaezhyFeri
#2944
üzenetére
Kérésedre idemásoltam ezt a linket: [link]
-
kovisoft
őstag
válasz
mylastage
#2935
üzenetére
Korábban azt hittem, hogy tényleg egy probléma megoldásáért fordultál a topikhoz. De most már látom, hogy nem ez a célod, hiszen a megoldásra kaptál már több javaslatot is, hogy ha a konkrét céljaidnak nem felel meg a lebegőpontos aritmetika, akkor milyen egyéb lehetőségeid vannak (egész számok, decimal, fractions, sympy, stb). De valahogy ezeket nem veszed figyelembe. Azt sem vagy hajlandó megérteni, amit szintén már számtalanszor leírtunk, hogy ez nem programnyelv, hanem számábrázolás függő. Más programnyelven is ugyanezzel a problémával fogsz szembesülni lebebőpontos számok használata esetén.
-
kovisoft
őstag
válasz
mylastage
#2918
üzenetére
A MIÉRTet korábban már elmondtuk, de akkor megpróbálom jobban kifejteni. 10-es számrendszerben is csak azokat a törteket tudjuk véges alakban felírni, amelyek nevezőjében csak a 10 prímtényezőinek, azaz 2-nek és 5-nek valamilyen hatványa szerepel, mint pl. 1/5, 3/8, 17/40. Minden más végtelen tizedes tört lesz, mint pl. 1/6, 2/7, 8/11.
Ugyanez igaz a 2-es számrendszerre is: csak azokat a törteket tudjuk véges alakban felírni, amelyeknek a nevezőjében valamilyen 2-hatvány szerepel, mint pl. 1/2, 3/8, 47/256. Minden más végtelen kettedes tört lesz.
Vegyünk egy példát: 1/5. Ez tízes számrendszerben 0,2. Ha ugyanezt 2 (vagy 1/2) hatványaival akarjuk felírni, akkor mi lesz? 1/5 = 1/8+1/16+1/128+1/256+1/2048+1/4096+... ami ez a végtelen kettedes tört lesz: 0,001100110011... Mivel csak véges számjegyen ábrázolhatjuk mindezt, ezért itt mindenképpen lesz egy kerekítés, azaz az 1/5 nem pontosan 0,2, hanem egy icipicit kisebb vagy nagyobb számként lesz tárolva (a kerekítés irányától függően).
És ahogy előttem már írták, ennek semmi köze a Pythonhoz, ez minden programozási nyelven így van, ahol lebegőpontos számábrázolást használunk.
-
kovisoft
őstag
válasz
mylastage
#2914
üzenetére
Ennek is pont ugyanez az oka. Nem végtelen tizedes törtről, hanem végtelen kettedes törtről van szó. Tehát olyan véges tizedes törtről, amelyik csak tízes számrendszerben felírva véges, de kettes számrendszerben felírva végtelen. A gép ugyanis kettes számrendszerben tárolja a számokat, a lebegőpontosakat is.
Nem tudom, milyen hibás szorzásra gondolsz. Ha egész számokat szorzol, akkor az eredmény is egész és pontos lesz.
-
kovisoft
őstag
válasz
mylastage
#2912
üzenetére
A sokadik tizedesjegynél való eltérés azért adódik, mert amikor nem egész számokkal dolgozik a számítógép, akkor lebegőpontosan tárolja azokat, kettedes tört formájában, és vannak véges tizedes törtek, amik csak végtelen kettedes törtként ábrázolhatóak (hasonlóan ahhoz, mint ahogy az 1/3-ot csak végtelen 0.33333... formájában tudjuk tizedes törtként ábrázolni, harmados törtként meg ez a 0.1), ezért óhatatlanul kerekítve lesznek. Ha egy ilyen végtelen kettedes törtet utána visszaalakítjuk tizedes törtté, akkor lesz ez a pici eltérés a tároláskori kerekítés miatt.
Ezért szokás a pénzügyi rendszereknél, ahol 1 fillér vagy cent sem térhet el, hogy egész számokkal dolgozunk, pl. mindent fillérben, egész számként tárolunk és számolunk, a számítások eredményét is egészre kerekítjük, kiírásnál pedig a 100-zal való osztás hányadosát és maradékát írjuk ki.
De én kipróbáltam a programodat egy round() beiktatásával, és nem látom, hogy hol adna rossz eredményt:
> while (szamlalo < 21):
... cad = round(arfolyam_eurtocad * szamlalo, 2)
... print (szamlalo, " EUR = ", cad, " CAD ")
... szamlalo = szamlalo + 1
...
1 EUR = 1.57 CAD
2 EUR = 3.14 CAD
3 EUR = 4.71 CAD
4 EUR = 6.28 CAD
5 EUR = 7.85 CAD
6 EUR = 9.42 CAD
7 EUR = 10.99 CAD
8 EUR = 12.56 CAD
9 EUR = 14.13 CAD
10 EUR = 15.7 CAD
11 EUR = 17.27 CAD
12 EUR = 18.84 CAD
13 EUR = 20.41 CAD
14 EUR = 21.98 CAD
15 EUR = 23.55 CAD
16 EUR = 25.12 CAD
17 EUR = 26.69 CAD
18 EUR = 28.26 CAD
19 EUR = 29.83 CAD
20 EUR = 31.4 CAD -
kovisoft
őstag
válasz
Jhuzaka
#2880
üzenetére
Ha az input "11.19" formában van, akkor használhatod a már említett strptime()-ot, de ha ennek nem adsz meg évet, akkor az alapból 1900 lesz. Ezért valahogy meg kell adnod az évet is, pl. kiveszed a today()-ből (persze az évváltásra oda kell figyelni):
> from datetime import datetime
> year=datetime.today().year
> shipment="11.19"
> shipdate=datetime.strptime(str(year)+"."+shipment, "%Y.%m.%d").date()
> print(shipdate)
2020-11-19 -
kovisoft
őstag
válasz
Jhuzaka
#2876
üzenetére
Nem biztos, hogy pontosan megértettem, mit szeretnél, de ha a rendelésfelvétel napja egy dátum objektumban van, és szeretnéd az inputként megadott hónapot és napot is dátummá konvertálni, akkor használhatod a datetime.date()-et (az aktuális évet ki lehet szedni a datetime.datetime.today().year-ből):
> import datetime
> x=datetime.date(2020,11,13)
> print(x)
2020-11-13Vagy ha formattált dátum stringből szeretnél date-et csinálni, akkor az strptime()-ot:
> y=datetime.datetime.strptime("2020.11.23", "%Y.%m.%d").date()
> print(y)
2020-11-23
Két dátum különbségét kivonással kapod:> print((y-x).days)
10 -
kovisoft
őstag
válasz
concret_hp
#2851
üzenetére
unicodedata.normalize('NFKD', s).encode('ascii', 'ignore').decode('utf-8')
'ou'
unicodedata.normalize('NFKD', s).encode('ascii', 'ignore').decode('utf-8') == 'ou'
True -
kovisoft
őstag
válasz
concret_hp
#2847
üzenetére
Ez más miatt false, ugyanis az encode nem stringet ad vissza:
import unicodedata
s='óú'
unicodedata.normalize('NFKD', s).encode('ascii', 'ignore')
b'ou'
unicodedata.normalize('NFKD', s).encode('ascii', 'ignore') == 'ou'
False
unicodedata.normalize('NFKD', s).encode('ascii', 'ignore') == b'ou'
True -
kovisoft
őstag
válasz
concret_hp
#2840
üzenetére
Nézd meg ezt.
-
kovisoft
őstag
Így van, jól mondja asuspc96, a target argumentumban egy függvény (callable object) referenciát kell megadni (azaz szimplán a függvény nevét kell beírni), és majd a rendszer fogja azt meghívni, amikor elindítod a threadet. Ha viszont odaírod a "()"-t is, akkor te magad hívod meg a függvényt, ami jelen esetben ráadásul olyan, hogy soha nem tér vissza, ezért el sem jut odáig a vezérlés, hogy létrejöjjön a thread. Próbáld így:
keephopealive = threading.Thread(target=self.goproCamera.KeepAlive, args=()) -
kovisoft
őstag
válasz
asuspc96
#2776
üzenetére
Rendben, akkor én értettem félre. Ha meg kell várniuk egymást és egyszerre kell újraindulniuk, akkor jó lesz cog777 join-os megoldása.
Pythonban nem lesz memóriaszivárgás, mert automatikusan felszabadítja azokat az objektumokat, amikre már nincs referencia.
Szerk: lassú voltam.
Új hozzászólás Aktív témák
- Új Xiaomi Redmi 15 128GB, Kártyafüggetlen, 1 Év Garanciával
- BESZÁMÍTÁS! Gigabyte H610M i5 12400F 32GB DDR4 1TB SSD RX 6800 16GB Zalman Z1 Plus Seasonic 750W
- Keresünk Galaxy S21/S21+/S21 Ultra/S21 Fe
- Telefon felvásárlás!! iPhone 16/iPhone 16 Plus/iPhone 16 Pro/iPhone 16 Pro Max
- Csere-Beszamitás! Playstation 5 Slim Disc Edition! Lemezes
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Laptopszaki Kft.
Város: Budapest
) .
, de igen, valami olyasmire gondoltam, mint az rjust() rész, amit írsz. A lényeg az, hogy ha ugyanannyi számjegyből állnak a számaid, akkor a string (azaz ábécé szerinti) rendezés ugyanazt a sorrendet adja, mint a számok nagyság szerinti rendezése.

