Jak nastavit prodlevu v Tkinter – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak nastavit prodlevu v Tkinter – Python – Fórum – Programujte.comJak nastavit prodlevu v Tkinter – Python – Fórum – Programujte.com

 

Jaroslav Šolc
~ Anonymní uživatel
1 příspěvek
27. 7. 2018   #1
-
0
-

Chci zajistit výpis abecedy do okna s využitím Tkinter, tak, aby se vypsala v náhodném pořadí - to už níže uvedený kód zvládne - já ale potřebuji, aby za každým písmenem následovala 1s prodleva, než se vypíše další. Dík, nejsem programátor, potřebuji to pro děti na postřehování písmen. Programuji tak, že najdu nějaký program na webu, zjistím jak funguje, pak ho upravuji.

# -*- coding: utf-8 -*-
from Tkinter import*
import time
import random
import os

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')

okno=Tk()

w = Label(okno, text=u"Písmena abecedy", fg="red")
w.pack()

for i in range(1, 40): 
  
   pismeno=random.choice(seznam)
   vypis=list(seznam) #nutné převést seznam na výpis
   vypis.remove(pismeno) 
   seznam=tuple(vypis) #výpis se převede zpět na seznam
   w = Label(okno, text=pismeno, font=("Helvetica", 10))
   
#sem potřebuji něco, co zdrží další proběhnutí cyklu o 1 sekundu

   w.pack()

okno.mainloop()

Nahlásit jako SPAM
IP: 82.117.139.–
MilanL+1
Grafoman
27. 7. 2018   #2
-
0
-

#1 Jaroslav Šolc

většinou se to jmenuje sleep v pythonu přesněji time.sleep(cas v milisekundách) tzn pro 1s pauzu použít 

time.sleep(1000)

no program najdeš ale vlastní funkce ne?

google "python pause"

Nahlásit jako SPAM
IP: 91.139.9.–
JTS0
Newbie
27. 7. 2018   #3
-
0
-

