» »

Return ne deluje[python]

Return ne deluje[python]

Jonatan ::

Hej! Sem nov v programiranuju in trenutno delam meni za svojo igro v pythonu. Vendar pa se mi je zapletlo pri preklapljanju med različnimi zasloni menija; preklop poteče namreč za manj kot sekundo, kar pa je občutno premalo, da bi bil meni kakorkoli uporaben. Return ki sem ga dodal funkcije ni ustavil, zato sem dodal še break, ki pa je preklop le znatno podaljšal, naredil pa ni ničesar uporabnega. Napako sem poskusil pogooglati, vendar brez uspeha. Napaka je verjetno v tej kodi:
def meni():
    global run
    screen.blit(ozadje, (0, 0))
    screen.blit(naslov_menija, (440, 210))
    screen.blit(avtor, (450, 270))
    #Prva števka je številka izbire, druga pa številka jezika.
    izbira10 = (440, 305, 210, 30)
    izbira11 = (440, 300, 280, 30)
    izbira20 = (440, 335, 140, 30)
    izbira21 = (440, 335, 173, 30)
    izbira30 = (440, 365, 70, 30)
    izbira31 = (440, 365, 90, 30)
    mouse = pygame.mouse.get_pos()
    if jezik == 0:
        screen.blit(singleplayer, (440, 300))
        if mouse[0] > izbira10[0] and mouse[0] < izbira10[0] + izbira10[2]:
            if mouse[1] > izbira10[1] and mouse[1] < izbira10[1] + izbira10[3]:
                pygame.draw.rect(screen, rdeca, izbira10, 3)
    elif jezik == 1:
        screen.blit(enoigralski_nacin, (440, 300))
        if mouse[0] > izbira11[0] and mouse[0] < izbira11[0] + izbira11[2]:
            if mouse[1] > izbira11[1] and mouse[1] < izbira11[1] + izbira11[3]:
                pygame.draw.rect(screen, rdeca, izbira11, 3) 
    if jezik == 0:
        screen.blit(settings, (440, 330))
        if mouse[0] > izbira20[0] and mouse[0] < izbira20[0] + izbira20[2]:
            if mouse[1] > izbira20[1] and mouse[1] < izbira20[1] + izbira20[3]:
                 pygame.draw.rect(screen, rdeca, izbira20, 3)
                 for event in pygame.event.get():
                    if event.type == pygame.MOUSEBUTTONDOWN:
                        nastavitve()
                        break
                        return 
    elif jezik == 1:
        screen.blit(nastavitve, (440, 330))
        if mouse[0] > izbira21[0] and mouse[0] < izbira21[0] + izbira21[2]:
            if mouse[1] > izbira21[1] and mouse[1] < izbira21[1] + izbira21[3]:
                pygame.draw.rect(screen, rdeca, izbira21, 3)
                for event in pygame.event.get():
                    if event.type == pygame.MOUSEBUTTONDOWN:
                        nastavitve()
                        break
                        return 
    if jezik == 0:
        screen.blit(izhod1, (440, 360))
        if mouse[0] > izbira30[0] and mouse[0] < izbira30[0] + izbira30[2]:
            if mouse[1] > izbira30[1] and mouse[1] < izbira30[1] + izbira30[3]:
                pygame.draw.rect(screen, rdeca, izbira30, 3)
                for event in pygame.event.get():
                    if event.type == pygame.MOUSEBUTTONDOWN:
                        run = False
    elif jezik == 1:
        screen.blit(izhod2, (440, 360))
        if mouse[0] > izbira31[0] and mouse[0] < izbira31[0] + izbira31[2]:
            if mouse[1] > izbira31[1] and mouse[1] < izbira31[1] + izbira31[3]:
                 pygame.draw.rect(screen, rdeca, izbira31, 3)
                 for event in pygame.event.get(): 
                    if event.type == pygame.MOUSEBUTTONDOWN :
                        run = False
    pygame.display.update()
def nastavitve():
    #Številka pomeni številko jezika
    naslov0 = font1.render('SETTINGS', 1, crna)
    naslov1 = font1.render('NASTAVITVE', 1, crna)
    screen.blit(ozadje , (0, 0))
    if jezik == 0:
        screen.blit(naslov0, (440, 250))
    elif jezik == 1:
        screen.blit(naslov1, (440, 250))
    pygame.display.update()

Ne vem pa kje je napaka, zaradi katere return ne deluje, zato bi vas lepo prosil, če bi mi kdo lahko razložil, kaj sem naredil narobe?

styrian ::

Do returna tvoja koda nikoli ne pride, ker te vrže in zanke takoj ko pokličeš break.

chort ::

Mislim, da moraš pri sebi najprej razčistit kaj točno počneta break in return.
Break ustavi izvajanje for zanke in nadaljuje z izvajanjem kode po njej, zato se ukaz return za ukazom break nikoli ne izvede. https://www.tutorialspoint.com/python/p...
Return ustavi izvajanje funkcije meni() in vrne spremenljivko, ki sledi ukazu return (naprimer "return jezik" vrne vrednost spremenljivke "jezik"). https://www.tutorialspoint.com/python/p...

Kaj točno bi rad naredil na mestu, kjer imaš sedaj break/return?

Zgodovina sprememb…

  • spremenilo: chort ()

Jonatan ::

chort je izjavil:

Mislim, da moraš pri sebi najprej razčistit kaj točno počneta break in return.
Break ustavi izvajanje for zanke in nadaljuje z izvajanjem kode po njej, zato se ukaz return za ukazom break nikoli ne izvede. https://www.tutorialspoint.com/python/p...
Return ustavi izvajanje funkcije meni() in vrne spremenljivko, ki sledi ukazu return (naprimer "return jezik" vrne vrednost spremenljivke "jezik"). https://www.tutorialspoint.com/python/p...

Kaj točno bi rad naredil na mestu, kjer imaš sedaj break/return?

Rad bi, da se mi tam funkcija preneha izvajati, ker mi prestavi na nastavitve() samo za delček sekunde.

styrian ::

Ta koda ne sledi principu DRY. Raje začni znova.

styrian ::

Jaz bi začel tako, da bi naredil funckcijo, ki preveri vsebnost koordinate v kliknjenem pravokotniku.

chort ::

Z uporabniškimi vmesniki v pythonu nimam izkušenj, zato bom morda ustrelil kozla, ampak če želiš da ostanejo nastavitve() aktivne dlje časa potrebno krivca iskati v kodi nastavitve(). V tvoji trenutni izvedbi se namreč nastavitve() zaženejo, izvedejo in nato vrnejo v kodo meni().

styrian ::

Svetujem mu naj ne izumlja tople vode.

Najdi si PyGame knjigo ali tutorial, ki ti je všeč in šele ko boš razumel kaj se dogaja, eksperimentiraj s svojimi spremembami.

Tole je odlična knjiga:
https://nostarch.com/pythoncrashcourse2e

Jonatan ::

Mislil sem da znam dovolj za tak projekt. Očitno ne :)

Čeprav ne vem če je vzrok problema ravno pygame...

Zgodovina sprememb…

  • spremenil: Jonatan ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Linux]mousewheel in slo tipkovnica

Oddelek: Operacijski sistemi
91119 (1035) Quikee
»

radeon 9200 suse10 brightness problem

Oddelek: Operacijski sistemi
251840 (1656) roli
»

linux & mi?kin scrol

Oddelek: Operacijski sistemi
7944 (863) CCfly
»

Problem z Linux Red Hat 9

Oddelek: Operacijski sistemi
171479 (1312) root987
»

Suse 8.2 težave z grafično...

Oddelek: Operacijski sistemi
91698 (1586) norvalk

Več podobnih tem