Druhá možnost je nahradit poslední řádek tímto:
obj = TestClass(*a)
Hvězdička před parametrem znamená, že objekty v listu se předají jako samostatné parametry.
Druhá možnost je nahradit poslední řádek tímto:
obj = TestClass(*a)
Omlouvam se, normalne bych mu odpovedel velice slusne, ale zrovna jsem mel spatnou naladu, kterou navic podporila prvni odpoved v tomto vlaknu (vsimnete si, prosim, ze ja nejsem ten prvni clovek, ktery odpovedel). Moje odpoved (ta, kterou jste citoval) predpokladala, ze predchozi otazka jiz byla zodpovezena a navic jsem si nevsiml, ze tazatel se vlastne stale pta na to same, protoze to vypadalo, jde o uplne novou otazku. Ja osobne jsem tedy odpovidal pouze na druhou otazku, ktera, jak jiste uznate, neni prilis informativni a specificka. Uznavam, ze se dalo odpovedet lepe, ale musel bych se zapojit do diskuze drive, abych mohl odpovedet jiz na prvni otazku. Takhle jsem se vlastne pridal na stranu toho, kdo odpovidal (coz je nejspise strana spatna). Znovu se tedy omlouvam a posilam strucnou ukazkovou odpoved, kterou bych podal, kdybych mel prilezitost byt ten, kdo odpovedel jako prvni.
Tomik napsal:
Chtel jsem se zeptat. Jak udelam podminku na to jestli existuje nejaky soubor?
import os
if os.path.isfile(r"c:\soubor.txt"):
#delej neco se souborem
else:
#soubor neexistuje
Aha, to jsem z tve otazky asi nepochopil. Chtelo by to ji presneji formulovat.
Ackoliv to neni zrovna spravny pristup (ve smyslu tom, ze kazda vyjimka by mela byt osetrena), da se to obejit takhle:
try: a=1/0 #neco co vyvola vyjimku
except: pass #neco co nic nedela
Nevim, jestli se da odpovedet slusne. Zkusim to.
Tady neni potreba ani ten Google, staci ti interpreter Pythonu, schopnost psat na pocitaci a spustit program, pripadne si precist chybovou hlasku.
Jo a jinak: ano, musi.
V Pythonu delam a vim, ze kdyz chces mit tuple pouze s jednim prvkem, musis za nej umistit carku.
Tedy takhle:
name=askopenfilename(title="Soubor", filetypes=(('WAV Files', '*.wav'),))
Kódování jsem použil iso-8859-2.
text_v_unicode = nacteny_text.decode("iso-8859-2")
text_v_unicode = nacteny_text.decode(sys.stdin.encoding) # nezapomeň na 'import sys'
Ještě abych řekl "proč" a ne jenom "jak": Jde o to, že jedna událost (event) je například jeden stisk klávesy, jedno puštění klávesy atd. Pokud stiskneš víc kláves úplně ve stejný okamžik (což by se ti pravděpodobně nepovedlo, ale teoreticky), tak se stejně vygenerují dvě události, které ty budeš vyhodnocovat postupně. Tudíž hodnota event.key se nemůže rovnat dvěma klávesám, ale vždy jen jedné. Proto si také musíš ukládat, v jakém stavu je která klávesa.
Na to si udělej proměnnou k_space a přiřazuj do ní stejně jako do k_left a k_right a až na konci (tam, kde máš teď "if k_jumpr") vyhodnoť "if k_left and k_space". Naopak k_jumpr a k_jumpl vůbec potřebovat nebudeš.
Já to obyčejně dělám tak, že nepoužívám set_repeat a když uživatel klávesu stiskne, zapamatuji si, že je stisknutá, pokud ji pustí, zapamatuji si, že už není stisknutá a nakonec vyhodnotím tyto hodnoty, které jsem si zapamatoval. Posílám přibližně ten úsek kódu, který si poslal ty, ale upravený způsobem, jakým bych to udělal já. Doufám, že bude užitečný.
# použijeme několik pomocných proměnných pro zapamatování stavu kláves
k_left = False
k_right = False
[...]
for event in pygame.event.get():
if event.type==QUIT:
sys.exit()
elif event.type==KEYDOWN:
if event.key==K_ESCAPE:
sys.exit()
# tady si uložíme stavy kláves, když byla klávesa stisknuta
elif event.key==K_LEFT:
k_left = True
elif event.key==K_RIGHT:
k_right = True
[...]
elif event.type==KEYUP:
# a tady když byla puštěna
if event.key==K_LEFT:
k_left = False
elif event.key==K_RIGHT:
k_right = False
[...]
# tady si vyhodnoť klávesy, které jsou stisknuté, jak chceš
if k_left:
[...]
if k_right:
[...]
Ještě se omlouvám, teď jsem si přečetl, že ten kód v tom odkazu nebude v tvém případě fungovat, protože dokáže přerušit pouze operaci, která je zaseklá v kódu Pythonu, ale ne tu, která je zaseklá v nějakém kódu na nižší úrovni, což je právě tvůj případ. Ještě jednou se tedy omlouvám za falešnou naději.
ještě ke komentářům k programu: třída locked_var je náhrada za tvou původní globální proměnnou a, ale je bezpečné volat funkce get() a set() ze dvou různých vláken současně, protože třída používá zámek, který před čtením nebo zápisem zamkne a potom zase odemkne. Nepamatuji si, jestli je v dokumentaci Pythonu něco o tom, že GIL tohle zajistí pro každou proměnnou, je to možné, ale i tak je lepší používat tento postup, i kdyby to mělo být jen kvůli tomu, že to tak je v jiných jazycích. Třída loop_thread je náhrada za tvoje loop(), dejme tomu, že je ekvivalentní, ale podle mě je rozumnější použít klasickou cestu, neboť Timer slouží ke spuštění funkce po nějakém čase, což není přesně to co chceme. loop_thread.__init__() si pouze uloží parametry, které jí předáme a zavolá __init__() funkci třídy threading.Thread, ze které je odvozená. Funkce run() je potom ta funkce, která bude zavolána v novém vlákně až zavolám start(), která je zděděna z threading.Thread.
Ještě si dovolím konstruktivní kritiku ke tvému programu: nepoužívej pouze "except:", vždy uveď kterého typu výjimky se to týká. Například v tvém případě by to bylo "except TypeError:". Je to proto, že i stisknutí Ctrl+C vyvolá výjimku a ty bys ji takhle odchytil, což není to co ty chceš a program by pak nešel tímto způsobem přerušit. I kdybys nevěděl, který typ chyby použít, uveď alespoň "except Exception:". Exception je třída odvozená od BaseException, ale KeyboardInterrupt je odvozen přímo od BaseException a ne od Exception, tudíž odchytávání Exception nezachytí KeyboardInterrupt. Asi jsem to napsal dost nepřehledně, takže doufám, že jsem tě tím ještě více nezmátl.
Operační systém většinou povoluje zabití vlákna, jenže problém je, že vlákno nedostane příležitost po sobě uklidit. Některé programovací jazyky dají programátorovi příležitost vlákno zabít, Python ovšem nikoliv, protože je jaksi zaměřen na začátečníky a nechce jim dávat do rukou zbraň hromadného ničení, kterou neumí ovládat. Nejlepší by bylo, kdybys měl možnost nějak výrazy zjednodušit, například vkládáním funkcí do pole a voláním jedné funkce po druhé.
funkce = [
lambda x: 2*x+1,
lambda x: x+5,
lambda x: x/2
]
n=1
for f in funkce:
n=f(n)
print n
Quiark napsal:
Tuším, že to bude výsledek global interpreter locku - když se počítá a*a, tak žádný jiný kód kvůli tomu neběží, takže ho ani nemůže zastavit. Pokud to tak je, tak s tím nic moc nenaděláš.
import time
import threading
class locked_var:
def __init__(self,var):
self.lock=threading.Lock()
self.var=var
def set(self,var):
self.lock.acquire()
self.var=var
self.lock.release()
def get(self):
self.lock.acquire()
ret=self.var
self.lock.release()
return ret
class loop_thread(threading.Thread):
def __init__(self,condition,a):
threading.Thread.__init__(self)
self.condition=condition
self.a=a
self.res=0
def run(self):
n=1
res=self.a
while self.condition.get() and n<self.a:
# dokud to neni zpocitano nebo neni vlakno ukonceno
res*=self.a
n+=1
print "bylo zpocitano a**"+str(n)
self.res=res
self.condition.set(True) # oznam, ze byl vysledek ulozen
a=55654
cond=locked_var(True)
t=loop_thread(cond,a)
print "startuji vlakno s parametrem "+str(a)
t.start()
time.sleep(5.5)
print "posilam signal na zastaveni..."
cond.set(False)
while not cond.get(): time.sleep(0.1) # cekame, az se vlakno doopravdy zastavi
# a ulozi vysledek
# vysledek je nyni v t.res
print "\nted jdu vysledek vytisknout, ale protoze"
print "ho nejdrive musim prevest z cisla na retezec,"
print "muze to trvat i nekolik minut"
print t.res
print "\nhotovo"
raw_input()
Jo, určitě dokáže, přes WinAPI jde na windowsech vlastně všechno, že ano. Kdysi jsem něco takového dělal, ale už si to přesně nepamatuju, ale určitě to bylo přes WinAPI. Možná se dá sehnat i nějaký pokročilejší modul, který to udělá za tebe...
Volání WinAPI funkcí lze uskutečnit přes modul win32api, ukládání hodnot do registrů jde potom udělat přes volání určitých API funkcí (msdn.com), s odesíláním mailu bohužel neporadím (řešil bych nalezením modulu nebo přímo přes socket) a nastavování atributů souborů -> API (jenom nevím, jak dobře to ten program skryje). Jo, a mimochodem, Python je jeden z nejhorších programovacích jazyků na psaní malware.
Tvoje část kódu by nejspíš vypadala nějak takhle:
class add1(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.i=0
def run(self):
while True:
self.i+=1
def f(s):
add1().start()
while True:
s.recv()
Úplně nejzákladnější možnost jak toto řešit v pythonu jsou vlákna, tedy např. modul threading. Doporučuju si najít navody na Googlu, anglicky jich je určitě spousta.
Doporučuji prostudovat modul threads, případně threading. Promiň, že ti to nepopíšu podrobněji, ale nemám čas. Buď tady ve fóru nebo jinde na netu určitě najdeš potřebné návody.
Jestli jsem to správně pochopil, tak chceš použít v řetězci zpětné lomítko.
To pak musíš napsat: "\\", neboli-zpětné lomítko značí speciální znak, pokud chceš napsat jen zpětné lomítko, musíš vždy napsat dvě.