#2 MilanL
Dík, ale time.sleep nefunguje, program se zastaví, okno se nevytvoří, nelze použít v Tk (je to v mnoha diskuzích např.: https://stackoverflow.com/…ore-it-opens). lze použít jen okno.after(1000,funkce), nicméně pokud w.pack() nadefinuji do funkce, nemění v okně můj program písmeno, zůstane jen u jednoho, místo všech písmen vypíše jen 40 x písmeno jedno.

Chci zajistit výpis abecedy do okna s využitím Tkinter, tak, aby se vypsala v náhodném pořadí - to už níže uvedený kód zvládne - já ale potřebuji, aby za každým písmenem následovala 1s prodleva, než se vypíše další. Dík, nejsem programátor, potřebuji to pro děti na postřehování písmen. Programuji tak, že najdu nějaký program na webu, zjistím jak funguje, pak ho upravuji.

# -*- coding: utf-8 -*-
from Tkinter import*
import time
import random
import os

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')

okno=Tk()

w = Label(okno, text=u"Písmena abecedy", fg="red")
w.pack()

for i in range(1, 40): 
  
   pismeno=random.choice(seznam)
   vypis=list(seznam) #nutné převést seznam na výpis
   vypis.remove(pismeno) 
   seznam=tuple(vypis) #výpis se převede zpět na seznam
   w = Label(okno, text=pismeno, font=("Helvetica", 10))
   
#sem potřebuji něco, co zdrží další proběhnutí cyklu o 1 sekundu

   w.pack()

okno.mainloop()

Nahlásit jako SPAM
IP: 82.117.139.–
JTS0
Newbie
27. 7. 2018   #4
-
0
-

#2 MilanL
Taky je to tady, ale nevím jak to převést na moji změnu písmena: http://programujte.com/forum/vlakno/5039-generovani-casovych-udalosti/

Nahlásit jako SPAM
IP: 82.117.139.–
MilanL+1
Grafoman
27. 7. 2018   #5
-
0
-

#3 JTS
v podstatě tam máš návod 

tu část co je cyklus převedeš na funkci - bez cyklu nakonec dáš ten after

a za funkcí to zavoláš poprvé, jediné co je třeba ošetřit je přístup k seznamu a ukončení když je prázdný.

zkusil bych to nějak takhle: 

# -*- coding: utf-8 -*-
from Tkinter import*
import time
import random
import os

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')

okno=Tk()

w = Label(okno, text=u"Písmena abecedy", fg="red")
w.pack()

def add_pismeno():
   global seznam
   global w
  
   if not seznam:
      okno.quit()
   pismeno=random.choice(seznam)
   vypis=list(seznam) #nutné převést seznam na výpis
   vypis.remove(pismeno) 
   seznam=tuple(vypis) #výpis se převede zpět na seznam
   if w:
      w.pack_forget()
   w = Label(okno, text=pismeno, font=("Helvetica", 10))
   w.pack()
   okno.after(1000,add_pismeno)

add_pismeno()   
okno.mainloop()
Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Grafoman
27. 7. 2018   #6
-
0
-

#5 MilanL
ten  ...after funguje v podstatě jako časovač (timer) okna, po uplynutí daného intervalu vyvolá událost obslouženou danou funkcí.

Na tom Stackoveru je to vysvětlené dost podrobně.

Nahlásit jako SPAM
IP: 91.139.9.–
JTS0
Newbie
27. 7. 2018   #7
-
0
-

#5 MilanL
Dík dokonce to dělá to, co jsem původně zamýšlel - původně zobrazené písmeno se změní v jiné. Trasoval jsem to ve Spyder, ale to okno "Písmena abecedy" zmizí, jakmile se dostane za řádek 14 "def add_pismeno():" tak to okamžitě skočí na řádek 30 "ad.pismeno()" a pak na řádek 31 "okno.mainloop()" - tady okno "Písmena abecedy" zmizí a je nahrazeno oknem, kde se střídají písmena. /Když to spustíš, vidíš jen toto okno/ . Také se přechodem z řádku 9 na ř. 12 "w.pack()" vytvoří zbytečně prázdné okno, které v dalším kroku zmizí a je nahrazeno oknem "Písmena abecedy".     Jestli já tohle někdy pochopím, jak to tu skáče .......

Každopádně moc dík, mám co upravovat ... nastavím velikost okna pro písmena, pokusím se v "okno.after(1000, ad_pismeno) použít proměnnou, která se nastaví na začátku ..., pokud bych byl veleúspěšný, odstraním prvně vzniklé prázdné okno a nechám písmena měnit se pod nápisem "Písmena abecedy"

Jak jednoduché to bylo v konzoli, tam šel jeden řádek za druhým:

# -*- coding: utf-8 -*-    # umožní české znaky
import time
import random
import os

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')

for i in range(1, 34): 
   os.system('clear')   # smaže obrazovku 
   pismeno=random.choice(seznam)
   print(pismeno)
   time.sleep(0.5)
   vypis=list(seznam) #nutné převést seznam na výpis
   vypis.remove(pismeno) 
   seznam=tuple(vypis) #výpis se převede zpět na seznam
   os.system('clear') 

Nahlásit jako SPAM
IP: 82.117.139.–
gna
~ Anonymní uživatel
1891 příspěvků
27. 7. 2018   #8
-
0
-

def je definice funkce. Když k ní dojdeš poprvé, tak se definuje ale neprovádí. Takže ti to skočí za ní.

Tam už je volání téhle funkce, takže to skočí do ní. Na konci funkce se to vrátí tam odkud byla volaná.

Jinak celý TkInter běží právě v mainloop, řeší svoje věci a spouští tvoje funkce. V tomhle případě tu jednu funkci opakovaně plánovanou ke spuštění pomocí after.

Vždycky se vytváří nový label a ukládá se do proměnné w, ale předtím se zruší pack toho, co v ní bylo předtím.

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1891 příspěvků
27. 7. 2018   #9
-
0
-

   

seznam = ['a', 'á', 'b', 'c', ... 'z']
random.shuffle(seznam)

okno = Tk()

label_nadpis = Label(okno, text=u"Písmena abecedy", fg="red")
label_nadpis.pack()
label_pismeno = Label(okno, text="...", font=("Helvetica", 10))
label_pismeno.pack()


def dalsi_pismeno():
    if not seznam:
        okno.quit()
        return
    label_pismeno['text'] = seznam.pop()
    okno.after(1000, dalsi_pismeno)


okno.after(1000, dalsi_pismeno)
okno.mainloop()
Nahlásit jako SPAM
IP: 213.211.51.–
MilanL+1
Grafoman
30. 7. 2018   #10
-
0
-

#7 JTS
stačí si oddělit ty okna pro nadpis a písmena - dát jim jiný název proměnné/objektu

ber to tak, že já v Py ani Tk nedělám, ten kód jsem převáděl z tvého zdroje a podle vzoru z odkazu.

Je to v podstatě obdoba fungování okenních aplikací v jiných prog.jazycích.

Jak píše gna, stačí si na začátku v globálu odlišit to okno nadpisu a zobrazení písmene.

No a ještě ti to gna pěkně zoptimalizoval.

Nahlásit jako SPAM
IP: 91.139.9.–
JTS0
Newbie
30. 7. 2018   #11
-
0
-

#10 MilanL
Dík všem, kód teď vypadá následovně- viz dole - celý kód, abych ho přeložil i pro PC bez pythonu a s Windows XP, musel jsem v tlačítku KONEC přiřadit místo exit, sys.exit, protože exit ani quit neznal zase modul py2exe, který potřeboval python 2.7, který mi běžel ve Virtuálních Windows 2000, přes které jsem to compiloval. 

Dělá mi ještě starost chybové hlášení po doběhnutí programu, nicméně nevím, jak přesně zajistit, aby index nebyl "out of range". Pod tím zasílám ještě celý kód. Čeká mě ještě zjistit, jak přes okno zadat do okno.after místo pevné hodnoty proměnnou - nejlépe měnící se spojitě přes posuvník, a jak umožnost na začátku vybrat písmena do seznamu - nejlépe pomocí zaškrtávátek v okně .... 

Ještě jednou dík za předchozí i ev. následné nápady 

localhost ~]$ python pismena.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 "/usr/lib64/python2.7/lib-tk/Tkinter.py", line 592, in callit
    func(*args)
  File "pismena.py", line 53, in add_pismeno
    pismeno=random.choice(seznam)
  File "/usr/lib64/python2.7/random.py", line 277, in choice
    return seq[int(self.random() * len(seq))]  # raises IndexError if seq is empty
