Program na násobilku v tkinteru – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Program na násobilku v tkinteru – Python – Fórum – Programujte.comProgram na násobilku v tkinteru – Python – Fórum – Programujte.com

 

Hammic0
Duch
3. 2. 2013   #1
-
0
-

Ahoj, chtěl bych se zeptat jak zajistit aby se příklady zobrazovaly po jednom a ne všechny najednou.

# -*- coding: utf-8 -*-
from Tkinter import *
hlavni=Tk()
ramecek1=Frame(hlavni)
ramecek1.pack()    
ramecek2=Frame(hlavni)
ramecek2.pack(side=LEFT)
ramecek3=Frame(hlavni)
ramecek3.pack(side=LEFT)
ramecek4=Frame(hlavni)
ramecek4.pack(side=LEFT)
ramecek4=Frame(hlavni)
ramecek4.pack(side=LEFT)
ramecek5=Frame(hlavni)
ramecek5.pack(side=LEFT)
import random
def priklady(rodic, text):                                #funguje pocet prikladu
    stitek=Label(rodic, text=text).pack(side=LEFT)    
    pocetPrikladu=Entry(rodic)
    pocetPrikladu.delete(0, END)
    pocetPrikladu.pack(side=LEFT)
    return pocetPrikladu
pocty=priklady(ramecek1, text=u"Počet příkladů: ")
vysledkyNasobeni=[]
reseniNasobeni=[]  
vysledkyDeleni=[]
reseniDeleni=[]  
m1 = 10
n1 = 1
m = 10
n = 1
spatne = 0
dobre = 0  
def nasobeni():
    global spatne
    global dobre
    global m
    global n
    x = random.randint(n,m)
    y = random.randint(1,m)
    vysledek = x * y
    x1=str(x)
    y1=str(y)
    zeptat=Label(ramecek2,font="Courier_New 12", text="Kolik je "+ x1+ " x "+ y1 + "?" )
    zeptat.pack()
    cislo2=Entry(ramecek3,font="Courier_New 12")
    cislo2.pack()
    
    def porovnej():
        global spatne
        global dobre
        global m
        global n    
        cislo=int(cislo2.get())
        vysledkyNasobeni.append(cislo)
        reseniNasobeni.append(vysledek)
        if vysledkyNasobeni[-1]==reseniNasobeni[-1]:
            odpoved=Label(ramecek5,font="Courier_New 12", text="spravne" )
            odpoved.pack()                                                        
            dobre = dobre + 1
            m = m + 1
            n = n + 1
        else:
            spatne = spatne + 1
            m = m - 1
            reseniNasobeni1=str(reseniNasobeni[-1])
            odpovedNE=Label(ramecek5,font="Courier_New 12", text="spatne, spravny vysledek je "+ reseniNasobeni1 )
            odpovedNE.pack() 
    Button(ramecek4, text=u"ok", command=porovnej).pack()                       
def deleni():
    global spatne
    global dobre
    global m1
    global n1
    a = random.randint(n1,m1)
    b = random.randint(1,m1)
    y = a * b
    vysl = y / a
    y1=str(y)
    a1=str(a)
    zeptat=Label(ramecek2,font="Courier_New 12", text="Kolik je "+ y1 + " : "+ a1+ "?" )
    zeptat.pack() 
    cislo4=Entry(ramecek3,font="Courier_New 12")
    cislo4.pack()

    def porovnej2():
        global spatne
        global dobre
        global m1
        global n1
        cislo3=int(cislo4.get())
        vysledkyDeleni.append(cislo3)
        reseniDeleni.append(vysl)
        if vysledkyDeleni[-1]==reseniDeleni[-1]:
            odpoved=Label(ramecek5,font="Courier_New 12", text="spravne" )
            odpoved.pack()                
            dobre = dobre + 1
            m1 = m1 + 1
            n1 = n1 + 1
        else:
            spatne = spatne + 1
            m1 = m1 - 1
            reseniDeleni1=str(reseniDeleni[-1])
            odpovedNE=Label(ramecek5,font="Courier_New 12", text="spatne, spravny vysledek je "+ reseniDeleni1 )
            odpovedNE.pack()        
    Button(ramecek4, text=u"ok", command=porovnej2).pack()      

