Anonymní profil Vozka – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Vozka – Programujte.comAnonymní profil Vozka – Programujte.com

 

Příspěvky odeslané z IP adresy 77.237.140.–

Vozka
Python › Zjištění souřadnic v gridu (…
23. 4. 2008   #72167

Dobrý ještěr.
Pracuji na jednoduchém elektronickém úkolníčku, převody kódování jsem díky vám snadno vyřešil, ovšem nyní jsem se zasekl jinde. Momentálně zařizuji možnost upravit v úkolníčku záznam, ovšem setkal jsem se se dvěma problémy, nejdříve pastnu důležité funkce pro pochopení.

def vypis(): # tato vypíše do hlavního okna seznam úkolů

row = 2
global Lporadi, Ldulezitost, Ltext, Lcas, Ldatum, Lalert, Luprav

...zkráceno...

for n in ukoly:
if n > 0:
Lporadi = Lporadi+[Label(root, text=str(n[0])+".")]
Lporadi[row-2].grid(row=row, column=0, padx=10, sticky=NW)
Ldulezitost = Ldulezitost+[Label(root, text=unicode(n[1]))]
Ldulezitost[row-2].grid(row=row, column=1, padx=10, sticky=NW)
Ltext = Ltext+[Message(width=500, text=n[2])]
Ltext[row-2].grid(row=row, column=2, padx=5, sticky=NW)
Lcas = Lcas+[Label(root, text=(n[3][0],":",n[3][1]))]
Lcas[row-2].grid(row=row, column=3, padx=10, sticky=NW)
Ldatum = Ldatum+[Label(root, text=(str(n[4][2])+". "+str(n[4][1])+". "+str(n[4][0])))]
Ldatum[row-2].grid(row=row, column=4, padx=10, sticky=NW)
Lalert = Lalert+[Label(root, text=n[5])]
Lalert[row-2].grid(row=row, column=5, padx=10, sticky=NW)
Luprav = Luprav+[Button(root, text=u"Upravit")]
Luprav[row-2].grid(row=row, column=6, sticky=NW, padx=5)
Luprav[row-2].bind("<1>", uprav2(Luprav[row-2])) # důležité, tohle u každého záznamu vytvoří tlačítko, které otevře upravovací okno (funkce uprav2)
row = row + 1


def uprav2(instance): # Vytvoří okno pro úpravu záznamu. Parametr neco je instance TkInteru "Event", kterou mi nevím proč posílá a nevím jak ji využít ani jak se jí zbavit.

print instance.grid_info()
global dulezitostu, predmetu, hodinyu, minutyu, denu, mesicu, roku, upozorneniu
ouprav = Toplevel()
ouprav.title("Upravit záznam č. ")
ouprav.option_add('*Font', 'Arial 10')
Label(ouprav, text=u"Důležitost:").grid(row=1, column=0, padx=1, sticky=NW)

...zkráceno, tady jsou widgety stejné jako ve "vypsat", až na to že se jinak jmenují...

zapsatu = Button(ouprav, text=u"Přidat!", command=upravzaznam)
zapsatu.grid(row=1, column=15, sticky=NW, padx=5)


No a nakonec funkce upravzaznam, která vezme data z okna pro úpravu a zapíše je do proměnné se seznamem úkolů:
def upravzaznam():

global ukoly
mesic2 = int(mesicu.get())
den2 = int(denu.get())
hodiny2 = int(hodinyu.get())
minuty2 = int(minutyu.get())
if mesic2 < 10:
mesic2 = "0"+str(mesic2)
if den2 < 10:
den2 = "0"+str(den2)
if hodiny2 < 10:
hodiny2 = "0"+str(hodiny2)
if minuty2 < 10:
minuty2 = "0"+str(minuty2)
predmet2 = predmetu.get(1.0, END)
predmet3 = predmet2[0:len(predmet2)-1]
cas = str(dulezitostu.get())+str(roku.get())+str(mesic2)+str(den2)+str(hodiny2)+str(minuty2)
ukoly[3] = [0, dulezitostu.get(), predmet3, [str(hodinyu.get()), minuty2], [str(roku.get()), str(mesicu.get()), str(denu.get())],
# tak a tady vidíte, že se zapisuje do proměnné ukoly na třetí (tedy vlastně čtvrtou) pozici, což je právě problém, který popíšu níže.
str(alert), str(cas)]
if len(ukoly)>1:
if ukoly[0] == 0:
ukoly.remove(0)
if len(ukoly)>1:
ukoly.sort(key=operator.itemgetter(6))
vypis()
zapis_do_souboru()



Dokud je napevno dané, který záznam upravuji, vše funguje - zde tedy chyba není. Jenže mám problém - potřebuji zjistit, ve kterém řádku se nachází tlačítko, na které jsem klikl a který záznam tudíž upravuji. To se dá udělat tak, že jako argument funkci uprav2 (ta, která tvoří okno pro úpravu záznamu) odeslal jednoduše celou instanci tlačítka a následně ve funkci uprav2 vyčetl v jakém řádku se nachází pomocí grid_info() (to ještě není úplně hotové jak můžete vidět), jenže problém je v tom, že se funkce uprav2 spustí už při startu programu místo po kliknutí na tlačítko, takže se při spuštění objeví pět stejných oken pro úpravu (tolik je záznamů v databázi) a navíc pokud je pozavírám a kliknu na tlačítko Přidat!, tak se funkce znovu nespustí a žádné okno se neobjeví. Může mi někdo prosím poradit co s tím? V programování jsem naprostý začátečník a na tohle jsem nikde odpověď nenašel (ač jsem hledal, tutoriály z programujte mám také přečtené).

Toto se mimochodem stane jen pokud funkci uprav2 posílám nějaký argument, jinak ne, jenže nevím jak by bez odesílání argumentu bylo možné zjistit, na které z tlačítek jsem klikl (možná pomocí oné odesílané instance event co se odesílá jen když žádný argument neodešlu sám?).

Předem díky za odpověď.

Vozka
Python › Zápis do souboru s interpunkcí
30. 3. 2008   #70184

Aha, na PyCZ jsem se koukal, ale tohle jsem úplně přehlédl. V příkladech je přesně můj případ, stačí pomocí encode převést string z unicode třeba utf-8:

# -*- coding: utf-8 -*-


text=u"Žluťoučký kůň pěl ďábelské ódy."

f=open("Kun.txt","w")
f.write(text) # způsobí error
f.write(text.encode("utf8")) # ok
f.close()


Vše funguje, děkuji za pomoc :) (navíc velmi rychlou)