IndexError: tuple index out of range
[sas-labyrint@localhost ~]$ 

celý kód je zde:

# -*- coding: utf-8 -*-
from Tkinter import*
import time
import random
import os

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','ž')

hlavni = Tk()

okno=Tk()

# 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.geometry("150x100+160+160") # měním tím pozici vůči oknu Spusť

w = Label(okno, text=u"Písmena abecedy", fg="red") # zůstalo jen proto, že jinak global w is not defined

w.pack()


def add_pismeno():
   global seznam
   global w
  
   if not seznam:
      okno.quit()
   pismeno=random.choice(seznam)
   vypis=list(seznam) #nutné převést seznam na výpis
   vypis.remove(pismeno) 
   seznam=tuple(vypis) #výpis se převede zpět na seznam
   if w:
      w.pack_forget()
   w = Label(okno, text=pismeno, font=("Helvetica", 20))
   w.pack()
   okno.after(1000,add_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()

Nahlásit jako SPAM
IP: 82.117.139.–
gna
~ Anonymní uživatel
1891 příspěvků
30. 7. 2018   #12
-
0
-

Když chceš měnit text labelu, tak budeš měnit text labelu a ne tam rvát nový.
Když chceš ten seznam mít jako list, tak ho uděláš jako list a nebudeš pořád konvertovat tuple na list a zpátky.
Když je seznam prázdný, tak okno.quit tu funkci nepřeruší, takže pak dostaneš tu chybu, že vybíráš z prázdného seznamu.

Nerozšiřuj to, dokud nepochopíš, co děláš. Hlavně, že tam máš podělanej kopyrajt!

Nahlásit jako SPAM
IP: 213.211.51.–
JTS0
Newbie
31. 7. 2018   #13
-
0
-

#12 gna
Dík, (c)  je jen takovej vtípek. Dík vyzkouším to, z nějaké diskuse jsem možná blbě pochopil, že ze seznamu nemůžu nic odebírat, proto je nutné převádět to na list... zkusím to nepřevádět na seznam ..., dík za připomínku

Nahlásit jako SPAM
IP: 82.117.139.–
JTS0
Newbie
31. 7. 2018   #14
-
0
-

#13 JTS
#12 gna
S tím listem to nefungovalo, ale přidal jsem podmínku a "tuple index out of range" není ...

def add_pismeno():
   global seznam
   global w
   
  
   
   pismeno=random.choice(seznam)
   vypis=list(seznam) #nutné převést seznam na výpis
   vypis.remove(pismeno) 
   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", 20))
   w.pack()
   okno.after(1000,add_pismeno)
   
 
add_pismeno()  

Nahlásit jako SPAM
IP: 82.117.139.–
JTS0
Newbie
9. 8. 2018   #15
-
0
-

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()

Nahlásit jako SPAM
IP: 82.117.139.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

 

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