def prubeh():
    pocet=int(pocty.get())
    pocet2= pocet- pocet/2
    for z in range(pocet2):        
        nasobeni()  
    for x in range(pocet/2):
        deleni()              
            
Button(ramecek1, text=u"ok", command=prubeh).pack()

hlavni.mainloop()
Nahlásit jako SPAM
IP: 88.100.77.–
prosteja
~ Anonymní uživatel
21 příspěvků
4. 2. 2013   #2
-
0
-

Ahoj,

 Prečo nepoužívaš komentáre? Každému kto bude od čítat to pomôže. Niektoré časti kódu sa mi zdajú nepochopiteľné.

Tak aspon nech sa vie, čo čím chceš dosiahnut.

Nahlásit jako SPAM
IP: 188.167.34.–
Hammic0
Duch
4. 2. 2013   #3
-
0
-

Tohle už snad je lepší. 

from Tkinter import *
hlavni=Tk()
ramecek1=Frame(hlavni)
ramecek1.pack()    
ramecek2=Frame(hlavni)
ramecek2.pack(side=LEFT)
ramecek3=Frame(hlavni)
ramecek3.pack(side=LEFT)
ramecek4=Frame(hlavni)
ramecek4.pack(side=LEFT)
ramecek4=Frame(hlavni)
ramecek4.pack(side=LEFT)
ramecek5=Frame(hlavni)
ramecek5.pack(side=LEFT)
import random
def priklady(rodic, text):                                # pocet prikladu
    stitek=Label(rodic, text=text).pack(side=LEFT)    
    pocetPrikladu=Entry(rodic)
    pocetPrikladu.delete(0, END)
    pocetPrikladu.pack(side=LEFT)
    return pocetPrikladu
pocty=priklady(ramecek1, text=u"Počet příkladů: ")       #vlozeni poctu prikladu
vysledkyNasobeni=[]
reseniNasobeni=[]  
vysledkyDeleni=[]
reseniDeleni=[]  
m1 = 10
n1 = 1
m = 10
n = 1
spatne = 0
dobre = 0  
def nasobeni():                        #funkce, která definuje zobrazení příkladu, pole Entry a tlačítka, obsahuje funkci porovnej; jenom pro příklady na násobení
    global spatne
    global dobre
    global m
    global n
    x = random.randint(n,m)         #generuje náhodné číslo v zadaném intervalu
    y = random.randint(1,m)         #generuje náhodné číslo v zadaném intervalu
    vysledek = x * y
    x1=str(x)
    y1=str(y)
    zeptat=Label(ramecek2,font="Courier_New 12", text="Kolik je "+ x1+ " x "+ y1 + "?" )    #tisknutí příkladu
    zeptat.pack()
    cislo2=Entry(ramecek3,font="Courier_New 12")                                           #pole pro zadání výsledku
    cislo2.pack()
    
    def porovnej():         #porovnává správný výsledek se zadaným číslem u násobení
        global spatne
        global dobre
        global m                            
        global n    
        cislo=int(cislo2.get())
        vysledkyNasobeni.append(cislo)      #přidání zadaného čísla do seznamu
        reseniNasobeni.append(vysledek)     # přidání skutečného výsledku do seznamu
        if vysledkyNasobeni[-1]==reseniNasobeni[-1]:   #porovnání posledních přidaných čísel do seznamu
            odpoved=Label(ramecek5,font="Courier_New 12", text="spravne" )
            odpoved.pack()                                                        
            dobre = dobre + 1
            m = m + 1                            #zvyšování obtížnosti
            n = n + 1                             #zvyšování obtížnosti
        else:
            spatne = spatne + 1
            m = m - 1                                   #zvyšování obtížnosti
            reseniNasobeni1=str(reseniNasobeni[-1])
            odpovedNE=Label(ramecek5,font="Courier_New 12", text="spatne, spravny vysledek je "+ reseniNasobeni1 )
            odpovedNE.pack() 
    Button(ramecek4, text=u"ok", command=porovnej).pack()         #tlačítko u příkladu, které předává zadané číslo funkci porovnej              