Vozka
Python › Zápis do souboru s interpunkcí
30. 3. 2008   #70174

Dobrý ještěr. Narazil jsem na problém, který neumím vyřešit: Momentálně pracuji na jakémsi úkolníčku, jehož jednou ze základních featur je načítání a ukládání seznamu úkolů z/do souboru. Přišlo mi jako zbytečně megalomanské řešení používat nějaký databázový modul a rozhodl jsem se tedy ukládat seznam do textového souboru pomocí file() a write(), přičemž na každé řádce v souboru mám uloženo 10 proměnných (důležitost, předmět úkolu, hodina, den, měsíc atd.) navzájem oddělených znakem $ (to možná ještě změním kupříkladu na <$> pro případ, že bych potřeboval $ do úkolu zadat, i když to není příliš pravděpodobné).

Načítání i ukládání funguje bez problémů, ovšem jen pokud v popisu úkolu (jediný text v "databázi", vše ostatní jsou číselné hodnoty) nepoužívám interpunkci. Kódování mám nastaveno správně - v úvodu souboru i ve vlastnostech mám cp1250, čárky i háčky se ve výpise úkolů normálně zobrazují a problém nastává až ve chvíli, kdy se pokusím řetězec s interpunkcí zapsat do souboru. Dodatek: V průběhu psaní příspěvku jsem zkusmo změnil kódování na utf-8 a výylsedek je úplně stejný.

Cesta řetězce je následující: Jako grafické prostředí používám Tkinter, tedy napíši text s háčkami a čárkami do udělátka Text, odkud se pomocí funkce get() uloží jako string do seznamu, odkud se zapisuje do souboru. Zkoušel jsem řetězec před zápisem do souboru zkonvertovat pomocí unicode(), ovšem výsledek je stejný.

Error je následující:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

přičemž error je vyhozen samozřejmě u řádky, kde se obsah řetězce zapisuje do souboru a obsah řetězce byl "ččč"


Důležité části kódu zde:


#část funkce pro zápis do seznamu
predmet2 = predmet.get(1.0, END)
predmet3 = predmet2[0:len(predmet2)-1]
ukoly.append([0, dulezitost.get(), predmet3, [hodiny2, minuty2], [rok.get(), mesic2, den2], str(alert), str(cas)])

#Funkce, která zapíše seznam do souboru
def zapis_do_souboru():
global ukoly
if os.path.exists("databaze.txt"):
os.remove("databaze.txt")
soubor = file("databaze.txt", "w")
for n in ukoly:
soubor.write(str(n[0]))
soubor.write("$")
soubor.write(str(n[1]))
soubor.write("$")
soubor.write(unicode(n[2])) #TOTO je onen osudný řetězec (teď je tu unicode(), ale zkoušel jsem i str() a nic)
soubor.write("$")
soubor.write(str(n[3][0]))
soubor.write("$")
soubor.write(str(n[3][1]))
soubor.write("$")
soubor.write(str(n[4][0]))
soubor.write("$")
soubor.write(str(n[4][1]))
soubor.write("$")
soubor.write(str(n[4][2]))
soubor.write("$")
soubor.write(str(n[5]))
soubor.write("$")
soubor.write(str(n[6]))
soubor.write('\n')
soubor.close()

#funkce pro načtení seznamu ze souboru, osudný řetězec je opět [2]
def precti_ze_souboru():
global ukoly
databaze = open("databaze.txt")
ukoly2=[]
for line in databaze:
line2 = line.replace("\n", "").split("$")
line3 = [line2[0], line2[1], line2[2], [line2[3], line2[4]], [line2[5], line2[6], line2[7]], line2[8], line2[9]]
ukoly2.append(line3)
ukoly = ukoly2

#pro jistotu ještě udělátko Text, pomocí kterého se do seznamu zapisuje onen řetězec
predmet = Text(pridat, padx=5, width=60, height=5)
predmet.grid(row=1, column=3, sticky=NW)



Předem děkuji za pomoc.

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032021 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý