Nakonec jsem zjistil, že stačí u proměnné seznam místo těchto ( ) dát tyto a nemusím nic převádět [ ]. Podařilo se mi ještě vytvořit funkci pro výběr písmen, která je potřeba procvičit znovu. Jen po výběru se ještě musí zvolit - Zapsat písmena (nevím, jak to udělat, aby se po zavření okna zapsala automaticky).
Jediné, čemu opravdu nerozumím, je proč někdy při dvojkliku myší, tento vyjde jakoby naprázdno - písmeno z listboxu nezmizí (viz. volanafunkce() a vytvor (param). Totéž se dělo pokud jsem měl verzi, kde jsem využíval funkci pro odstranění již rozpoznaných písmen klik (param). V tom případě to hlásí tuto chybu:
python pismena-NV.py
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib64/python2.7/lib-tk/Tkinter.py", line 1541, in __call__
return self.func(*args)
File "pismena-NV.py", line 35, in vytvor
index=listbox.curselection()[0]
IndexError: tuple index out of range
Zde je celý kód, včetně řádků, které jsem původně používal pro odladění, díky za jakýkoli postřeh:
# -*- coding: utf-8 -*-
from Tkinter import*
import time
import random
import os
seznam=['M','m','L','l','S','s','P','p','A','a','Á','á','O','o','Ó','ó','E','e','É','e','I','i','Í','í','N','n','Š','š','D','d','Z','K','k','B','b','C','c','R','r','U','u','Ú','ú','Ů','ů','Č','č']
#seznam=['a','á','b','c','č','d','ď','e','é','ě','f','g','h','ch','i','j','k','l','m','n','ň','o','ó','p','q','r','ř','s','š','t','ť','u','ú','ů','v','w','x','y','z','ž'] # stačí tu mít [] a seznam půjde upravovat
i=0
novy_seznam=[]
def nova_pismena():
global seznam
seznam=novy_seznam
# print seznam
def vsechna_pismena():
global seznam
seznam=['M','m','L','l','S','s','P','p','A','a','Á','á','O','o','Ó','ó','E','e','É','e','I','i','Í','í','N','n','Š','š','D','d','Z','K','k','B','b','C','c','R','r','U','u','Ú','ú','Ů','ů','Č','č']
def focusWidget(udalost):
udalost.widget.focus_set()
def vytvor(param):
global novy_seznam
global seznam
global i
index=listbox.curselection()[0]
nove_pismeno=seznam[index]
novy_seznam.append(nove_pismeno)
del seznam[index]
# print novy_seznam
listbox.delete(ANCHOR)
def klik(param):
global seznam
#print listbox.curselection()[0]
index=listbox.curselection()[0]
#print index
del seznam[index]
#print seznam
listbox.delete(ANCHOR)
def volanafunkce():
global listbox
mazaci_okno = Tk()
mazaci_okno.geometry("100x200+170+160")
mazaci_okno.option_add('*Font', 'serif 20')
listbox = Listbox(mazaci_okno)
listbox.bind( "<1>", None)
#listbox.bind("<Double-Button-1>", klik) # metoda se volá až po uvolnění myši
listbox.bind("<Double-Button-1>", vytvor)
#listbox.bind("<Enter>", focusWidget)
listbox.pack()
listbox.insert(END,'M','m','L','l','S','s','P','p','A','a','Á','á','O','o','Ó','ó','E','e','É','e','I','i','Í','í','N','n','Š','š','D','d','Z','K','k','B','b','C','c','R','r','U','u','Ú','ú','Ů','ů','Č','č')
#listbox.insert(END,'a','á','b','c','č','d','ď','e','é','ě','f','g','h','ch','i','j','k','l','m','n','ň','o','ó','p','q','r','ř','s','š','t','ť','u','ú','ů','v','w','x','y','z','ž')
#b = Button(hlavni, text="Smazat!",command=lambda : listbox.delete(ANCHOR))
#b.pack()
f = open('testfile.txt', 'w')
z = str(listbox.get(0,END))
f.write(z)
f.close()
hlavni = Tk()
w = Label(hlavni, text=u"Písmena abecedy", fg="red") # zůstalo jen proto, že jinak global w is not defined
nabidka = Menu(hlavni)
hlavni.config(menu=nabidka)
menuSoubor = Menu(nabidka)
nabidka.add_cascade(label="Vyber písmena", menu=menuSoubor)
menuSoubor.add_command(label=u"Výběr", command=volanafunkce)
menuSoubor.add_command(label=u"vsechna_pismena", command=vsechna_pismena)
menuSoubor.add_command(label="Zapiš nová písmena", command=nova_pismena)
helpMenu = Menu(nabidka)
nabidka.add_cascade(label=u"Nápověda", menu=helpMenu)
helpMenu.add_command(label=u"O aplikaci", command=volanafunkce)
exp = IntVar()
c = Checkbutton(hlavni, text="rychleji", variable=exp,onvalue=1000, offvalue=2000) # offvalue hodnotu nepřiřadí, zůstává 0, dokud se po zaškrtnutí neodškrtne
# cislo=exp.get() číslo si další čast programu nezapamatuje
c.pack()
# hlavni.geometry('{}x{}'.format(150, 100))
hlavni.geometry("150x120+10+10") # + 10 měním tu pozici vůči oknu s písmeny, ale nevím jak přesně
ram = Frame(hlavni)
ram.pack()
text=Text()
text.pack()
text.tag_config("modre", foreground="blue", underline=0)
text.insert(END, "(c) J. Šolc", "modre")
var = IntVar()
button = Button(hlavni, text="Spusť písmena", command=lambda: var.set(1))
button.place(relx=.5, rely=.5, anchor="c")
#button.grid(column=1, row=1)
button.wait_variable(var)
#okno.geometry('{}x{}'.format(150, 100)) #zde se určí velikost okna
okno=Tk()
okno.geometry("150x100+160+160") # měním tím pozici vůči oknu Spusť
w.pack()
def add_pismeno():
global seznam
global novy_seznam
global w
global cislo
global pismeno
if seznam:
pismeno=random.choice(seznam)
#vypis=list(seznam) #nutné převést seznam na výpis - anebo seznam rovnou zavést jako vypis - viz pismena-list.py
#vypis.remove(pismeno)
seznam.remove(pismeno)
else:
pass
#if not vypis:
# pass
#else:
# seznam=tuple(vypis) #výpis se převede zpět na seznam
if w:
w.pack_forget()
w = Label(okno, text=pismeno, font=("Helvetica", 40))
w.pack()
cislo=exp.get() # exp si zapamatoval, proto přiřazuji číslo až zde
# print cislo
# print "variable is", exp.get() # řádky pro odladění
if cislo==0:
cislo=2000 # nastavení pro pomalý běh
else:
pass
okno.after(cislo,add_pismeno)
print len(seznam)
#print pismeno
add_pismeno()
tlKonec = Button(ram, text=u"KONEC", fg="red", command=sys.exit) #exit zavře obě okna
tlKonec.pack(side=LEFT)
tlKonec.grid(column=2, row=2)
okno.mainloop()