def deleni():             #funkce, která definuje zobrazení příkladu, pole Entry a tlačítka, obsahuje funkci porovnej; jenom pro příklady na dělení
    global spatne
    global dobre
    global m1
    global n1
    a = random.randint(n1,m1)     #generuje náhodné číslo v zadaném intervalu
    b = random.randint(1,m1)      #generuje náhodné číslo v zadaném intervalu
    y = a * b
    vysl = y / a
    y1=str(y)
    a1=str(a)
    zeptat=Label(ramecek2,font="Courier_New 12", text="Kolik je "+ y1 + " : "+ a1+ "?" )  #tisknutí příkladu
    zeptat.pack() 
    cislo4=Entry(ramecek3,font="Courier_New 12")                                  #pole pro zadání výsledku
    cislo4.pack()

    def porovnej2():                        #porovnává správný výsledek se zadaným číslem u dělení
        global spatne
        global dobre
        global m1
        global n1
        cislo3=int(cislo4.get())
        vysledkyDeleni.append(cislo3)     #přidání zadaného čísla do seznamu
        reseniDeleni.append(vysl)         # přidání skutečného výsledku do seznamu
        if vysledkyDeleni[-1]==reseniDeleni[-1]:      #porovnání posledních přidaných čísel do seznamu
            odpoved=Label(ramecek5,font="Courier_New 12", text="spravne" )
            odpoved.pack()                
            dobre = dobre + 1
            m1 = m1 + 1          #zvyšování obtížnosti
            n1 = n1 + 1           #zvyšování obtížnosti
        else:
            spatne = spatne + 1
            m1 = m1 - 1           #zvyšování obtížnosti
            reseniDeleni1=str(reseniDeleni[-1])
            odpovedNE=Label(ramecek5,font="Courier_New 12", text="spatne, spravny vysledek je "+ reseniDeleni1 )
            odpovedNE.pack()        
    Button(ramecek4, text=u"ok", command=porovnej2).pack()      #tlačítko u příkladu, které předává zadané číslo funkci porovnej2

def prubeh():                       #funkce která vyvolá určený počet příkladů, polovinu na násobení, druhou na dělení
    pocet=int(pocty.get())
    pocet2= pocet- pocet/2
    for z in range(pocet2):        
        nasobeni()  
    for x in range(pocet/2):
        deleni()              
            
Button(ramecek1, text=u"ok", command=prubeh).pack()         #tlačítko na zadávání počtu příkladů, vyvolává funkci průběh

hlavni.mainloop()

Snad už je to aspoň trochu přehledný a dá se určit co má co dělat

Nahlásit jako SPAM
IP: 88.100.77.–
prosteja
~ Anonymní uživatel
21 příspěvků
5. 2. 2013   #4
-
0
-

Neviem, či som správne pochopil... ale na čo su tie cykly v prubeh() ?

Tkinter je udalostami riadene programovanie, čiže by to mohlo byt urobene nejak v zmysle:

0) Tvorba kontrolnej premennej pre label, v ktorom sa bude tvorit otázka, ktoru chceš položit uživatelovi

O kontrolných premenných su tutorialy, možeš konkretne použit StringVar()

1) Tvorba labelu, kam sa dá test otázky

2) Tvorba widgetu Entry pre odpoved otázky v labele

3) Nastav hodnotu kontrolnej premennej na otázku, ktorú chceš položit

3b) Vytvor prazdny Label kam das odpoved

4) Tvorba tlačítka Další otázka pre dalšiu otázku, to tlačítko nech je na začiatku bloknuté, state=DISABLED

