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ěď.