4b) Vytvorit funkciu, ktorá trebárs bude reagovat na stlačenie Enteru v udelátku - widgete Entry, čiže ked uživatel potvrdi odpoved Enterom čo sa ma stat

5) Ta funkcia by mohla obsahovat:

while True:

  try:

    obsah=int(pole_vstup.get())

    if obsah==cislo_jedna*cislo_dva:

       label_posudenie["text"]="Správne si odpovedal."

    else:

       label_posudenie["text"]="Nesprávne."

    pole_vstup.configure(state=DISABLED)

    tlacitko_dalsi.configure(state=NORMAL)

    break # cyklus iba kvoli pripadu opakovania v pripade chyby :-)

  except ValueError:

   label_posudenie["text"]="Odpovedal si nesprávne" # retazec nemozme premenit na cislo

6) Teraz vytvorit funkciu ktoru dostane tlacitko Dalsi otazka:

tlacitko_dalsi.configure(state=DISABLED)

pole_vstup.configure(state=NORMAL)

kontrolna_premenna_otazky.set(text_dalsej_otazky)    # toto je vlastne pseudokod

# otazku zmenis len znovuvygenerovanim cisel

Ach hej, ešte som zabudol, treba aj StringVar() pre pole pre vstup(Entry),

ked odpovieme na otazku, tak po klinuti na tlacitko_dalsi chceme aby sa obsah Entry vymazal:

premenna_entry.set("")

Ono vlastne v takychto pripadoch ani cykly netreba.

Staci to brat z hladiska, CO PRESNE sa ma stat po kliknutí na to ono tlačítko, program sa o všetko postará sam.

Vždy ked klikneme na tlačítko, proste sa znovu vykona ta funkcia.

Nahlásit jako SPAM
IP: 188.167.34.–
prosteja
~ Anonymní uživatel
21 příspěvků
5. 2. 2013   #5
-
0
-

#4 prosteja
+ ešte by som to radšej robil v OOP, niektorí hovoria že vtedy je krajší kód :-)

a nemusel by si používat žiadne global premenna

ale nevyhodou je písat všade self

Nahlásit jako SPAM
IP: 188.167.34.–
Hammic0
Duch
7. 2. 2013   #6
-
0
-

Díky, zkusím to podle těch tvých rad. Ty cykly jsou tam kvůli tomu aby kazda ta funkce proběhla v daným počtu příkladů

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 88.100.77.–
prosteja
~ Anonymní uživatel
21 příspěvků
8. 2. 2013   #7
-
0
-

Cykly su v programoch s GUI na opakovanie činností asi zbytočné.

Napíš funkciu, ktorá spracuje výsledok príkladu a napríklad k nejak vopred vytvorenej premennej pripocta 1:

premenna+=1

na zaciatok tej funkcie das dajme tomu:

if premenna==10:

  urob to a to

Po každom kliknutí na tlačítko sa prevedie jeho funkcia, všetko teda musí byt jej sučastou.

Nahlásit jako SPAM
IP: 188.167.34.–
Hammic0
Duch
21. 2. 2013   #8
-
0
-

ještě mám jednu otázku proč mi nefunguje zablokování tlačítka další otázka?

def prubeh(udalost):  
    tlacitko_dalsi.configure(state="disabled")    
    udalost.widget["state"]="disabled"
    nahodneCislo=random.randint(1,2)
    if nahodneCislo==1:
        nasobeni()
    else:
        deleni()    
def zacit(udalost):
    tlacitko_dalsi=Button(ramecek2, text=u"nová otázka")
    tlacitko_dalsi.pack(side=LEFT)
    tlacitko_dalsi.bind("<Button-1>", prubeh)
Nahlásit jako SPAM
IP: 88.100.77.–
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, 18 hostů

Podobná vlákna

Zarovnání v Tkinteru — založil maral

Tisk v Tkinteru — založil wickzig

Dotaz k Tkinteru — založil Martin

Textvariable v Tkinteru — založil Marek Kadlčík

 

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