Python-ongelma: TypeError: 'set' object is not subscriptable

Hieno 'kirjasto'-koodini alkaa valmistua, mutta herjaa rivillä 41: TypeError: 'set' object is not subscriptable. Enkä saa sitä poistumaan millään. Osaako joku auttaa?




#_Tämä on Katjaanan sellainen harjoitus, joka myös tallentaa , jos osaan sen tehdä.

tiedosto = open("kirjasto.txt", "a") #_Avataan tiedosto, johon tallennetaan.

#_Poistin alla olevat, sillä olivat kovakoodattuja.
#_List = [{"kirja":"Peppi Pitkätossu", "kirjailija":"Astrid Lindgren", "jv":"1945"},
#_{"kirja":"Vaahteramäen Eemeli", "kirjailija":"Astrid Lindgren", "jv":"1963"},
#_{"kirja":"Pikku naisia", "kirjailija":"Louisa M. Alcott", "jv":"1868"},
#_{"kirja":"Annan nuoruusvuodet", "kirjailija":"L. M. Montgomery", "jv":"1908"}]

#_Alla oleva tallennusrutiini tallentaa yhden kirjan yhdelle riville.
List = [{"kirja1", "kirjailija1", "jv1"
"kirja2", "kirjailija2", "jv2"
"kirja3", "kirjailija3", "jv3"}]

#_Kirjat luetaan tiedostoon talteen alla olevalla tavalla.
def lataaTiedot(tiedosto):
lista = []
with open(tiedosto, 'r') as tiedostoObjekti:
for rivi in tiedostoObjekti:
kirja = rivi.replace("\n","").split(',')
if len(kirja) == 3:
lista.append({"kirja": kirja[0], "kirjailija": kirja[1], "jv": kirja[2]})
return lista

#_Kirjat tulostetaan alla olevalla tavalla.
print(lataaTiedot("kirjasto.txt"))
[{'kirja': 'kirja1', 'kirjailija': 'kirjailija1', 'jv': 'jv1'}, {'kirja': 'kirja2', 'kirjailija':
'kirjailija2', 'jv': 'jv2'}, {'kirja': 'kirja3', 'kirjailija': 'kirjailija3', 'jv': 'jv3'}]

tiedosto.close() #_Suljetaan tiedosto, johon on tallennettu.

#-----ALKAA Funktioiden esittely----------------------------------------

#Näitä kahta funktiota tarvitaan, kun etsitään, onko kirjastossa haluttua kirjaa ja
#kun poistetaan kirjaa.

#Etsitään onko List:ssä kirjaa.
def onkoKirjaa(kirja):
for x in List:
if x["kirja"]==kirja: return True
return False

#Palautetaan kirja.
def getKirja(kirja):
for x in List:
if x["kirja"]==kirja: return x
return None

#-----LOPPUU Funktioiden esittely---------------------------------------

print("Tervetuloa Kirjakauppaan!", "\n", "\n" #Näin saat tekstiin rivinvaihdon lisäksi välirivin.
"Uuden kirjan lisäys Kirjakauppaan:", "\n"
"Jos et nyt halua lisätä kirjaa, niin lisää numero nolla seuraaviin kohtiin, muutoin anna pyydetyt tiedot:")
kirja = input("Kirjan nimi: ")
kirjailija = input("Kirjailijan nimi: ")
jv = input("Julkaisuvuosi: ")

#-----ALKAA Lisätään appendilla uusi kirja------------------------------

#Lisätään uusi tuote List:aan
uusiKirja = {"kirja":kirja, "kirjailija":kirjailija, "jv":jv}

if kirja != "0" and kirjailija != "0" and jv != "0": #Blokkaa pois sen, että nollat tallentuisivat uutena kirjana jne.
List.append(uusiKirja)

#-----LOPPUU Lisätään appendilla uusi kirja-----------------------------

tiedosto = open("kirjasto.txt", "w") #Tiedostokahvalle nimeksi tiedosto ja uuden
#tiedoston avaaminen kirjoittamista varten.

#Pyyntö kirjoittaa yllä pyydetyt tiedot tiedostoon riveittäin.
tiedosto.write(kirja "\n")
tiedosto.write(kirjailija "\n")
tiedosto.write(jv "\n")

tiedosto.close() #Tiedoston sulkeminen.

tiedosto = open("kirjasto.txt", "r") #Tiedoston avaaminen lukemista varten.

while True:

print("Anna valitsemasi kirjan nimi, niin tulostan sen, jos se löytyy kirjastosta.")
print("Komennolla Kaikki tulostetaan kaikki kirjaston kirjat.")
print("Komennolla Poista poistetaan valitsemasi kirjaston kirja.")
print("Komennolla Poistu, tämä kirjasto-ohjelma sulkeutuu.")

valinta = input().capitalize() #Asiakas voi syöttää vastauksensa, joka alkaa pienellä kirjaimella esim. poistu -> Poistu

if valinta == "Poistu": #Ohjelmasta poistuminen.
break

elif valinta == "Kaikki": #Kaikkien kirjaston kirjojen tulostaminen.
for x in List:
print(x["kirja"])
print(x["kirjailija"])
print(x["jv"], "\n") #\n erottelee tulokset toisistaan = tyhjä rivi

elif onkoKirjaa(valinta): #Tulostaa pyydetyn kirjan, jos se on kirjastossa.
print(getKirja(valinta))

#elif valinta == "Poista":
elif onkoKirjaa(valinta): #Etsitään, onko List:ssä kirjaa.
print(getKirja(valinta)) #Palautetaan kirja.
elif valinta == "Poista": #Poistaa pyydetyn kirjan kirjastosta.
poistettava = input ("Minkä kirjan haluat poistaa? ")
for i in range(len(List)):
if List[i]['kirja'] == poistettava:
del List[i]
break

print("Jäljelle jääneet kirjat:\n" ", ".join(x["kirja"] for x in List))

else:

print("Syötteesi oli virheellinen, tai tätä kirjaa ei ole tässä kirjastossa.")

tiedosto.close() #Suljetaan tiedosto.

137

1315

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      Ohjelma ei lue levyltä tallennettua listaa, niinpä sinulla on aina tyhjä lista ja uusikin tallennetaan entisen päälle joten levylläkin lista sisältää vain sen yhden ainoan.

      • Hmmm... ja mielestäni tein sen niin, että tallentaisi ja että ei tallantaisi vanhan päälle... ja jäin miettimään vain näitä viimeisiä herjoja...

        Mitenkä se sitten korjataan niin, että tallentaa aina uutta ja jättää vanhan tallennuksen myös?


      • Anonyymi
        Katjaana kirjoitti:

        Hmmm... ja mielestäni tein sen niin, että tallentaisi ja että ei tallantaisi vanhan päälle... ja jäin miettimään vain näitä viimeisiä herjoja...

        Mitenkä se sitten korjataan niin, että tallentaa aina uutta ja jättää vanhan tallennuksen myös?

        Sinun tulee pitää yhtä listaa jonka tallennat näin:

        def SaveListToFile():
        with open(FileName, 'wb') as f:
        pickle.dump(List, f)


      • Anonyymi
        Katjaana kirjoitti:

        Hmmm... ja mielestäni tein sen niin, että tallentaisi ja että ei tallantaisi vanhan päälle... ja jäin miettimään vain näitä viimeisiä herjoja...

        Mitenkä se sitten korjataan niin, että tallentaa aina uutta ja jättää vanhan tallennuksen myös?

        Käytä (pickle) ja (os) kirjastoja, niin lataus ja tallennus on yksinkertaista. Tämä varmistaa tiedoston olemassa olon, ettei päädyttäisi virheeseen.

        def LoadFileToList():
        if os.path.isfile(FileName):
        List=[]
        with open(FileName, 'rb') as f:
        List = pickle.load(f)
        return List


      • Anonyymi
        Katjaana kirjoitti:

        Hmmm... ja mielestäni tein sen niin, että tallentaisi ja että ei tallantaisi vanhan päälle... ja jäin miettimään vain näitä viimeisiä herjoja...

        Mitenkä se sitten korjataan niin, että tallentaa aina uutta ja jättää vanhan tallennuksen myös?

        Ohjelmasi selkeytyisi merkittävästi menua käytettäessä. Muuten noissa tallennus ja lataus esimerkeissä ei tarvita tiedostojen sulkemiskomentoja, se tapahtuu automaattisesti.


      • Anonyymi
        Katjaana kirjoitti:

        Hmmm... ja mielestäni tein sen niin, että tallentaisi ja että ei tallantaisi vanhan päälle... ja jäin miettimään vain näitä viimeisiä herjoja...

        Mitenkä se sitten korjataan niin, että tallentaa aina uutta ja jättää vanhan tallennuksen myös?

        Ihan varalta, edellisiä tallennus ja lataus funktioita kutsutaan tarvittaessa näin:

        SaveListToFile();
        List = LoadFileToList();


      • Anonyymi
        Katjaana kirjoitti:

        Hmmm... ja mielestäni tein sen niin, että tallentaisi ja että ei tallantaisi vanhan päälle... ja jäin miettimään vain näitä viimeisiä herjoja...

        Mitenkä se sitten korjataan niin, että tallentaa aina uutta ja jättää vanhan tallennuksen myös?

        Ja tämäkin kaipaa tarkennusta:
        "TypeError: 'set' object is not subscriptable."

        Tuo virhe tulee silloin kun viitataan olemattomaan elementtiin. Ja tuo viittaus tehtiin ohjelmassasi useassa kohtaa, ei vain rivillä 41.


      • Anonyymi kirjoitti:

        Sinun tulee pitää yhtä listaa jonka tallennat näin:

        def SaveListToFile():
        with open(FileName, 'wb') as f:
        pickle.dump(List, f)

        Uskomatonta... nyt se herjaa pickle:ä, vaikka kuinka yritän esitellä sitä..., miten tämä voi olla näin vaikea??? Ymmätätisinköhän sen sillä menulla tehtynä paremmin?





        tiedosto = open("kirjasto.txt", "a") #_Avataan tiedosto, johon tallennetaan.

        #_Alla oleva tallennusrutiini tallentaa yhden kirjan yhdelle riville.
        List = [{"kirja1", "kirjailija1", "jv1"
        "kirja2", "kirjailija2", "jv2"
        "kirja3", "kirjailija3", "jv3"}]

        #_"Sinun tulee pitää yhtä listaa jonka tallennat näin":
        def SaveListToFile():
        with open("kirjasto.txt", 'wb') as f:
        pickle.dump(List, f)

        #_"Käytä (pickle) ja (os) kirjastoja, niin lataus ja tallennus on yksinkertaista. Tämä varmistaa tiedoston olemassa olon, ettei päädyttäisi virheeseen."
        def LoadFileToList():
        if os.path.isfile("kirjasto.txt"):
        List=[]
        with open("kirjasto.txt", 'rb') as f:
        List = pickle.load(f)
        return List

        #_"Ihan varalta, edellisiä tallennus ja lataus funktioita kutsutaan tarvittaessa näin":
        SaveListToFile();
        List = LoadFileToList();

        #_Kirjat luetaan tiedostoon talteen alla olevalla tavalla.
        def lataaTiedot(tiedosto):
        lista = []
        with open(tiedosto, 'r') as tiedostoObjekti:
        for rivi in tiedostoObjekti:
        kirja = rivi.replace("\n","").split(',')
        if len(kirja) == 3:
        lista.append({"kirja": kirja[0], "kirjailija": kirja[1], "jv": kirja[2]})
        return lista

        #_Kirjat tulostetaan alla olevalla tavalla.
        print(lataaTiedot("kirjasto.txt"))
        [{'kirja': 'kirja1', 'kirjailija': 'kirjailija1', 'jv': 'jv1'}, {'kirja': 'kirja2', 'kirjailija':
        'kirjailija2', 'jv': 'jv2'}, {'kirja': 'kirja3', 'kirjailija': 'kirjailija3', 'jv': 'jv3'}]

        tiedosto.close() #_Suljetaan tiedosto, johon on tallennettu.

        #-----ALKAA Funktioiden esittely----------------------------------------

        #Näitä kahta funktiota tarvitaan, kun etsitään, onko kirjastossa haluttua kirjaa ja
        #kun poistetaan kirjaa.

        #Etsitään onko List:ssä kirjaa.
        def onkoKirjaa(kirja):
        for x in List:
        if x["kirja"]==kirja: return True
        return False

        #Palautetaan kirja.
        def getKirja(kirja):
        for x in List:
        if x["kirja"]==kirja: return x
        return None

        #-----LOPPUU Funktioiden esittely---------------------------------------

        print("Tervetuloa Kirjakauppaan!", "\n", "\n" #Näin saat tekstiin rivinvaihdon lisäksi välirivin.
        "Uuden kirjan lisäys Kirjakauppaan:", "\n"
        "Jos et nyt halua lisätä kirjaa, niin lisää numero nolla seuraaviin kohtiin, muutoin anna pyydetyt tiedot:")
        kirja = input("Kirjan nimi: ")
        kirjailija = input("Kirjailijan nimi: ")
        jv = input("Julkaisuvuosi: ")

        #-----ALKAA Lisätään appendilla uusi kirja------------------------------

        #Lisätään uusi tuote List:aan
        uusiKirja = {"kirja":kirja, "kirjailija":kirjailija, "jv":jv}

        if kirja != "0" and kirjailija != "0" and jv != "0": #Blokkaa pois sen, että nollat tallentuisivat uutena kirjana jne.
        List.append(uusiKirja)

        #-----LOPPUU Lisätään appendilla uusi kirja-----------------------------

        tiedosto = open("kirjasto.txt", "w") #Tiedostokahvalle nimeksi tiedosto ja uuden
        #tiedoston avaaminen kirjoittamista varten.

        #Pyyntö kirjoittaa yllä pyydetyt tiedot tiedostoon riveittäin.
        tiedosto.write(kirja "\n")
        tiedosto.write(kirjailija "\n")
        tiedosto.write(jv "\n")

        tiedosto.close() #Tiedoston sulkeminen.

        tiedosto = open("kirjasto.txt", "r") #Tiedoston avaaminen lukemista varten.

        while True:

        print("Anna valitsemasi kirjan nimi, niin tulostan sen, jos se löytyy kirjastosta.")
        print("Komennolla Kaikki tulostetaan kaikki kirjaston kirjat.")
        print("Komennolla Poista poistetaan valitsemasi kirjaston kirja.")
        print("Komennolla Poistu, tämä kirjasto-ohjelma sulkeutuu.")

        valinta = input().capitalize() #Asiakas voi syöttää vastauksensa, joka alkaa pienellä kirjaimella esim. poistu -> Poistu

        if valinta == "Poistu": #Ohjelmasta poistuminen.
        break

        elif valinta == "Kaikki": #Kaikkien kirjaston kirjojen tulostaminen.
        for x in List:
        print(x["kirja"])
        print(x["kirjailija"])
        print(x["jv"], "\n") #\n erottelee tulokset toisistaan = tyhjä rivi

        elif onkoKirjaa(valinta): #Tulostaa pyydetyn kirjan, jos se on kirjastossa.
        print(getKirja(valinta))

        #elif valinta == "Poista":
        elif onkoKirjaa(valinta): #Etsitään, onko List:ssä kirjaa.
        print(getKirja(valinta)) #Palautetaan kirja.
        elif valinta == "Poista": #Poistaa pyydetyn kirjan kirjastosta.
        poistettava = input ("Minkä kirjan haluat poistaa? ")
        for i in range(len(List)):
        if List[i]['kirja'] == poistettava:
        del List[i]
        break

        print("Jäljelle jääneet kirjat:\n" ", ".join(x["kirja"] for x in List))

        else:

        print("Syötteesi oli virheellinen, tai tätä kirjaa ei ole tässä kirjastossa.")

        tiedosto.close() #Suljetaan tiedosto.


      • Anonyymi
        Katjaana kirjoitti:

        Uskomatonta... nyt se herjaa pickle:ä, vaikka kuinka yritän esitellä sitä..., miten tämä voi olla näin vaikea??? Ymmätätisinköhän sen sillä menulla tehtynä paremmin?





        tiedosto = open("kirjasto.txt", "a") #_Avataan tiedosto, johon tallennetaan.

        #_Alla oleva tallennusrutiini tallentaa yhden kirjan yhdelle riville.
        List = [{"kirja1", "kirjailija1", "jv1"
        "kirja2", "kirjailija2", "jv2"
        "kirja3", "kirjailija3", "jv3"}]

        #_"Sinun tulee pitää yhtä listaa jonka tallennat näin":
        def SaveListToFile():
        with open("kirjasto.txt", 'wb') as f:
        pickle.dump(List, f)

        #_"Käytä (pickle) ja (os) kirjastoja, niin lataus ja tallennus on yksinkertaista. Tämä varmistaa tiedoston olemassa olon, ettei päädyttäisi virheeseen."
        def LoadFileToList():
        if os.path.isfile("kirjasto.txt"):
        List=[]
        with open("kirjasto.txt", 'rb') as f:
        List = pickle.load(f)
        return List

        #_"Ihan varalta, edellisiä tallennus ja lataus funktioita kutsutaan tarvittaessa näin":
        SaveListToFile();
        List = LoadFileToList();

        #_Kirjat luetaan tiedostoon talteen alla olevalla tavalla.
        def lataaTiedot(tiedosto):
        lista = []
        with open(tiedosto, 'r') as tiedostoObjekti:
        for rivi in tiedostoObjekti:
        kirja = rivi.replace("\n","").split(',')
        if len(kirja) == 3:
        lista.append({"kirja": kirja[0], "kirjailija": kirja[1], "jv": kirja[2]})
        return lista

        #_Kirjat tulostetaan alla olevalla tavalla.
        print(lataaTiedot("kirjasto.txt"))
        [{'kirja': 'kirja1', 'kirjailija': 'kirjailija1', 'jv': 'jv1'}, {'kirja': 'kirja2', 'kirjailija':
        'kirjailija2', 'jv': 'jv2'}, {'kirja': 'kirja3', 'kirjailija': 'kirjailija3', 'jv': 'jv3'}]

        tiedosto.close() #_Suljetaan tiedosto, johon on tallennettu.

        #-----ALKAA Funktioiden esittely----------------------------------------

        #Näitä kahta funktiota tarvitaan, kun etsitään, onko kirjastossa haluttua kirjaa ja
        #kun poistetaan kirjaa.

        #Etsitään onko List:ssä kirjaa.
        def onkoKirjaa(kirja):
        for x in List:
        if x["kirja"]==kirja: return True
        return False

        #Palautetaan kirja.
        def getKirja(kirja):
        for x in List:
        if x["kirja"]==kirja: return x
        return None

        #-----LOPPUU Funktioiden esittely---------------------------------------

        print("Tervetuloa Kirjakauppaan!", "\n", "\n" #Näin saat tekstiin rivinvaihdon lisäksi välirivin.
        "Uuden kirjan lisäys Kirjakauppaan:", "\n"
        "Jos et nyt halua lisätä kirjaa, niin lisää numero nolla seuraaviin kohtiin, muutoin anna pyydetyt tiedot:")
        kirja = input("Kirjan nimi: ")
        kirjailija = input("Kirjailijan nimi: ")
        jv = input("Julkaisuvuosi: ")

        #-----ALKAA Lisätään appendilla uusi kirja------------------------------

        #Lisätään uusi tuote List:aan
        uusiKirja = {"kirja":kirja, "kirjailija":kirjailija, "jv":jv}

        if kirja != "0" and kirjailija != "0" and jv != "0": #Blokkaa pois sen, että nollat tallentuisivat uutena kirjana jne.
        List.append(uusiKirja)

        #-----LOPPUU Lisätään appendilla uusi kirja-----------------------------

        tiedosto = open("kirjasto.txt", "w") #Tiedostokahvalle nimeksi tiedosto ja uuden
        #tiedoston avaaminen kirjoittamista varten.

        #Pyyntö kirjoittaa yllä pyydetyt tiedot tiedostoon riveittäin.
        tiedosto.write(kirja "\n")
        tiedosto.write(kirjailija "\n")
        tiedosto.write(jv "\n")

        tiedosto.close() #Tiedoston sulkeminen.

        tiedosto = open("kirjasto.txt", "r") #Tiedoston avaaminen lukemista varten.

        while True:

        print("Anna valitsemasi kirjan nimi, niin tulostan sen, jos se löytyy kirjastosta.")
        print("Komennolla Kaikki tulostetaan kaikki kirjaston kirjat.")
        print("Komennolla Poista poistetaan valitsemasi kirjaston kirja.")
        print("Komennolla Poistu, tämä kirjasto-ohjelma sulkeutuu.")

        valinta = input().capitalize() #Asiakas voi syöttää vastauksensa, joka alkaa pienellä kirjaimella esim. poistu -> Poistu

        if valinta == "Poistu": #Ohjelmasta poistuminen.
        break

        elif valinta == "Kaikki": #Kaikkien kirjaston kirjojen tulostaminen.
        for x in List:
        print(x["kirja"])
        print(x["kirjailija"])
        print(x["jv"], "\n") #\n erottelee tulokset toisistaan = tyhjä rivi

        elif onkoKirjaa(valinta): #Tulostaa pyydetyn kirjan, jos se on kirjastossa.
        print(getKirja(valinta))

        #elif valinta == "Poista":
        elif onkoKirjaa(valinta): #Etsitään, onko List:ssä kirjaa.
        print(getKirja(valinta)) #Palautetaan kirja.
        elif valinta == "Poista": #Poistaa pyydetyn kirjan kirjastosta.
        poistettava = input ("Minkä kirjan haluat poistaa? ")
        for i in range(len(List)):
        if List[i]['kirja'] == poistettava:
        del List[i]
        break

        print("Jäljelle jääneet kirjat:\n" ", ".join(x["kirja"] for x in List))

        else:

        print("Syötteesi oli virheellinen, tai tätä kirjaa ei ole tässä kirjastossa.")

        tiedosto.close() #Suljetaan tiedosto.

        Se Pickle pitää varmaan ensin asentaa koneellesi? Enpähän tuota itse ole koskaan tarvinnut mihinkään. Vika näillä palstoilla on että yksi neuvoo yhtä ja toinen kolmatta.


      • Anonyymi
        Katjaana kirjoitti:

        Uskomatonta... nyt se herjaa pickle:ä, vaikka kuinka yritän esitellä sitä..., miten tämä voi olla näin vaikea??? Ymmätätisinköhän sen sillä menulla tehtynä paremmin?





        tiedosto = open("kirjasto.txt", "a") #_Avataan tiedosto, johon tallennetaan.

        #_Alla oleva tallennusrutiini tallentaa yhden kirjan yhdelle riville.
        List = [{"kirja1", "kirjailija1", "jv1"
        "kirja2", "kirjailija2", "jv2"
        "kirja3", "kirjailija3", "jv3"}]

        #_"Sinun tulee pitää yhtä listaa jonka tallennat näin":
        def SaveListToFile():
        with open("kirjasto.txt", 'wb') as f:
        pickle.dump(List, f)

        #_"Käytä (pickle) ja (os) kirjastoja, niin lataus ja tallennus on yksinkertaista. Tämä varmistaa tiedoston olemassa olon, ettei päädyttäisi virheeseen."
        def LoadFileToList():
        if os.path.isfile("kirjasto.txt"):
        List=[]
        with open("kirjasto.txt", 'rb') as f:
        List = pickle.load(f)
        return List

        #_"Ihan varalta, edellisiä tallennus ja lataus funktioita kutsutaan tarvittaessa näin":
        SaveListToFile();
        List = LoadFileToList();

        #_Kirjat luetaan tiedostoon talteen alla olevalla tavalla.
        def lataaTiedot(tiedosto):
        lista = []
        with open(tiedosto, 'r') as tiedostoObjekti:
        for rivi in tiedostoObjekti:
        kirja = rivi.replace("\n","").split(',')
        if len(kirja) == 3:
        lista.append({"kirja": kirja[0], "kirjailija": kirja[1], "jv": kirja[2]})
        return lista

        #_Kirjat tulostetaan alla olevalla tavalla.
        print(lataaTiedot("kirjasto.txt"))
        [{'kirja': 'kirja1', 'kirjailija': 'kirjailija1', 'jv': 'jv1'}, {'kirja': 'kirja2', 'kirjailija':
        'kirjailija2', 'jv': 'jv2'}, {'kirja': 'kirja3', 'kirjailija': 'kirjailija3', 'jv': 'jv3'}]

        tiedosto.close() #_Suljetaan tiedosto, johon on tallennettu.

        #-----ALKAA Funktioiden esittely----------------------------------------

        #Näitä kahta funktiota tarvitaan, kun etsitään, onko kirjastossa haluttua kirjaa ja
        #kun poistetaan kirjaa.

        #Etsitään onko List:ssä kirjaa.
        def onkoKirjaa(kirja):
        for x in List:
        if x["kirja"]==kirja: return True
        return False

        #Palautetaan kirja.
        def getKirja(kirja):
        for x in List:
        if x["kirja"]==kirja: return x
        return None

        #-----LOPPUU Funktioiden esittely---------------------------------------

        print("Tervetuloa Kirjakauppaan!", "\n", "\n" #Näin saat tekstiin rivinvaihdon lisäksi välirivin.
        "Uuden kirjan lisäys Kirjakauppaan:", "\n"
        "Jos et nyt halua lisätä kirjaa, niin lisää numero nolla seuraaviin kohtiin, muutoin anna pyydetyt tiedot:")
        kirja = input("Kirjan nimi: ")
        kirjailija = input("Kirjailijan nimi: ")
        jv = input("Julkaisuvuosi: ")

        #-----ALKAA Lisätään appendilla uusi kirja------------------------------

        #Lisätään uusi tuote List:aan
        uusiKirja = {"kirja":kirja, "kirjailija":kirjailija, "jv":jv}

        if kirja != "0" and kirjailija != "0" and jv != "0": #Blokkaa pois sen, että nollat tallentuisivat uutena kirjana jne.
        List.append(uusiKirja)

        #-----LOPPUU Lisätään appendilla uusi kirja-----------------------------

        tiedosto = open("kirjasto.txt", "w") #Tiedostokahvalle nimeksi tiedosto ja uuden
        #tiedoston avaaminen kirjoittamista varten.

        #Pyyntö kirjoittaa yllä pyydetyt tiedot tiedostoon riveittäin.
        tiedosto.write(kirja "\n")
        tiedosto.write(kirjailija "\n")
        tiedosto.write(jv "\n")

        tiedosto.close() #Tiedoston sulkeminen.

        tiedosto = open("kirjasto.txt", "r") #Tiedoston avaaminen lukemista varten.

        while True:

        print("Anna valitsemasi kirjan nimi, niin tulostan sen, jos se löytyy kirjastosta.")
        print("Komennolla Kaikki tulostetaan kaikki kirjaston kirjat.")
        print("Komennolla Poista poistetaan valitsemasi kirjaston kirja.")
        print("Komennolla Poistu, tämä kirjasto-ohjelma sulkeutuu.")

        valinta = input().capitalize() #Asiakas voi syöttää vastauksensa, joka alkaa pienellä kirjaimella esim. poistu -> Poistu

        if valinta == "Poistu": #Ohjelmasta poistuminen.
        break

        elif valinta == "Kaikki": #Kaikkien kirjaston kirjojen tulostaminen.
        for x in List:
        print(x["kirja"])
        print(x["kirjailija"])
        print(x["jv"], "\n") #\n erottelee tulokset toisistaan = tyhjä rivi

        elif onkoKirjaa(valinta): #Tulostaa pyydetyn kirjan, jos se on kirjastossa.
        print(getKirja(valinta))

        #elif valinta == "Poista":
        elif onkoKirjaa(valinta): #Etsitään, onko List:ssä kirjaa.
        print(getKirja(valinta)) #Palautetaan kirja.
        elif valinta == "Poista": #Poistaa pyydetyn kirjan kirjastosta.
        poistettava = input ("Minkä kirjan haluat poistaa? ")
        for i in range(len(List)):
        if List[i]['kirja'] == poistettava:
        del List[i]
        break

        print("Jäljelle jääneet kirjat:\n" ", ".join(x["kirja"] for x in List))

        else:

        print("Syötteesi oli virheellinen, tai tätä kirjaa ei ole tässä kirjastossa.")

        tiedosto.close() #Suljetaan tiedosto.

        Python ohjelmasi 4 ensimmäistä riviä. Tarkista että rivit eivät puutu. Antamassasi listauksessa niitä ei ollut mukana.

        #!/usr/bin/env python3
        # -*- coding: utf-8 -*-
        import pickle
        import os


      • Anonyymi
        Katjaana kirjoitti:

        Uskomatonta... nyt se herjaa pickle:ä, vaikka kuinka yritän esitellä sitä..., miten tämä voi olla näin vaikea??? Ymmätätisinköhän sen sillä menulla tehtynä paremmin?





        tiedosto = open("kirjasto.txt", "a") #_Avataan tiedosto, johon tallennetaan.

        #_Alla oleva tallennusrutiini tallentaa yhden kirjan yhdelle riville.
        List = [{"kirja1", "kirjailija1", "jv1"
        "kirja2", "kirjailija2", "jv2"
        "kirja3", "kirjailija3", "jv3"}]

        #_"Sinun tulee pitää yhtä listaa jonka tallennat näin":
        def SaveListToFile():
        with open("kirjasto.txt", 'wb') as f:
        pickle.dump(List, f)

        #_"Käytä (pickle) ja (os) kirjastoja, niin lataus ja tallennus on yksinkertaista. Tämä varmistaa tiedoston olemassa olon, ettei päädyttäisi virheeseen."
        def LoadFileToList():
        if os.path.isfile("kirjasto.txt"):
        List=[]
        with open("kirjasto.txt", 'rb') as f:
        List = pickle.load(f)
        return List

        #_"Ihan varalta, edellisiä tallennus ja lataus funktioita kutsutaan tarvittaessa näin":
        SaveListToFile();
        List = LoadFileToList();

        #_Kirjat luetaan tiedostoon talteen alla olevalla tavalla.
        def lataaTiedot(tiedosto):
        lista = []
        with open(tiedosto, 'r') as tiedostoObjekti:
        for rivi in tiedostoObjekti:
        kirja = rivi.replace("\n","").split(',')
        if len(kirja) == 3:
        lista.append({"kirja": kirja[0], "kirjailija": kirja[1], "jv": kirja[2]})
        return lista

        #_Kirjat tulostetaan alla olevalla tavalla.
        print(lataaTiedot("kirjasto.txt"))
        [{'kirja': 'kirja1', 'kirjailija': 'kirjailija1', 'jv': 'jv1'}, {'kirja': 'kirja2', 'kirjailija':
        'kirjailija2', 'jv': 'jv2'}, {'kirja': 'kirja3', 'kirjailija': 'kirjailija3', 'jv': 'jv3'}]

        tiedosto.close() #_Suljetaan tiedosto, johon on tallennettu.

        #-----ALKAA Funktioiden esittely----------------------------------------

        #Näitä kahta funktiota tarvitaan, kun etsitään, onko kirjastossa haluttua kirjaa ja
        #kun poistetaan kirjaa.

        #Etsitään onko List:ssä kirjaa.
        def onkoKirjaa(kirja):
        for x in List:
        if x["kirja"]==kirja: return True
        return False

        #Palautetaan kirja.
        def getKirja(kirja):
        for x in List:
        if x["kirja"]==kirja: return x
        return None

        #-----LOPPUU Funktioiden esittely---------------------------------------

        print("Tervetuloa Kirjakauppaan!", "\n", "\n" #Näin saat tekstiin rivinvaihdon lisäksi välirivin.
        "Uuden kirjan lisäys Kirjakauppaan:", "\n"
        "Jos et nyt halua lisätä kirjaa, niin lisää numero nolla seuraaviin kohtiin, muutoin anna pyydetyt tiedot:")
        kirja = input("Kirjan nimi: ")
        kirjailija = input("Kirjailijan nimi: ")
        jv = input("Julkaisuvuosi: ")

        #-----ALKAA Lisätään appendilla uusi kirja------------------------------

        #Lisätään uusi tuote List:aan
        uusiKirja = {"kirja":kirja, "kirjailija":kirjailija, "jv":jv}

        if kirja != "0" and kirjailija != "0" and jv != "0": #Blokkaa pois sen, että nollat tallentuisivat uutena kirjana jne.
        List.append(uusiKirja)

        #-----LOPPUU Lisätään appendilla uusi kirja-----------------------------

        tiedosto = open("kirjasto.txt", "w") #Tiedostokahvalle nimeksi tiedosto ja uuden
        #tiedoston avaaminen kirjoittamista varten.

        #Pyyntö kirjoittaa yllä pyydetyt tiedot tiedostoon riveittäin.
        tiedosto.write(kirja "\n")
        tiedosto.write(kirjailija "\n")
        tiedosto.write(jv "\n")

        tiedosto.close() #Tiedoston sulkeminen.

        tiedosto = open("kirjasto.txt", "r") #Tiedoston avaaminen lukemista varten.

        while True:

        print("Anna valitsemasi kirjan nimi, niin tulostan sen, jos se löytyy kirjastosta.")
        print("Komennolla Kaikki tulostetaan kaikki kirjaston kirjat.")
        print("Komennolla Poista poistetaan valitsemasi kirjaston kirja.")
        print("Komennolla Poistu, tämä kirjasto-ohjelma sulkeutuu.")

        valinta = input().capitalize() #Asiakas voi syöttää vastauksensa, joka alkaa pienellä kirjaimella esim. poistu -> Poistu

        if valinta == "Poistu": #Ohjelmasta poistuminen.
        break

        elif valinta == "Kaikki": #Kaikkien kirjaston kirjojen tulostaminen.
        for x in List:
        print(x["kirja"])
        print(x["kirjailija"])
        print(x["jv"], "\n") #\n erottelee tulokset toisistaan = tyhjä rivi

        elif onkoKirjaa(valinta): #Tulostaa pyydetyn kirjan, jos se on kirjastossa.
        print(getKirja(valinta))

        #elif valinta == "Poista":
        elif onkoKirjaa(valinta): #Etsitään, onko List:ssä kirjaa.
        print(getKirja(valinta)) #Palautetaan kirja.
        elif valinta == "Poista": #Poistaa pyydetyn kirjan kirjastosta.
        poistettava = input ("Minkä kirjan haluat poistaa? ")
        for i in range(len(List)):
        if List[i]['kirja'] == poistettava:
        del List[i]
        break

        print("Jäljelle jääneet kirjat:\n" ", ".join(x["kirja"] for x in List))

        else:

        print("Syötteesi oli virheellinen, tai tätä kirjaa ei ole tässä kirjastossa.")

        tiedosto.close() #Suljetaan tiedosto.

        ALOITETAANPAS ALUSTA
        Pistetäänpäs tuo sinun ohjelmasi vähäksi aikaa syrjään, ja puretaan sitä pieninä palasina. Näin sinun on helpompi löytää ne kohdat jotka eivät toimi.

        Tuossa kuvassa, alustetaan se sinun käyttämäsi kirja lista, ja tallennetaan kiintolevylle. Kun olet tuon kirjoittanut, ja ajanut onnistuneesti, tulisi sinun kiintolevyltä löytyä (Kirjasto.txt) tiedosto, binaari formaatissa.

        https://s2.gifyu.com/images/SaveList.png

        Jatketaan eteenpäin, kun tämä esimerkki toimii. Näin meidän on helppo löytää kohdat jotka ohjelmassasi eivät toimi.


      • Anonyymi kirjoitti:

        ALOITETAANPAS ALUSTA
        Pistetäänpäs tuo sinun ohjelmasi vähäksi aikaa syrjään, ja puretaan sitä pieninä palasina. Näin sinun on helpompi löytää ne kohdat jotka eivät toimi.

        Tuossa kuvassa, alustetaan se sinun käyttämäsi kirja lista, ja tallennetaan kiintolevylle. Kun olet tuon kirjoittanut, ja ajanut onnistuneesti, tulisi sinun kiintolevyltä löytyä (Kirjasto.txt) tiedosto, binaari formaatissa.

        https://s2.gifyu.com/images/SaveList.png

        Jatketaan eteenpäin, kun tämä esimerkki toimii. Näin meidän on helppo löytää kohdat jotka ohjelmassasi eivät toimi.

        Selkeä aloitus, mutta jostain syystä se ei tee sitä Kirjasto.txt-tiedostoa, ei toisin anna herjojakaan...



        #!/usr/bin/env python3
        # -*- coding: utf-8 -*-

        #SaveList.py

        #Alustetaan kirja-lista, ja tallennetaan kiintolevylle. Kiintolevyltä löytyy tämän jälkeen (Kirjasto.txt) tiedosto, binaari formaatissa.
        import pickle

        List = [
        {"kirja":"Peppi Pitkätossu", "kirjailija":"Astrid Lindgren", "jv":"1945"},
        {"kirja":"Vaahteramäen Eemeli", "kirjailija":"Astrid Lindgren", "jv":"1963"},
        {"kirja":"Pikku naisia", "kirjailija":"Louisa M. Alcott", "jv":"1868"},
        {"kirja":"Annan nuoruusvuodet", "kirjailija":"L. M. Montgomery", "jv":"1908"}
        ]

        FileName='Kirjasto.txt'

        def SaveListToFile():
        with open(FileName, 'wb') as f:
        pickle.dump(List, f)

        SaveListToFile();


      • Anonyymi
        Katjaana kirjoitti:

        Selkeä aloitus, mutta jostain syystä se ei tee sitä Kirjasto.txt-tiedostoa, ei toisin anna herjojakaan...



        #!/usr/bin/env python3
        # -*- coding: utf-8 -*-

        #SaveList.py

        #Alustetaan kirja-lista, ja tallennetaan kiintolevylle. Kiintolevyltä löytyy tämän jälkeen (Kirjasto.txt) tiedosto, binaari formaatissa.
        import pickle

        List = [
        {"kirja":"Peppi Pitkätossu", "kirjailija":"Astrid Lindgren", "jv":"1945"},
        {"kirja":"Vaahteramäen Eemeli", "kirjailija":"Astrid Lindgren", "jv":"1963"},
        {"kirja":"Pikku naisia", "kirjailija":"Louisa M. Alcott", "jv":"1868"},
        {"kirja":"Annan nuoruusvuodet", "kirjailija":"L. M. Montgomery", "jv":"1908"}
        ]

        FileName='Kirjasto.txt'

        def SaveListToFile():
        with open(FileName, 'wb') as f:
        pickle.dump(List, f)

        SaveListToFile();

        Outo juttu, nyt kiinnostaakin se kuinka sinä suoritat näitä python skriptejä, kuinka kirjoitat. Esimerkin olisi pitänyt luoda se tiedosto ohjelman kanssa samaan kansioon. Kuinka totesit ettei tiedostoa ole.


      • Anonyymi kirjoitti:

        Outo juttu, nyt kiinnostaakin se kuinka sinä suoritat näitä python skriptejä, kuinka kirjoitat. Esimerkin olisi pitänyt luoda se tiedosto ohjelman kanssa samaan kansioon. Kuinka totesit ettei tiedostoa ole.

        Todella outoa... sieltä sitä etsin, sillä sinne se todella on tullut aikaisemminkin. Se ilmestyi sinne tällä kertaa MELKOISELLA viiveellä... Syytä en osaa arvata, mutta tyytyväisenä totean sen nyt olevan oikeassa paikkaa. Tiedoston tekstissä vielä hieman sanomista (alla kopio tekstistä), mutta muuten koodi toimii siis tähän asti! Näin aloittelijana sitä vain luulee, että on tehnyt virheen, kun koodi ei heti ota toimiakseen...

        €•ç ]”(}”(Œkirja”ŒPeppi Pitkätossu”Œ
        kirjailija”ŒAstrid Lindgren”Œjv”Œ1945”u}”(hŒVaahteramäen Eemeli”hhhŒ1963”u}”(hŒ Pikku naisia”hŒLouisa M. Alcott”hŒ1868”u}”(hŒAnnan nuoruusvuodet”hŒL. M. Montgomery”hŒ1908”ue.


      • Anonyymi
        Katjaana kirjoitti:

        Todella outoa... sieltä sitä etsin, sillä sinne se todella on tullut aikaisemminkin. Se ilmestyi sinne tällä kertaa MELKOISELLA viiveellä... Syytä en osaa arvata, mutta tyytyväisenä totean sen nyt olevan oikeassa paikkaa. Tiedoston tekstissä vielä hieman sanomista (alla kopio tekstistä), mutta muuten koodi toimii siis tähän asti! Näin aloittelijana sitä vain luulee, että on tehnyt virheen, kun koodi ei heti ota toimiakseen...

        €•ç ]”(}”(Œkirja”ŒPeppi Pitkätossu”Œ
        kirjailija”ŒAstrid Lindgren”Œjv”Œ1945”u}”(hŒVaahteramäen Eemeli”hhhŒ1963”u}”(hŒ Pikku naisia”hŒLouisa M. Alcott”hŒ1868”u}”(hŒAnnan nuoruusvuodet”hŒL. M. Montgomery”hŒ1908”ue.

        Ei käynyt selville, millä kirjoittelet, mutta tallennus tulisi tapahtua sillä samalla merkistökoodauksella mikä koodissakin asetetaan.

        # -*- coding: utf-8 -*-

        NO HYVÄ ETTÄ LÖYTY
        Mutta kuten sanoin, tiedoston formaatti on binaari, eli et voi avata sitä lukukelpoisena jollakin tekstieditorilla. Ei ole tarkoitus että tiedostoa muokataan käsin, vaan se on ohjelman käytössä, johon ohjelma kirjoittaa lisäykset ja poistot, ja sisällön näyttö tapahtuu myös ohjelmasi avulla.

        Miksi näin, koska sisältö noudattelee List[] taulukon avaimet ja arvot, jotka voi käsin muokaten sotkea helposti, riittää kun osaat tarkistaa tuliko tiedosto, onko sen aika leima uusi, ja mikä sen koko on. Älä muokkaa sitä käsin.


      • Anonyymi
        Anonyymi kirjoitti:

        Ei käynyt selville, millä kirjoittelet, mutta tallennus tulisi tapahtua sillä samalla merkistökoodauksella mikä koodissakin asetetaan.

        # -*- coding: utf-8 -*-

        NO HYVÄ ETTÄ LÖYTY
        Mutta kuten sanoin, tiedoston formaatti on binaari, eli et voi avata sitä lukukelpoisena jollakin tekstieditorilla. Ei ole tarkoitus että tiedostoa muokataan käsin, vaan se on ohjelman käytössä, johon ohjelma kirjoittaa lisäykset ja poistot, ja sisällön näyttö tapahtuu myös ohjelmasi avulla.

        Miksi näin, koska sisältö noudattelee List[] taulukon avaimet ja arvot, jotka voi käsin muokaten sotkea helposti, riittää kun osaat tarkistaa tuliko tiedosto, onko sen aika leima uusi, ja mikä sen koko on. Älä muokkaa sitä käsin.

        Miksi se ei voi olla normaali tekstitiedosto?


      • Anonyymi
        Anonyymi kirjoitti:

        Miksi se ei voi olla normaali tekstitiedosto?

        1.) dump() menetelmä tallentaa luettelon tehokkaammin binäärisenä datavirtana.
        2.) datatiedostoja ei yleensäkkään muokkailla käsin, erittäin helposti sotketaan koko kanta.
        3.) Koodi ei olisi yhtä helppo ja yksinkertainen.


      • Anonyymi
        Anonyymi kirjoitti:

        1.) dump() menetelmä tallentaa luettelon tehokkaammin binäärisenä datavirtana.
        2.) datatiedostoja ei yleensäkkään muokkailla käsin, erittäin helposti sotketaan koko kanta.
        3.) Koodi ei olisi yhtä helppo ja yksinkertainen.

        4.) Saattaa olla hankalampi lukea toisten salaisia asiakirjoja.


      • Anonyymi
        Anonyymi kirjoitti:

        1.) dump() menetelmä tallentaa luettelon tehokkaammin binäärisenä datavirtana.
        2.) datatiedostoja ei yleensäkkään muokkailla käsin, erittäin helposti sotketaan koko kanta.
        3.) Koodi ei olisi yhtä helppo ja yksinkertainen.

        Ihan turhaa. Aloittelijan ei kannata mitään Pickleä käyttää opettelussa. Sotkee vaan oppimista.


      • Anonyymi kirjoitti:

        Ei käynyt selville, millä kirjoittelet, mutta tallennus tulisi tapahtua sillä samalla merkistökoodauksella mikä koodissakin asetetaan.

        # -*- coding: utf-8 -*-

        NO HYVÄ ETTÄ LÖYTY
        Mutta kuten sanoin, tiedoston formaatti on binaari, eli et voi avata sitä lukukelpoisena jollakin tekstieditorilla. Ei ole tarkoitus että tiedostoa muokataan käsin, vaan se on ohjelman käytössä, johon ohjelma kirjoittaa lisäykset ja poistot, ja sisällön näyttö tapahtuu myös ohjelmasi avulla.

        Miksi näin, koska sisältö noudattelee List[] taulukon avaimet ja arvot, jotka voi käsin muokaten sotkea helposti, riittää kun osaat tarkistaa tuliko tiedosto, onko sen aika leima uusi, ja mikä sen koko on. Älä muokkaa sitä käsin.

        Ok! Ja siis teen koodia Visual Studio Codessa.


      • Anonyymi
        Katjaana kirjoitti:

        Ok! Ja siis teen koodia Visual Studio Codessa.

        Ja silloinhan on syytä olettaa sinun toimivan Windowsin alaisuudessa, ja näin ollen saattaa jossakin kohtaa syntyä tilanne että antamani esimerkki ei toimikaan sinulla, ja silloin sinun on itseesi osattava korjata kohdat Windows ympäristöä vastaaviksi.

        Tein muuten MainMenu.py esimerkin valmiiksi, kun tullaan siihen kohtaan että asia alkaa olla sitä myöten valmista julkaisen kuvan esimerkistä.


      • Anonyymi kirjoitti:

        Ja silloinhan on syytä olettaa sinun toimivan Windowsin alaisuudessa, ja näin ollen saattaa jossakin kohtaa syntyä tilanne että antamani esimerkki ei toimikaan sinulla, ja silloin sinun on itseesi osattava korjata kohdat Windows ympäristöä vastaaviksi.

        Tein muuten MainMenu.py esimerkin valmiiksi, kun tullaan siihen kohtaan että asia alkaa olla sitä myöten valmista julkaisen kuvan esimerkistä.

        No voi ei... kyllä Windowsin..., nähtäväksi jää sitten, osaanko korjata...


    • Anonyymi

      Seuraavaksi otetaan ja luetaan se luettelo tiedostosta ja tulostetaan ruudulle.

      https://s8.gifyu.com/images/LoadList.png

      Tuskin näiden kanssa tulee onglmia. Joko olet miettinyt, kaytätkö jonkinlaista valikkoa ohjelmassasi. Siihen jo tämän jälkeen voitaisiin lisätä "Lataus", "Tallennus" ja "Tulostus ruudulle"

      • Tuo yllä oleva on nyt tehty, mutta en pääse vielä testaamaan sen toimivuutta, sillä se ei nyt jostain syystä huoli aiemmin tehdyn koodin (koodia alla) jälkimmäisen SaveListToFilen perään kaksoispistettä, eikä puolipistettä, vaan herjaa invalid syntax:a.



        FileName='Kirjasto.txt'

        def SaveListToFile():
        with open(FileName, 'wb') as f:
        pickle.dump(List, f)

        SaveListToFile():

        #Seuraavaksi otetaan ja luetaan luettelo tiedostosta ja tulostetaan se ruudulle.
        def LoadFileToList():
        if os.path.isfile(FileName):


      • Anonyymi
        Katjaana kirjoitti:

        Tuo yllä oleva on nyt tehty, mutta en pääse vielä testaamaan sen toimivuutta, sillä se ei nyt jostain syystä huoli aiemmin tehdyn koodin (koodia alla) jälkimmäisen SaveListToFilen perään kaksoispistettä, eikä puolipistettä, vaan herjaa invalid syntax:a.



        FileName='Kirjasto.txt'

        def SaveListToFile():
        with open(FileName, 'wb') as f:
        pickle.dump(List, f)

        SaveListToFile():

        #Seuraavaksi otetaan ja luetaan luettelo tiedostosta ja tulostetaan se ruudulle.
        def LoadFileToList():
        if os.path.isfile(FileName):

        No onpahan jäänyt turha kaksoispiste siihen funktion perään (rivi 28). Puolipisteenä se olisi saattanut läpi mennäkin. Ota pois, ei kuulu asiaan.

        Asiat rupesi etenemään pika vauhtia, siispä koko ohjelman kasassa pitävä osa:

        https://s2.gifyu.com/images/MainMenu.png

        Päävalikkoa voidaan pitää mallina kun luodaan tehtävä kohtaisia valikoita, esimerkiksi kirjaluettelosta haku saattaa vaatia oman alavalikkonsa. Visuaalista puolta teki mieli ehostaa, mutta jätin pois ettei menisi perusasia hankalasti hahmotettavaksi.

        Perusideana on että kun tätä päävalikko aukeaa, sillä on "Lista" käytettävissä ja siksi sillä on globaali näkyvyys. Tässä tämä listan lataus on risuaidalla kommentoitu vielä pois käytöstä. Valikon käyttämät funktio-nimet eivät ole tarkoituksellisesti esimerkeissä käytyjen kanssa yhteen sopivia, vaan tarkoitus on vasta tämän päävalikon myötä alkaa kasaamaan sitä lopullista ohjelmaan.

        Päävalikko siistii ruudulla näkyvän roskan pois, ja vain kohta 6 toimii tässä vaiheessa.


      • Anonyymi
        Anonyymi kirjoitti:

        No onpahan jäänyt turha kaksoispiste siihen funktion perään (rivi 28). Puolipisteenä se olisi saattanut läpi mennäkin. Ota pois, ei kuulu asiaan.

        Asiat rupesi etenemään pika vauhtia, siispä koko ohjelman kasassa pitävä osa:

        https://s2.gifyu.com/images/MainMenu.png

        Päävalikkoa voidaan pitää mallina kun luodaan tehtävä kohtaisia valikoita, esimerkiksi kirjaluettelosta haku saattaa vaatia oman alavalikkonsa. Visuaalista puolta teki mieli ehostaa, mutta jätin pois ettei menisi perusasia hankalasti hahmotettavaksi.

        Perusideana on että kun tätä päävalikko aukeaa, sillä on "Lista" käytettävissä ja siksi sillä on globaali näkyvyys. Tässä tämä listan lataus on risuaidalla kommentoitu vielä pois käytöstä. Valikon käyttämät funktio-nimet eivät ole tarkoituksellisesti esimerkeissä käytyjen kanssa yhteen sopivia, vaan tarkoitus on vasta tämän päävalikon myötä alkaa kasaamaan sitä lopullista ohjelmaan.

        Päävalikko siistii ruudulla näkyvän roskan pois, ja vain kohta 6 toimii tässä vaiheessa.

        Taas minä tyrkytin sitä puolipistettä sinne rivin 23 loppuun, sitäkään ei tarvita. Kirjoitan aika paljon Lazaruksella Free Pascal -kielisiä virityksiä, ja tuossa ympäristössä rivit päättyy aina puolipisteeseen. Se näyttää seuraavan mukana python skripteihinkin. Puolipiste pythonissa vastaa rivinvaihtoa, joten usein se ei virhettä tuota, ja jää huomaamatta.


      • Anonyymi kirjoitti:

        No onpahan jäänyt turha kaksoispiste siihen funktion perään (rivi 28). Puolipisteenä se olisi saattanut läpi mennäkin. Ota pois, ei kuulu asiaan.

        Asiat rupesi etenemään pika vauhtia, siispä koko ohjelman kasassa pitävä osa:

        https://s2.gifyu.com/images/MainMenu.png

        Päävalikkoa voidaan pitää mallina kun luodaan tehtävä kohtaisia valikoita, esimerkiksi kirjaluettelosta haku saattaa vaatia oman alavalikkonsa. Visuaalista puolta teki mieli ehostaa, mutta jätin pois ettei menisi perusasia hankalasti hahmotettavaksi.

        Perusideana on että kun tätä päävalikko aukeaa, sillä on "Lista" käytettävissä ja siksi sillä on globaali näkyvyys. Tässä tämä listan lataus on risuaidalla kommentoitu vielä pois käytöstä. Valikon käyttämät funktio-nimet eivät ole tarkoituksellisesti esimerkeissä käytyjen kanssa yhteen sopivia, vaan tarkoitus on vasta tämän päävalikon myötä alkaa kasaamaan sitä lopullista ohjelmaan.

        Päävalikko siistii ruudulla näkyvän roskan pois, ja vain kohta 6 toimii tässä vaiheessa.

        Hip huraa!!! Nyt toimii ainakin tallennus tiedostoon ja haku tiedostosta, kun otin turhan puolipisteen pois! Nätimmin tulivat näytölle, kuin tuossa alla, mutta pakko oli laittaa näytille!

        Nyt alan tekemän sitä päävalikkoa ja jätän sen yhden rivin ylimääräisen puolipisteen laittamatta.


        KIRJA KIRJOITTAJA VUOSI
        Peppi Pitkätossu Astrid Lindgren 1945
        Vaahteramäen Eemeli Astrid Lindgren 1963
        Pikku naisia Louisa M. Alcott 1868
        Annan nuoruusvuodet L. M. Montgomery 1908


        Paina jotain jatkaaksesi


      • Anonyymi kirjoitti:

        No onpahan jäänyt turha kaksoispiste siihen funktion perään (rivi 28). Puolipisteenä se olisi saattanut läpi mennäkin. Ota pois, ei kuulu asiaan.

        Asiat rupesi etenemään pika vauhtia, siispä koko ohjelman kasassa pitävä osa:

        https://s2.gifyu.com/images/MainMenu.png

        Päävalikkoa voidaan pitää mallina kun luodaan tehtävä kohtaisia valikoita, esimerkiksi kirjaluettelosta haku saattaa vaatia oman alavalikkonsa. Visuaalista puolta teki mieli ehostaa, mutta jätin pois ettei menisi perusasia hankalasti hahmotettavaksi.

        Perusideana on että kun tätä päävalikko aukeaa, sillä on "Lista" käytettävissä ja siksi sillä on globaali näkyvyys. Tässä tämä listan lataus on risuaidalla kommentoitu vielä pois käytöstä. Valikon käyttämät funktio-nimet eivät ole tarkoituksellisesti esimerkeissä käytyjen kanssa yhteen sopivia, vaan tarkoitus on vasta tämän päävalikon myötä alkaa kasaamaan sitä lopullista ohjelmaan.

        Päävalikko siistii ruudulla näkyvän roskan pois, ja vain kohta 6 toimii tässä vaiheessa.

        Ja nyt olen tässä kohtaa. Tietenkään valikon valinnat eivät vielä toimi, mutta edistystä silti!!!



        KIRJA KIRJOITTAJA VUOSI
        Peppi Pitkätossu Astrid Lindgren 1945
        Vaahteramäen Eemeli Astrid Lindgren 1963
        Pikku naisia Louisa M. Alcott 1868
        Annan nuoruusvuodet L. M. Montgomery 1908


        Paina jotain jatkaaksesi
        'clear' is not recognized as an internal or external command,
        operable program or batch file.



        1. Hae kirjan nimellä, kirjailijan nimellä, tai vuosiluvulla.
        2. Muokkaa kirjaluettelon merkintää.
        3. Poista kirjaluettelon merkintä.
        4. Lisää kirjaluetteloon merkintä.
        5. Tulosta kirjaluettelo.
        6. Lopetus.

        Anna valintasi [1-6] :


      • Anonyymi
        Katjaana kirjoitti:

        Ja nyt olen tässä kohtaa. Tietenkään valikon valinnat eivät vielä toimi, mutta edistystä silti!!!



        KIRJA KIRJOITTAJA VUOSI
        Peppi Pitkätossu Astrid Lindgren 1945
        Vaahteramäen Eemeli Astrid Lindgren 1963
        Pikku naisia Louisa M. Alcott 1868
        Annan nuoruusvuodet L. M. Montgomery 1908


        Paina jotain jatkaaksesi
        'clear' is not recognized as an internal or external command,
        operable program or batch file.



        1. Hae kirjan nimellä, kirjailijan nimellä, tai vuosiluvulla.
        2. Muokkaa kirjaluettelon merkintää.
        3. Poista kirjaluettelon merkintä.
        4. Lisää kirjaluetteloon merkintä.
        5. Tulosta kirjaluettelo.
        6. Lopetus.

        Anna valintasi [1-6] :

        Toimisiko Windowsissa cls?

        Linux:
        os.system('clear')

        Windows:
        os.system('cls')

        Testaappa tuo, poistuuko virheviesti.


      • Anonyymi kirjoitti:

        Toimisiko Windowsissa cls?

        Linux:
        os.system('clear')

        Windows:
        os.system('cls')

        Testaappa tuo, poistuuko virheviesti.

        Tämä onnistui, jos tarkoitus oli se, että jäljelle jää vain alla oleva.

        os.system('cls') siis poisti kaiken sitä edeltävän.


        1. Hae kirjaluettelosta kirjan nimellä, kirjailijan nimellä, tai vuosiluvulla.
        2. Muokkaa kirjaluettelon merkintää.
        3. Poista kirjaluettelon merkintä.
        4. Lisää kirjaluetteloon merkintä.
        5. Tulosta kirjaluettelo.
        6. Lopetus.

        Anna valintasi [1 - 6]:


    • Anonyymi

      Olikohan Windowsin komentokehotteesta käsin käskytettäviä, vuorovaikutteisia dialogeja jotka toimisi Linuxin Zenityn tavoin.

      Tässä jatkossa olisi hyvä päästä, haku ja muokkaus tapahtumissa, vuorovaikutteisten dialogien avulla asettamaan halutut arvot sekä informoimaan käyttäjää olemassa olevasta tilanteesta ja muutosten vaikutuksista jne. Olen aika onnistuneesti unohtanut Windowsin tarjoamat vuorovaikutusmahdollisuudet.

      Jos minä teen mallit zenity dialogeja käyttäen, onnistuuko sinulla sovittaa ne Windowsin vastaaviin. No minä yritän löytää jotain Windosiin sopivaa, mutta kun en pysty niitä testaamaan, on toimivuus hyvin epävarmaa. Katsotaan nyt, jollakin tavoin tuo tulisi ratkaista ettei tarvitse pelkkien imput ja print komennoin asiassa edetä.

      • Anonyymi

        Olisihan tuolla Zenity for Windows asennettavissa mutta, osaatko asentaa, ja toimiiko samalla tavalla. Jatkan ajatuksella että pystyt järjestämään Zenityn dialogit ohjelmasi käyttöön.

        https://github.com/kvaps/zenity-windows


      • Anonyymi kirjoitti:

        Olisihan tuolla Zenity for Windows asennettavissa mutta, osaatko asentaa, ja toimiiko samalla tavalla. Jatkan ajatuksella että pystyt järjestämään Zenityn dialogit ohjelmasi käyttöön.

        https://github.com/kvaps/zenity-windows

        Noin ja Zenity asentui, mutta tiedä sitten osaanko sovittaa niitä Windowsin vastaaviin...


    • Anonyymi

      Ja nyt sitten paljastuu se kuinka tulemme pitämään ohjelman kasassa erillisinä moduuleina, tähän joudutaan menemään koska lähdekoodi tulee kasvamaan vaikeasti hallitaviin mittoihinsa.

      Sinulle on kaksi pyhton tiedostoa, lataa molemmat ja sijoita samaan kansioon, mieluummin erilleen niistä esimerkeistä. Tulemme lisäämään näitä moduuleja ja ottamaan ne mukaan MainMenu.py tiedostossa.

      Sinulle jää tehtäväksi tehdä Windowsin vaatimat muutokset. Tässä tulee testatuksi, toimiiko se Zenity vai ei. Tässä on tärkeää että et ladatessasi muuta tiedostojen nimiä nyt etkä jatkossa, muutoin liittäminen päävalikkoon ei onnistu.

      https://pastebin.com/u/Turpo-Urpo

      • Anonyymi

        Lisäsin vielä yhden tiedoston mukaan, ja nyt tulisi päävalikon kohdat 5 ja 6 toimia. Joudut kopioimaan sen Kirjasto.txt tiedoston näiden kanssa samaan hakemistoon nimellä: Kirjasto.dat


      • Tallensin kaikki kolme HTML-tiedostoa omaan kansioonsa niillä nimillä, kuin ne olivat... sieltä ne voi sitten ottaa...

        Tuo Windows-muutokset-'tehtävä' kyllä hirvittää, mutta yritetään...


      • Anonyymi kirjoitti:

        Lisäsin vielä yhden tiedoston mukaan, ja nyt tulisi päävalikon kohdat 5 ja 6 toimia. Joudut kopioimaan sen Kirjasto.txt tiedoston näiden kanssa samaan hakemistoon nimellä: Kirjasto.dat

        Nyt minulla on siis erillinen Tiedostot-kansio, jossa on kolme lähettämääsi tiedostoa niillä nimillään ja sellaisinaan, kuin sinä olit ne tallentanut.

        Ja nytkö siis muutan oman Kirjasto.txt-tiedostoni muotoon Kirjasto.dat ja tallennan sen Tiedostot-kansioon noidn muiden seuraksi?


      • Anonyymi
        Katjaana kirjoitti:

        Nyt minulla on siis erillinen Tiedostot-kansio, jossa on kolme lähettämääsi tiedostoa niillä nimillään ja sellaisinaan, kuin sinä olit ne tallentanut.

        Ja nytkö siis muutan oman Kirjasto.txt-tiedostoni muotoon Kirjasto.dat ja tallennan sen Tiedostot-kansioon noidn muiden seuraksi?

        Niin, muuta ne eivät ole HTML -tiedostoja vaan (*.py) python lähdekoodi tiedostoja, aivan kuten sinunkin kirjoittamasikin olivat.

        Niin, kun ajat sen mainmenu.py tiedoston joka nyt on se pääohjelma, nähdään toimiiko ne zenity -dialogit.


      • Anonyymi kirjoitti:

        Niin, muuta ne eivät ole HTML -tiedostoja vaan (*.py) python lähdekoodi tiedostoja, aivan kuten sinunkin kirjoittamasikin olivat.

        Niin, kun ajat sen mainmenu.py tiedoston joka nyt on se pääohjelma, nähdään toimiiko ne zenity -dialogit.

        Juuh, ei antanut tallentaa niitä kuin HTML:nä..., mutta avattaessa ovat todellakin 'pythonia'! Eli kopioin ne kaikki kolme itselleni omaan kansioonsa kopioin vielä sen Kirjasto.txt-tiedoston näiden kanssa samaan kansioon nimellä: Kirjasto.dat


      • Anonyymi
        Katjaana kirjoitti:

        Juuh, ei antanut tallentaa niitä kuin HTML:nä..., mutta avattaessa ovat todellakin 'pythonia'! Eli kopioin ne kaikki kolme itselleni omaan kansioonsa kopioin vielä sen Kirjasto.txt-tiedoston näiden kanssa samaan kansioon nimellä: Kirjasto.dat

        Ompas se Windows outo vekotin, no tärkeintä että sait, mutta toimiko. Tärkeä tieto, koska seuraavaksi ajattelin sitä uuden tiedon lisäämistä, jonka kaavailin tapahtuvan tälläisen zenity lomakkeen avulla:

        zenity --forms --title="Lisää uusi kirja luetteloon" --text="Kirjan tiedot" --add-entry="Kirjan nimi" --add-entry="Kirjailijan nimi" --add-entry="Julkaisu vuosi"

        Tuotahan voit testata suoraan komentokehotteessa.


      • Anonyymi
        Anonyymi kirjoitti:

        Ompas se Windows outo vekotin, no tärkeintä että sait, mutta toimiko. Tärkeä tieto, koska seuraavaksi ajattelin sitä uuden tiedon lisäämistä, jonka kaavailin tapahtuvan tälläisen zenity lomakkeen avulla:

        zenity --forms --title="Lisää uusi kirja luetteloon" --text="Kirjan tiedot" --add-entry="Kirjan nimi" --add-entry="Kirjailijan nimi" --add-entry="Julkaisu vuosi"

        Tuotahan voit testata suoraan komentokehotteessa.

        Tuossa on kuva siitä, mitä tuon komentokehotteessa suoritettavan komennon tulisi tuottaa ruudulle. En osaa kertoa kuinka pääset komentokehoitteeseen, joten koita keksiä se ihan itse. Linux avaa komentotulkin painamalla Ctrl Alt T yhtä aikaa.

        https://s8.gifyu.com/images/Lisaa-uusi-kirja-luetteloon_262.png


      • Anonyymi kirjoitti:

        Niin, muuta ne eivät ole HTML -tiedostoja vaan (*.py) python lähdekoodi tiedostoja, aivan kuten sinunkin kirjoittamasikin olivat.

        Niin, kun ajat sen mainmenu.py tiedoston joka nyt on se pääohjelma, nähdään toimiiko ne zenity -dialogit.

        1. Sain pienen HUOM-ikkunan, jossa luki: Kaivattiin (Kirjasto.dat) tiedostoa, mutta sitä ei löytynyt. Vaikka se on samassa kansiossa, missä nämä muutkin...

        2. Nämä kuusi herjaa:
        Undefined variable 'HaetaanKirjaLuettelosta' [32, 50]
        Undefined variable 'MuokataanKirjaLuetteloa' [33, 50]
        Undefined variable 'PoistaKohdeKirjaLuettelosta' [34, 50]
        Undefined variable 'TallennaKirjaLuettelo' [35, 50]
        Unused import pickle from wildcard import [7, 1]
        Unused import ShowMessage from wildcard import [7,1]

        3. Muutoin tämä tulos:
        'clear' is not recognized as an internal or external command,
        operable program or batch file.



        K I R J A L U E T T E L O N P Ä Ä V A L I K K O
        1. Hae kirjan/kirjailijan nimellä tai vuosiluvulla.
        2. Muokkaa kirjaluettelon merkintää.
        3. Poista kirjaluettelon merkintä.
        4. Lisää kirjaluetteloon merkintä.
        5. Tulosta kirjaluettelo.
        6. Lopetus

        Anna valintasi [1-6] :


      • Anonyymi
        Katjaana kirjoitti:

        1. Sain pienen HUOM-ikkunan, jossa luki: Kaivattiin (Kirjasto.dat) tiedostoa, mutta sitä ei löytynyt. Vaikka se on samassa kansiossa, missä nämä muutkin...

        2. Nämä kuusi herjaa:
        Undefined variable 'HaetaanKirjaLuettelosta' [32, 50]
        Undefined variable 'MuokataanKirjaLuetteloa' [33, 50]
        Undefined variable 'PoistaKohdeKirjaLuettelosta' [34, 50]
        Undefined variable 'TallennaKirjaLuettelo' [35, 50]
        Unused import pickle from wildcard import [7, 1]
        Unused import ShowMessage from wildcard import [7,1]

        3. Muutoin tämä tulos:
        'clear' is not recognized as an internal or external command,
        operable program or batch file.



        K I R J A L U E T T E L O N P Ä Ä V A L I K K O
        1. Hae kirjan/kirjailijan nimellä tai vuosiluvulla.
        2. Muokkaa kirjaluettelon merkintää.
        3. Poista kirjaluettelon merkintä.
        4. Lisää kirjaluetteloon merkintä.
        5. Tulosta kirjaluettelo.
        6. Lopetus

        Anna valintasi [1-6] :

        Kohdasta 2 olevat huomautukset voi vielä unohtaa, koska päävalikon kohdat 6 ja 5 toimivat, ja loppuja olemme luomassa, ne huomautukset vähenevät sitä mukaa kuin ohjelma valmistuu.

        Kohdan 1 väärät merkit johtuu väärästä merkistökoodista, sinun pitää käyttää tallennuksessa UTF8 koodausta.

        Kohdan 3 virhe johtuu taas siitä että sinun pitää vaihtaa Linuxin clear Windowsin käyttämään cls ruudun tyhjennys komentoon.

        Linux:
        os.system('clear')

        Windows:
        os.system('cls')


      • Anonyymi
        Katjaana kirjoitti:

        1. Sain pienen HUOM-ikkunan, jossa luki: Kaivattiin (Kirjasto.dat) tiedostoa, mutta sitä ei löytynyt. Vaikka se on samassa kansiossa, missä nämä muutkin...

        2. Nämä kuusi herjaa:
        Undefined variable 'HaetaanKirjaLuettelosta' [32, 50]
        Undefined variable 'MuokataanKirjaLuetteloa' [33, 50]
        Undefined variable 'PoistaKohdeKirjaLuettelosta' [34, 50]
        Undefined variable 'TallennaKirjaLuettelo' [35, 50]
        Unused import pickle from wildcard import [7, 1]
        Unused import ShowMessage from wildcard import [7,1]

        3. Muutoin tämä tulos:
        'clear' is not recognized as an internal or external command,
        operable program or batch file.



        K I R J A L U E T T E L O N P Ä Ä V A L I K K O
        1. Hae kirjan/kirjailijan nimellä tai vuosiluvulla.
        2. Muokkaa kirjaluettelon merkintää.
        3. Poista kirjaluettelon merkintä.
        4. Lisää kirjaluetteloon merkintä.
        5. Tulosta kirjaluettelo.
        6. Lopetus

        Anna valintasi [1-6] :

        Na niin, tarkista nyt varmuudeksi, että nämä 4 tiedostoa on samassa kansiossa:

        MainMenu.py
        TulostaKirjaLuetteloFile.py
        LataaKirjaLuetteloFile.py
        Kirjasto.dat

        ja että kirjainkoko nimissä on sama.


      • Anonyymi
        Anonyymi kirjoitti:

        Na niin, tarkista nyt varmuudeksi, että nämä 4 tiedostoa on samassa kansiossa:

        MainMenu.py
        TulostaKirjaLuetteloFile.py
        LataaKirjaLuetteloFile.py
        Kirjasto.dat

        ja että kirjainkoko nimissä on sama.

        On siinä sellainenkin mahdollisuus että säilytit sen oman alkuperäisen Kirjasto.txt tiedoston, jonka sisältö oli teksti muodossa ja koko noin 10 tavua, kun sinun tulisi tehdä se kopiointi siitä uudemmasta tiedostosta joka koko on 242 tavua.

        Mutta joka tapauksessa virheviestin tuotti zenityn dialogi, joka osaa ohjelmaasi, eli viesti ei ole järjestelmätason virhesanoma, ja se on osoitus siitä että se toimii, vaikka tallennus formaatti oli jotain muuta kuin utf8. Mutta jos vielä testaisit sen zenity lomakkeen toimivuuden, niin aloitan rakentaa uuden kirjan lisäysmahdollisuutta siihen ohjelmaan, jolloin saadaan toimimaan jo kohdat 4,5 ja 6.

        Eli tässä vielä tämä komentoputki, jonka kopioit komentokehotteeseen. Tämä on yhden rivin komento vaikka se tässä jakaantuukin usealle riville:

        zenity --forms --title="Lisää uusi kirja luetteloon" --text="Kirjan tiedot" --add-entry="Kirjan nimi" --add-entry="Kirjailijan nimi" --add-entry="Julkaisu vuosi"


      • Anonyymi kirjoitti:

        Kohdasta 2 olevat huomautukset voi vielä unohtaa, koska päävalikon kohdat 6 ja 5 toimivat, ja loppuja olemme luomassa, ne huomautukset vähenevät sitä mukaa kuin ohjelma valmistuu.

        Kohdan 1 väärät merkit johtuu väärästä merkistökoodista, sinun pitää käyttää tallennuksessa UTF8 koodausta.

        Kohdan 3 virhe johtuu taas siitä että sinun pitää vaihtaa Linuxin clear Windowsin käyttämään cls ruudun tyhjennys komentoon.

        Linux:
        os.system('clear')

        Windows:
        os.system('cls')

        Kohta 3 korjattu uudelleen!

        Kohta 1 sensijaan ei ota oonistuakseen... jos siitä ottaa risun edestä pois, niin saan herjan: SyntaxError: invalid syntax


      • Anonyymi kirjoitti:

        Na niin, tarkista nyt varmuudeksi, että nämä 4 tiedostoa on samassa kansiossa:

        MainMenu.py
        TulostaKirjaLuetteloFile.py
        LataaKirjaLuetteloFile.py
        Kirjasto.dat

        ja että kirjainkoko nimissä on sama.

        Nämä ovat samat, eilen tosin käytön myötä sinne (Tiedostot-kansio, jonne olen nämä tallentanut) ilmestyi myös _pycache_-tiedostokansio, joka sisältää:

        LataaKirjaLuetteloFile.cpython-38
        ja
        TulostaKirjaLuetteloFile.cpython-38


      • Anonyymi kirjoitti:

        On siinä sellainenkin mahdollisuus että säilytit sen oman alkuperäisen Kirjasto.txt tiedoston, jonka sisältö oli teksti muodossa ja koko noin 10 tavua, kun sinun tulisi tehdä se kopiointi siitä uudemmasta tiedostosta joka koko on 242 tavua.

        Mutta joka tapauksessa virheviestin tuotti zenityn dialogi, joka osaa ohjelmaasi, eli viesti ei ole järjestelmätason virhesanoma, ja se on osoitus siitä että se toimii, vaikka tallennus formaatti oli jotain muuta kuin utf8. Mutta jos vielä testaisit sen zenity lomakkeen toimivuuden, niin aloitan rakentaa uuden kirjan lisäysmahdollisuutta siihen ohjelmaan, jolloin saadaan toimimaan jo kohdat 4,5 ja 6.

        Eli tässä vielä tämä komentoputki, jonka kopioit komentokehotteeseen. Tämä on yhden rivin komento vaikka se tässä jakaantuukin usealle riville:

        zenity --forms --title="Lisää uusi kirja luetteloon" --text="Kirjan tiedot" --add-entry="Kirjan nimi" --add-entry="Kirjailijan nimi" --add-entry="Julkaisu vuosi"

        Kirjasto.dat on 242 tavua ja se on Tiedostot-kansiossani, eli se on ok.

        Myös Lisää uusi kirja luetteloon -lomake ilmestyy nätisti komentokehoitteen komennon jälkeen (otsikossa Lisää-sanassa vain pientä sanomista, mutta johtunee siitä UTF8:sta).


      • Anonyymi
        Katjaana kirjoitti:

        Kohta 3 korjattu uudelleen!

        Kohta 1 sensijaan ei ota oonistuakseen... jos siitä ottaa risun edestä pois, niin saan herjan: SyntaxError: invalid syntax

        Python lähdekoodi on sisennyksistään erittäin tarkka. Ottamalla merkin rivin alusta pois, muuttuu sisennys samalla. Korjaa myös sisennyksen muuttuminen merkkejä poistaessasi.


      • Anonyymi
        Katjaana kirjoitti:

        Nämä ovat samat, eilen tosin käytön myötä sinne (Tiedostot-kansio, jonne olen nämä tallentanut) ilmestyi myös _pycache_-tiedostokansio, joka sisältää:

        LataaKirjaLuetteloFile.cpython-38
        ja
        TulostaKirjaLuetteloFile.cpython-38

        Nämä *.cpython-38 tiedostot muodostetaan lähdekoodista ohjelmaa ensimmäisen kerran suoritettaessa. Mikäli lähdekooditiedoston ja *.cpython-38 -tiedoston aikaleimat vastaavat toisiaan, ei toisella ajo kerralla lueta lähdekoodia ollenkaan, vaan suoritetaan tämä *.cpython-38 suoraan. Näin nopeutetaan ohjelman suoritusta.


      • Anonyymi
        Katjaana kirjoitti:

        Kirjasto.dat on 242 tavua ja se on Tiedostot-kansiossani, eli se on ok.

        Myös Lisää uusi kirja luetteloon -lomake ilmestyy nätisti komentokehoitteen komennon jälkeen (otsikossa Lisää-sanassa vain pientä sanomista, mutta johtunee siitä UTF8:sta).

        Mikäli tuon zenity lomakkeen ajaminen komentokehotteesta, tuottaa vääriä merkkejä tulosteeseen, olisi perehdyttävä siihen onko Windows zenityllä jokin konfikurointi tiedosto, jossa määritellään zenityn käyttämä merkistö, tai onko dialogien ajossa ylimääräinen optio jota tulisi käyttää.

        Minkähän laista opastusta zenity antaa kun ajat seuraavan komennon:

        zenity --help

        Poistoon sopisi Zenity myös, vaikka tämännäköisellä dialogilla. Tämäkin on yksi rivinen komento vaikka pituutta on reilusti:

        zenity --list --checklist --width=450 --height=400 --title="Valitse poistettavat" --column="" --column="No" --column="Kirjan nimi" --column="Kirjailija" --column="Vuosi" "" "1" "Peppi Pitkätossu" "Astrid Lindgren" "1945" "" "2" "Vaahteramäen Eemeli" "Astrid Lindgren" "1963" "" "3" "Pikku naisia" "Louisa M. Alcott" "1868" "" "4" "Annan nuoruusvuodet" "L. M. Montgomery" "1908"


      • Anonyymi kirjoitti:

        Nämä *.cpython-38 tiedostot muodostetaan lähdekoodista ohjelmaa ensimmäisen kerran suoritettaessa. Mikäli lähdekooditiedoston ja *.cpython-38 -tiedoston aikaleimat vastaavat toisiaan, ei toisella ajo kerralla lueta lähdekoodia ollenkaan, vaan suoritetaan tämä *.cpython-38 suoraan. Näin nopeutetaan ohjelman suoritusta.

        Ok!


      • Anonyymi kirjoitti:

        Python lähdekoodi on sisennyksistään erittäin tarkka. Ottamalla merkin rivin alusta pois, muuttuu sisennys samalla. Korjaa myös sisennyksen muuttuminen merkkejä poistaessasi.

        Ok!


    • Anonyymi
      • Anonyymi

        Lisäsin puuttuvat tiedostot, nyt ei niitä kohdan 2 huomautuksia pitäisi näkyä sen Visual Studio Code editorinkaan kanssa.

        Sinun on syytä ladata kaikki tiedosto, koska suurin osa niistä on muuttunut. Katso tuossa edellä olevaa kuvaa, kuinka lataus tulisi tehdä.


      • No voi rähmät, tuota en huomannut. Käytän sitä jatkossa!


      • Anonyymi kirjoitti:

        Lisäsin puuttuvat tiedostot, nyt ei niitä kohdan 2 huomautuksia pitäisi näkyä sen Visual Studio Code editorinkaan kanssa.

        Sinun on syytä ladata kaikki tiedosto, koska suurin osa niistä on muuttunut. Katso tuossa edellä olevaa kuvaa, kuinka lataus tulisi tehdä.

        Ok, eli Turpo-Urpossa on nyt peräti 8 *.py-tiedostoa ja lataan ne kaikki Tiedostot-kansiooni download-namiskalla!


    • Anonyymi

      Yksinpuhelua koko ketju.

      • Herjoja käytettäessä vielä 'esittelemättömyydestä', esim. TallennaKirjaLuettelo is not defined...

        Clear:it vaihdettu jälleen cls:ksi.

        Mutta muutoin siis nätisti tuo alla oleva valikko.

        K I R J A L U E T T E L O N P Ä Ä V A L I K K O
        1. Hae kirjan/kirjailijan nimellä tai vuosiluvulla.
        2. Muokkaa kirjaluettelon merkintää.
        3. Poista kirjaluettelon merkintä.
        4. Lisää kirjaluetteloon merkintä.
        5. Tulosta kirjaluettelo.
        6. Lopetus

        Anna valintasi [1-6] :


    • Anonyymi

      Onpaan tullut virhe tuohon, MainMenu.py tiedostoon ja se tallenna on jäänyt pois. Korjaan illemmalla ajan tasalle.

    • Anonyymi

      Tässä ketjussa on paljon sekavuutta. Aloittajan ongelmiin ei tarvitse mitään erillisiä kirjastoja. Koska tässä kuitenkin yritetään jotain tietokantasovellusta tehdä, niin suosittelen NoSQL:ää, kuten MongoDB:tä, joka tallentaa JSON-tapaista dataa, mikä sopii tämän kaltaiseen käyttöön.

      https://www.w3schools.com/python/python_mongodb_getstarted.asp

    • Anonyymi

      No niin, nyt on päivitetty nämä kaksi tiedostoa:

      MainMenu.py
      TallennaKirjaLuetteloFile.py

      Ehkä tuo tallennus välttää lopullisena versiona, ellet löydä virheitä siitä.

      • Ok, kokeilen!


      • Aluksi edelleen: Kaivattiin (Kirjasto.dat) tiedostoa, mutta sitä ei löytynyt. Kun valitsee: OK, niin sen jälkeen valikko tulee nätisti tarjolle, mutta:

        kohdat 1 - 4 antavat herjan: Tämä osuus tekemättä.
        kohta 5 antaa herjan: Kirjaluetteloa ei ole olemassa, tai se on tyhjä.


      • Anonyymi
        Katjaana kirjoitti:

        Aluksi edelleen: Kaivattiin (Kirjasto.dat) tiedostoa, mutta sitä ei löytynyt. Kun valitsee: OK, niin sen jälkeen valikko tulee nätisti tarjolle, mutta:

        kohdat 1 - 4 antavat herjan: Tämä osuus tekemättä.
        kohta 5 antaa herjan: Kirjaluetteloa ei ole olemassa, tai se on tyhjä.

        Kohdat 1-4 on asetettu antamaa tuo informaatio siihen asti kun saamme tehtyä noihin moduuleihin oikeat sisällöt. Tämä paikan varaus siksi ettei Visual Studio Code heittäisi virhettä noista puuttuvista.

        Käynnistyksessä pyritään lukemaan kirjaluettelo valmiiksi muistiin, ja taas kohta 5 tulostaa kirjaluettelon muistista. Koska kumpikin antaa informaatiota luettelon puuttumisesta, tulisi sinun kopioida se (Kirjasto.txt) tiedosto näiden ohjelmakoodien kanssa samaan kansioon (Kirjasto.dat) nimisenä. Tarkista sen tiedoston koko että se on se yli 200 tavua oleva.

        Vaikuttaa toimivan aivan oikein. Katsotaan nyt kuinka me tehdään seuraava moduuli, eli yksi niistä 1-4 puuttuvista. Luultavasti toinen näistä Lisäys tai Poisto (3 tai 4) olisivat ne helpoimmat kohdat. Saisi nyt vaan päätettyä mielessään kuminko on parempi, tehdäänkö mahdolliseksi käyttää ryhmälisäystä ja ryhmäpoistoa, vai olisiko parempi yksin kappalein lisätä ja poistaa kohteita luettelosta, kummin sinä tekisit.


      • Anonyymi
        Katjaana kirjoitti:

        Aluksi edelleen: Kaivattiin (Kirjasto.dat) tiedostoa, mutta sitä ei löytynyt. Kun valitsee: OK, niin sen jälkeen valikko tulee nätisti tarjolle, mutta:

        kohdat 1 - 4 antavat herjan: Tämä osuus tekemättä.
        kohta 5 antaa herjan: Kirjaluetteloa ei ole olemassa, tai se on tyhjä.

        Otin vielä kuvakaappauksen tuosta meidän projektikansiosta. Kaikki nuo samat tiedostot, saman nimisinä ja saman kokoisena tulisi olla siellä sinunkin kansiossa.

        https://s2.gifyu.com/images/kirjasto---Tiedostonhallinta_264.png


      • Anonyymi
        Anonyymi kirjoitti:

        Otin vielä kuvakaappauksen tuosta meidän projektikansiosta. Kaikki nuo samat tiedostot, saman nimisinä ja saman kokoisena tulisi olla siellä sinunkin kansiossa.

        https://s2.gifyu.com/images/kirjasto---Tiedostonhallinta_264.png

        No jaa, voi olla muutaman tavun eroja, kun olet tehnyt niitä Linux komentojen sovituksia Windowsiin. Kaikki muu joutaa tästä projektikansiosta pois.


      • Anonyymi kirjoitti:

        Kohdat 1-4 on asetettu antamaa tuo informaatio siihen asti kun saamme tehtyä noihin moduuleihin oikeat sisällöt. Tämä paikan varaus siksi ettei Visual Studio Code heittäisi virhettä noista puuttuvista.

        Käynnistyksessä pyritään lukemaan kirjaluettelo valmiiksi muistiin, ja taas kohta 5 tulostaa kirjaluettelon muistista. Koska kumpikin antaa informaatiota luettelon puuttumisesta, tulisi sinun kopioida se (Kirjasto.txt) tiedosto näiden ohjelmakoodien kanssa samaan kansioon (Kirjasto.dat) nimisenä. Tarkista sen tiedoston koko että se on se yli 200 tavua oleva.

        Vaikuttaa toimivan aivan oikein. Katsotaan nyt kuinka me tehdään seuraava moduuli, eli yksi niistä 1-4 puuttuvista. Luultavasti toinen näistä Lisäys tai Poisto (3 tai 4) olisivat ne helpoimmat kohdat. Saisi nyt vaan päätettyä mielessään kuminko on parempi, tehdäänkö mahdolliseksi käyttää ryhmälisäystä ja ryhmäpoistoa, vai olisiko parempi yksin kappalein lisätä ja poistaa kohteita luettelosta, kummin sinä tekisit.

        Jep jep, Kirjasto.dat on 242 tavua!

        Minä kyllä ajattelin poistella ja lisäillä yksittäin... ei tullut mieleenkään sellainen ryhmämahdollisuus, eli varmaan se yksittäin olisi sitten kivampi!


      • Anonyymi kirjoitti:

        Otin vielä kuvakaappauksen tuosta meidän projektikansiosta. Kaikki nuo samat tiedostot, saman nimisinä ja saman kokoisena tulisi olla siellä sinunkin kansiossa.

        https://s2.gifyu.com/images/kirjasto---Tiedostonhallinta_264.png

        Jep, kaikki löytyvät samannimisinä ja lähes samankokoisina, kuin sinulla, mutta jostain syystä PoistaKohdeKirjaLuettelostaFile-tiedosto on minulla vain 336 tavua, eli jonkin verran pienempi, kuin sinulla (671).


      • Anonyymi
        Katjaana kirjoitti:

        Jep, kaikki löytyvät samannimisinä ja lähes samankokoisina, kuin sinulla, mutta jostain syystä PoistaKohdeKirjaLuettelostaFile-tiedosto on minulla vain 336 tavua, eli jonkin verran pienempi, kuin sinulla (671).

        Joo kerkisin sen päivittämistä aloittaa, mutta nyt päivitinkin ensin:

        UusiKohdeKirjaLuetteloonFile.py

        Katsoppa mitä siitä pitää Windowsille sovittaa.


      • Anonyymi
        Anonyymi kirjoitti:

        Joo kerkisin sen päivittämistä aloittaa, mutta nyt päivitinkin ensin:

        UusiKohdeKirjaLuetteloonFile.py

        Katsoppa mitä siitä pitää Windowsille sovittaa.

        Ja nyt on myös tämä päivitetty:

        PoistaKohdeKirjaLuettelostaFile.py

        Joten vain valikon 1 ja 2 kohdat puuttuvat.


      • Anonyymi
        Anonyymi kirjoitti:

        Ja nyt on myös tämä päivitetty:

        PoistaKohdeKirjaLuettelostaFile.py

        Joten vain valikon 1 ja 2 kohdat puuttuvat.

        Mitenkä sinulla itselläsi onnistuisi näiden 6,5,4,3 kohtien avulla kirjoittaa toisen tai molemmat noista, haluatko yrittää ensin omin päin. Vastailen jos osaan.


      • Anonyymi
        Anonyymi kirjoitti:

        Mitenkä sinulla itselläsi onnistuisi näiden 6,5,4,3 kohtien avulla kirjoittaa toisen tai molemmat noista, haluatko yrittää ensin omin päin. Vastailen jos osaan.

        Taisit mennä uuttavuotta vastaan ottamaan. Tässä kuitenkin tuo ryhmävalinta (monivalinta) ja vierellä yksittäin poistettavaksi valinta ikkunat.

        https://s2.gifyu.com/images/Valitse-poistettava_267.png

        Siinähän olisi ollut vielä kolmaskin mahdollisuus jonka kuhunkin kenttään olisi annettu poistettavasta vaikka vuosi ja kirjailija, jolloin kaikki kirjoittajan kirjat kyseiseltä vuodelta olisi voitu poistaa kerralla. Tai olisi vain annettu vuosi, jolloin kaikki kyseisen vuoden kirjat olisi poistettu, jne. Silloin olisi käytetty sitä samaa lomaketta jolla lisäyskin suoritettiin.


      • Anonyymi
        Anonyymi kirjoitti:

        Taisit mennä uuttavuotta vastaan ottamaan. Tässä kuitenkin tuo ryhmävalinta (monivalinta) ja vierellä yksittäin poistettavaksi valinta ikkunat.

        https://s2.gifyu.com/images/Valitse-poistettava_267.png

        Siinähän olisi ollut vielä kolmaskin mahdollisuus jonka kuhunkin kenttään olisi annettu poistettavasta vaikka vuosi ja kirjailija, jolloin kaikki kirjoittajan kirjat kyseiseltä vuodelta olisi voitu poistaa kerralla. Tai olisi vain annettu vuosi, jolloin kaikki kyseisen vuoden kirjat olisi poistettu, jne. Silloin olisi käytetty sitä samaa lomaketta jolla lisäyskin suoritettiin.

        Kuten varmaan huomasitkin, sinne kansioon ilmestyy muutamien tapahtumien seurauksena *.bak tiedosto, niin tässäkin tapauksessa.

        Kokemus on opettanut tännekin kirjoittaessa, että heti kun on painanut lähetä painiketta, huomaa viestiin jäänen kirjoitusvirheen. Tuosta *.bak tiedostosta löytyy viimeisimmän poiston tiedot, jos se kuitenkin oli vahinko, eikä tarkoituksellinen poisto.


      • Anonyymi kirjoitti:

        Joo kerkisin sen päivittämistä aloittaa, mutta nyt päivitinkin ensin:

        UusiKohdeKirjaLuetteloonFile.py

        Katsoppa mitä siitä pitää Windowsille sovittaa.

        Siellä on näin: Turpo-Urpo has no public pastes.

        Eli ei jostain syystä mitään enää...


      • Anonyymi kirjoitti:

        Ja nyt on myös tämä päivitetty:

        PoistaKohdeKirjaLuettelostaFile.py

        Joten vain valikon 1 ja 2 kohdat puuttuvat.

        Eikä tosiaan tätäkään nyt löydy Pastebin:stä..., minneköhän ne ovat kadonneet?


      • Anonyymi kirjoitti:

        Taisit mennä uuttavuotta vastaan ottamaan. Tässä kuitenkin tuo ryhmävalinta (monivalinta) ja vierellä yksittäin poistettavaksi valinta ikkunat.

        https://s2.gifyu.com/images/Valitse-poistettava_267.png

        Siinähän olisi ollut vielä kolmaskin mahdollisuus jonka kuhunkin kenttään olisi annettu poistettavasta vaikka vuosi ja kirjailija, jolloin kaikki kirjoittajan kirjat kyseiseltä vuodelta olisi voitu poistaa kerralla. Tai olisi vain annettu vuosi, jolloin kaikki kyseisen vuoden kirjat olisi poistettu, jne. Silloin olisi käytetty sitä samaa lomaketta jolla lisäyskin suoritettiin.

        Ja tästä tulee: Image not found... voi harmin paikka...


      • Anonyymi kirjoitti:

        Kuten varmaan huomasitkin, sinne kansioon ilmestyy muutamien tapahtumien seurauksena *.bak tiedosto, niin tässäkin tapauksessa.

        Kokemus on opettanut tännekin kirjoittaessa, että heti kun on painanut lähetä painiketta, huomaa viestiin jäänen kirjoitusvirheen. Tuosta *.bak tiedostosta löytyy viimeisimmän poiston tiedot, jos se kuitenkin oli vahinko, eikä tarkoituksellinen poisto.

        Ok!


    • Anonyymi

      Koko ketju on saman henkilön yksinpuhelua. Miksi?

      • Kyllä minulla tähän asti on ollut osaava auttaja täällä!


      • Anonyymi
        Katjaana kirjoitti:

        Kyllä minulla tähän asti on ollut osaava auttaja täällä!

        Joopa joo...


    • Anonyymi

      Taas ladattavissa.

      t. "osaava auttaja" 😁

      • No ni!

        Todellakaan en olisi osannut tätä yksin... Edes tuo asia, että tekee erillisiä tiedosto-kokonaisuuksia ja kutsuu niitä - kun niitä tarvitsee - ei tullut mieleen..., se tekee koodikokonaisuudesta erittäin paljon selkeämmän. Samoin menu-valikko, joka kertoo heti aluksi, mitä olisi tarjolla! Täytyy kyllä sanoa, että osaavalla auttajalla on opettajan vikaa...

        Nyt otin siis aluksi uudelleen (päivitin) seuraavat tiedostot:

        UusiKohdeKirjaLuetteloonFile ja
        PoistaKohdeKirjaLuettelostaFile


      • Anonyymi
        Katjaana kirjoitti:

        No ni!

        Todellakaan en olisi osannut tätä yksin... Edes tuo asia, että tekee erillisiä tiedosto-kokonaisuuksia ja kutsuu niitä - kun niitä tarvitsee - ei tullut mieleen..., se tekee koodikokonaisuudesta erittäin paljon selkeämmän. Samoin menu-valikko, joka kertoo heti aluksi, mitä olisi tarjolla! Täytyy kyllä sanoa, että osaavalla auttajalla on opettajan vikaa...

        Nyt otin siis aluksi uudelleen (päivitin) seuraavat tiedostot:

        UusiKohdeKirjaLuetteloonFile ja
        PoistaKohdeKirjaLuettelostaFile

        No nyt mennään jo siinä vaiheessa että on tekemättä vain se valikon kohta 2, koska tein myös

        HaetaanKirjaLuettelostaFile.py

        valmiiksi asti.


    • Anonyymi

      Syytä päivittää:

      HaetaanKirjaLuettelostaFile.py
      MainMenu.py

      Tämä siksi, että laitoin malliksi, kuinka alavalikko luettelosta hakemiseen liitetään päävalikkoon.

      • No niin, nämäkin on nyt päivitetty. Jostain syystä se ei löydä sitä Kirjasto.dat:a edelleenkään... (herja: Kirjaluetteloa ei ole olemassa, tai se on tyhjä.) No yritän ihmetellä miksi...

        Näitä alla olevian tyyppisiä virheitä se antaa 37 kappaletta ja 35 niistä viittaa riviin 7 ja kaksi kappaletta riviin 8:
        Unused import CITALIC from wildcard import
        Unused import CWHITE2 from wildcard import
        jne.

        Rivi 7 on: from ColorFile import *
        Rivi8 on: from LataaKirjaLuetteloFile import *


      • Anonyymi
        Katjaana kirjoitti:

        No niin, nämäkin on nyt päivitetty. Jostain syystä se ei löydä sitä Kirjasto.dat:a edelleenkään... (herja: Kirjaluetteloa ei ole olemassa, tai se on tyhjä.) No yritän ihmetellä miksi...

        Näitä alla olevian tyyppisiä virheitä se antaa 37 kappaletta ja 35 niistä viittaa riviin 7 ja kaksi kappaletta riviin 8:
        Unused import CITALIC from wildcard import
        Unused import CWHITE2 from wildcard import
        jne.

        Rivi 7 on: from ColorFile import *
        Rivi8 on: from LataaKirjaLuetteloFile import *

        Täytyy minunkin asentaa se editori joka sinulla on käytössä, ja katsoa miten siinä valitaan missä eri muodossa tiedosto tiedosto tallennetaan ja minkä suuruista muutosta tarvitaan että Linux formaatti vaihtuu Windowsin käyttämäksi.

        Minä luulen että pelkkä tiedoston avaus ja heti toisessa formaatissa tallennus ei riitä. No parin tunnin päästä olen jo viisaampi tämän suhteen. Minä käytä Geany editoria, ja sillä kyllä riittää tiedoston avaus ja suora tallennus muuta koodisivua käyttäen. Tästä Visual Studio Code en ole tähän mennessä ollut kiinnostunut yhtään, no tutustutaan nyt siihen, johan tuo on aika tuntea vähän sitäkin.


      • Anonyymi
        Katjaana kirjoitti:

        No niin, nämäkin on nyt päivitetty. Jostain syystä se ei löydä sitä Kirjasto.dat:a edelleenkään... (herja: Kirjaluetteloa ei ole olemassa, tai se on tyhjä.) No yritän ihmetellä miksi...

        Näitä alla olevian tyyppisiä virheitä se antaa 37 kappaletta ja 35 niistä viittaa riviin 7 ja kaksi kappaletta riviin 8:
        Unused import CITALIC from wildcard import
        Unused import CWHITE2 from wildcard import
        jne.

        Rivi 7 on: from ColorFile import *
        Rivi8 on: from LataaKirjaLuetteloFile import *

        Siellä oikeassa alakulmassa, näkyy käytetty koodisivu, ja sitä hiirellä klikaten aukeaa mahdollisuus avata käyttäen jotain muuta koodisivua kuten myös mahdollisuus tallentaa haluamallaan koodisivulla, eikä vaatinut koodin muokkausta.

        Noista virheellisistä merkeistä päätellen avaat tiedostot ISO 8859-4 koodisivua käyttäen. Kun taas minä olen ne tallentanut UTF-8. Jos haluat muuttaa ne Windowsin käyttämään, on sinun avattava tiedosto UTF-8 ja tallennettava käyttämälläsi, ja myös vaihdettava jokaisen tiedoston alussa määritelty koodaus omaasi vastaavaksi. Ja kaikkien tiedostojen tulisi käyttää samaa koodausta.


      • Anonyymi
        Anonyymi kirjoitti:

        Siellä oikeassa alakulmassa, näkyy käytetty koodisivu, ja sitä hiirellä klikaten aukeaa mahdollisuus avata käyttäen jotain muuta koodisivua kuten myös mahdollisuus tallentaa haluamallaan koodisivulla, eikä vaatinut koodin muokkausta.

        Noista virheellisistä merkeistä päätellen avaat tiedostot ISO 8859-4 koodisivua käyttäen. Kun taas minä olen ne tallentanut UTF-8. Jos haluat muuttaa ne Windowsin käyttämään, on sinun avattava tiedosto UTF-8 ja tallennettava käyttämälläsi, ja myös vaihdettava jokaisen tiedoston alussa määritelty koodaus omaasi vastaavaksi. Ja kaikkien tiedostojen tulisi käyttää samaa koodausta.

        Ihan vaan sivuhuomautuksena;

        Visual Studio Code editorin asennus ja poisto olisi jättänyt 4305kpl tarpeetonta tiedosto roskaa järjestelmään.


      • Anonyymi kirjoitti:

        Siellä oikeassa alakulmassa, näkyy käytetty koodisivu, ja sitä hiirellä klikaten aukeaa mahdollisuus avata käyttäen jotain muuta koodisivua kuten myös mahdollisuus tallentaa haluamallaan koodisivulla, eikä vaatinut koodin muokkausta.

        Noista virheellisistä merkeistä päätellen avaat tiedostot ISO 8859-4 koodisivua käyttäen. Kun taas minä olen ne tallentanut UTF-8. Jos haluat muuttaa ne Windowsin käyttämään, on sinun avattava tiedosto UTF-8 ja tallennettava käyttämälläsi, ja myös vaihdettava jokaisen tiedoston alussa määritelty koodaus omaasi vastaavaksi. Ja kaikkien tiedostojen tulisi käyttää samaa koodausta.

        Mmm... minulla on ollut kaiken aikaa siellä oikealla alhaalla valittuna UTF-8 ja Python ja olen ajatellut, että se riittää..., että ei tarvitse enää valita UTF-8:n takaa Save with Encoding...

        Näistä alla olevista. Yritän tarjota ensimmäiseen riviin sen tiedostokansion polkua, jossa nämä kyseiset tiedostot työasemallani sijaitsevat. Right? Toiseen riviin yritän tarjota tuota samaa, kuin sinulla. Ja neljänteen aina kyseessä olevaa tiedostoa.

        1 !/usr/bin/env python3
        2 -*- coding: utf-8 -*-
        3#
        4 MainMenu.py


      • Anonyymi kirjoitti:

        Ihan vaan sivuhuomautuksena;

        Visual Studio Code editorin asennus ja poisto olisi jättänyt 4305kpl tarpeetonta tiedosto roskaa järjestelmään.

        No ilmankos koneesta on tullut lievästi sanottuna hidas... No yritän tehdä tämän loppuun sillä ja ehkä vaihdan myöhemmin johonkin toiseen.


    • Anonyymi

      M U U T O K S I A
      Siirsin esimerkit GitHubille. Tein muutoksia luettelon lataus ja tallennus tapahtumiin. Mukana myös "Kirjasto.dat" tiedoston formaattiin, luopumalla binaari muodosta. Nyt teksti muodossa ollessaan avattavissa millä tahansa ohjelmalla jolla muotoilematonta tekstiä pystytään käsittelemään.

      https://github.com/Turpo-Urpo/kirjaluettelo

      • Jaahas..., katson jälleen...

        Otan siis uudet versiot näistä:
        LataaKirjaLuetteloFile,
        TallennaKirjaLuetteloonFile ja
        Kirjasto.dat,

        mutta voinko ladata purkaa sen kirjaluettelo-main.zip:n samaan kansioon näiden muiden kanssa? Kirjoitit, että: "minne haluat", mutta sekoittaako se..., no ehkä ei..., kokeilen!


      • Anonyymi
        Katjaana kirjoitti:

        Jaahas..., katson jälleen...

        Otan siis uudet versiot näistä:
        LataaKirjaLuetteloFile,
        TallennaKirjaLuetteloonFile ja
        Kirjasto.dat,

        mutta voinko ladata purkaa sen kirjaluettelo-main.zip:n samaan kansioon näiden muiden kanssa? Kirjoitit, että: "minne haluat", mutta sekoittaako se..., no ehkä ei..., kokeilen!

        Nyt mukana myös se muokkaus, valikkokohta 2.


      • Anonyymi kirjoitti:

        Nyt mukana myös se muokkaus, valikkokohta 2.

        Nuo alla olevat vielä ottamatta ja kokeilematta. Otan ne tänään, tai viimeistään huomenna. Samoin tuon mainitsemasi: MuokataanKirjaLuetteloaFile

        Jaahas..., katson jälleen...

        Otan siis uudet versiot näistä:
        LataaKirjaLuetteloFile,
        TallennaKirjaLuetteloonFile ja
        Kirjasto.dat,

        mutta voinko ladata purkaa sen kirjaluettelo-main.zip:n samaan kansioon näiden muiden kanssa? Kirjoitit, että: "minne haluat", mutta sekoittaako se..., no ehkä ei..., kokeilen!


      • Anonyymi
        Katjaana kirjoitti:

        Nuo alla olevat vielä ottamatta ja kokeilematta. Otan ne tänään, tai viimeistään huomenna. Samoin tuon mainitsemasi: MuokataanKirjaLuetteloaFile

        Jaahas..., katson jälleen...

        Otan siis uudet versiot näistä:
        LataaKirjaLuetteloFile,
        TallennaKirjaLuetteloonFile ja
        Kirjasto.dat,

        mutta voinko ladata purkaa sen kirjaluettelo-main.zip:n samaan kansioon näiden muiden kanssa? Kirjoitit, että: "minne haluat", mutta sekoittaako se..., no ehkä ei..., kokeilen!

        Niin, eikös tuo lie kokonaisuudessaan valmis, ellei lisää valikkoon uusia toimintoja.


      • Anonyymi
        Katjaana kirjoitti:

        Nuo alla olevat vielä ottamatta ja kokeilematta. Otan ne tänään, tai viimeistään huomenna. Samoin tuon mainitsemasi: MuokataanKirjaLuetteloaFile

        Jaahas..., katson jälleen...

        Otan siis uudet versiot näistä:
        LataaKirjaLuetteloFile,
        TallennaKirjaLuetteloonFile ja
        Kirjasto.dat,

        mutta voinko ladata purkaa sen kirjaluettelo-main.zip:n samaan kansioon näiden muiden kanssa? Kirjoitit, että: "minne haluat", mutta sekoittaako se..., no ehkä ei..., kokeilen!

        Voisihan tuohon päävalikko sivulla lisätä vielä "Tietoja ohjelmasta", jossa olisi mainittu luettelon sisältämä kirjojen määrä.


      • Anonyymi
        Anonyymi kirjoitti:

        Voisihan tuohon päävalikko sivulla lisätä vielä "Tietoja ohjelmasta", jossa olisi mainittu luettelon sisältämä kirjojen määrä.

        Toisaalta oppimisen kannalta ei toisi mitään uusia kuvioita tullessaan, joten ei taida olla tarvetta.


      • Anonyymi
        Anonyymi kirjoitti:

        Toisaalta oppimisen kannalta ei toisi mitään uusia kuvioita tullessaan, joten ei taida olla tarvetta.

        Millä tavalla projektisi on edistynyt?


      • Anonyymi kirjoitti:

        Millä tavalla projektisi on edistynyt?

        Pitääkö GitHubissa olla kirjautuneena, että sieltä löytyy Load-nappi? En ainakaan tunnu löytävän sitä millään... Pastebinissä ei tarvinnut olla...


      • Katjaana kirjoitti:

        Pitääkö GitHubissa olla kirjautuneena, että sieltä löytyy Load-nappi? En ainakaan tunnu löytävän sitä millään... Pastebinissä ei tarvinnut olla...

        Kas löytyi!


      • Anonyymi kirjoitti:

        Millä tavalla projektisi on edistynyt?

        Kaikki haettu vielä uudelleen zip:nä GitHub:sta nyt aamusta. Vaihdettu MainMenussa clear:it cls:ksi, mutta:

        Kaivattiin (Kirjasto.dat) tiedostoa, mutta sitä ei löytynyt.

        Eli mitä siellä aivan MainMenun yläreunassa pitää olla, että se ne tiedostot löytää..., tai siis ainakin MainMenun! En osaa laittaa sitä polkua ilmeisesti oikein tarjolle, vaikka se tuntuu hassulta, kun se ei pitäisi olla se vaikein kohta tässä... Voiko tiedostopolkuni olla liian pitkä??? Tuo alla oleva kokonaisuus siis.

        !/usr/bin/env python3
        -*- coding: utf-8 -*-
        #
        MainMenu.py


      • Anonyymi
        Katjaana kirjoitti:

        Kaikki haettu vielä uudelleen zip:nä GitHub:sta nyt aamusta. Vaihdettu MainMenussa clear:it cls:ksi, mutta:

        Kaivattiin (Kirjasto.dat) tiedostoa, mutta sitä ei löytynyt.

        Eli mitä siellä aivan MainMenun yläreunassa pitää olla, että se ne tiedostot löytää..., tai siis ainakin MainMenun! En osaa laittaa sitä polkua ilmeisesti oikein tarjolle, vaikka se tuntuu hassulta, kun se ei pitäisi olla se vaikein kohta tässä... Voiko tiedostopolkuni olla liian pitkä??? Tuo alla oleva kokonaisuus siis.

        !/usr/bin/env python3
        -*- coding: utf-8 -*-
        #
        MainMenu.py

        Noilla riveillä ei voi olla merkitystä (Kirjasto.dat) tiedoston löytymiseen. Anna niitten olla nyt aluksi sellaisenaan kun ovat.

        Luulen, ettei sinun kannat avata sitä V.S.C -editoria, ennen kuin päästään tästä "Kaivattiin (Kirjasto.dat) tiedostoa ..." virheestä ohi.

        Nimittäin epäilen ettet nyt tee niin kuin GitHubissa ohjeistettiin ohjelma käynnistämään.

        1.) -Lataa kirjaluettelo-main.zip
        2.) -Pura *.zip paketti, minne haluat.
        3.) -Siirry kansioon, johon *.zip paketin purit.
        4.) -Suorita: python MainMenu.py

        Suorittamalla tuon (3) kohdan, tulee siitä kansiosta automaattisesti "TYÖKANSIO", joka tarkoittaa sitä ettei siinä kansiossa oleviin tiedostoihin tarvitse viitata polun-kanssa.

        Ja kohta (4) tulisi ymmärtää niin että komento suoritetaan komentokehotteesta käsin.

        MUTTA
        Jos kohtien 3 ja 4 suorittaminen syystä tai toisesta ei onnistu. Avaa V.S.C -editori, ja yritä MainMenu.py rivillä 17 määritellä absoluuttinen polku tiedoston sijaintiin.


      • Anonyymi kirjoitti:

        Noilla riveillä ei voi olla merkitystä (Kirjasto.dat) tiedoston löytymiseen. Anna niitten olla nyt aluksi sellaisenaan kun ovat.

        Luulen, ettei sinun kannat avata sitä V.S.C -editoria, ennen kuin päästään tästä "Kaivattiin (Kirjasto.dat) tiedostoa ..." virheestä ohi.

        Nimittäin epäilen ettet nyt tee niin kuin GitHubissa ohjeistettiin ohjelma käynnistämään.

        1.) -Lataa kirjaluettelo-main.zip
        2.) -Pura *.zip paketti, minne haluat.
        3.) -Siirry kansioon, johon *.zip paketin purit.
        4.) -Suorita: python MainMenu.py

        Suorittamalla tuon (3) kohdan, tulee siitä kansiosta automaattisesti "TYÖKANSIO", joka tarkoittaa sitä ettei siinä kansiossa oleviin tiedostoihin tarvitse viitata polun-kanssa.

        Ja kohta (4) tulisi ymmärtää niin että komento suoritetaan komentokehotteesta käsin.

        MUTTA
        Jos kohtien 3 ja 4 suorittaminen syystä tai toisesta ei onnistu. Avaa V.S.C -editori, ja yritä MainMenu.py rivillä 17 määritellä absoluuttinen polku tiedoston sijaintiin.

        Mmmm... komentokehoite 'sanoi' kuten alla, vaikka minulla on työasemallani Python 3.8 (32-bit)... kokeilin tuota kehoitetta ensin niin, että minulla ei ollut Python auki ja sitten vielä niin, että se oli auki; ja sama tulos:

        Pythonia ei l÷ytynyt. Asenna se Microsoft Storesta suorittamalla ilman argumentteja tai poista tõmõ pikakuvake kõyt÷stõ kohdasta Asetukset > Hallitse sovellusten suoritustunnuksia.

        No kokeilen vielä siellä V.S.C.:ssä kuten neuvoit ja sitten ehkä yritän päivittää Pythonin, vaikka tuntuu oudolta, että sen mahdollinen uudempi versio ei muka ymmärtäisi tätä...


      • Anonyymi
        Katjaana kirjoitti:

        Mmmm... komentokehoite 'sanoi' kuten alla, vaikka minulla on työasemallani Python 3.8 (32-bit)... kokeilin tuota kehoitetta ensin niin, että minulla ei ollut Python auki ja sitten vielä niin, että se oli auki; ja sama tulos:

        Pythonia ei l÷ytynyt. Asenna se Microsoft Storesta suorittamalla ilman argumentteja tai poista tõmõ pikakuvake kõyt÷stõ kohdasta Asetukset > Hallitse sovellusten suoritustunnuksia.

        No kokeilen vielä siellä V.S.C.:ssä kuten neuvoit ja sitten ehkä yritän päivittää Pythonin, vaikka tuntuu oudolta, että sen mahdollinen uudempi versio ei muka ymmärtäisi tätä...

        Vaikuttaa siltä että käynnistät python komentotulkkin jostakin kuvakkeesta tai valikkovalinnasta. Emme kuitenkaan halua tällä kertaa avata pythonin interaktiivista (vuorovaikutteista) komentotulkkia.

        Tässä on linkki, jossa annetaan 10 erilaista tapaa avata järjestelmän oma komentotulkki, yritä onnistua jollakin niistä, pääsemään komentokehoitteeseen.

        https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/

        Ja kun olet saan komentotulkin auki, tutustu kuinka liikutaan kansiosta toiseen CD -komennon avulla. Tavoitteena on että osaat siirtyä siihen kansioon johon purit *.zip paketin.

        Kun olet luulet päässeesi oikeaan kansioon, suorita (DIR) komento, ja tarkista että kansio tosiaankin sisältää ne samat python tiedostot, kuin *.zip paketissa, eikä mitään muuta.

        Kun tämä onnistuu, aletaan hakemaan millä komennolla käynnistämme python komentotulkkin MainMenu.py tiedoston kanssa.


      • Anonyymi kirjoitti:

        Vaikuttaa siltä että käynnistät python komentotulkkin jostakin kuvakkeesta tai valikkovalinnasta. Emme kuitenkaan halua tällä kertaa avata pythonin interaktiivista (vuorovaikutteista) komentotulkkia.

        Tässä on linkki, jossa annetaan 10 erilaista tapaa avata järjestelmän oma komentotulkki, yritä onnistua jollakin niistä, pääsemään komentokehoitteeseen.

        https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/

        Ja kun olet saan komentotulkin auki, tutustu kuinka liikutaan kansiosta toiseen CD -komennon avulla. Tavoitteena on että osaat siirtyä siihen kansioon johon purit *.zip paketin.

        Kun olet luulet päässeesi oikeaan kansioon, suorita (DIR) komento, ja tarkista että kansio tosiaankin sisältää ne samat python tiedostot, kuin *.zip paketissa, eikä mitään muuta.

        Kun tämä onnistuu, aletaan hakemaan millä komennolla käynnistämme python komentotulkkin MainMenu.py tiedoston kanssa.

        Avaan sen cmd:llä, kuten tuolla yksi vaihtoehdoista oli. Nyt kun kirjoitan

        python3 MainMenu.py:n tilalle
        python MainMenu.py saan tulokseksi:

        python: can't open file 'MainMenu.py': [Errno 2] No such file or directory

        Ja sama tulos vaikka avaan komentotulkin järjestelmänvalvojana. Jatkan ihmettelyä...


      • Anonyymi
        Katjaana kirjoitti:

        Avaan sen cmd:llä, kuten tuolla yksi vaihtoehdoista oli. Nyt kun kirjoitan

        python3 MainMenu.py:n tilalle
        python MainMenu.py saan tulokseksi:

        python: can't open file 'MainMenu.py': [Errno 2] No such file or directory

        Ja sama tulos vaikka avaan komentotulkin järjestelmänvalvojana. Jatkan ihmettelyä...

        Koita antaa polun kanssa

        python3 C:\<polku tähän>\MainMenu.py


      • Anonyymi
        Katjaana kirjoitti:

        Avaan sen cmd:llä, kuten tuolla yksi vaihtoehdoista oli. Nyt kun kirjoitan

        python3 MainMenu.py:n tilalle
        python MainMenu.py saan tulokseksi:

        python: can't open file 'MainMenu.py': [Errno 2] No such file or directory

        Ja sama tulos vaikka avaan komentotulkin järjestelmänvalvojana. Jatkan ihmettelyä...

        Muuten olithan komentoa antaessasi siinä kansiossa, missä tuo MainMenu.py tiedostokin on. Vain silloin tuosta kansiosta muodostuu TYÖKANSIO. Hitto miten vaikea minun on hyväksyä sellaista käsitettä, kuin työkansion puuttuminen.

        Jos se tosiaankin on näin, on polku annettava aina kun johonkin tiedostoon viitataan ja se on kyllä pirunmoinen kiusa.


      • Anonyymi
        Katjaana kirjoitti:

        Avaan sen cmd:llä, kuten tuolla yksi vaihtoehdoista oli. Nyt kun kirjoitan

        python3 MainMenu.py:n tilalle
        python MainMenu.py saan tulokseksi:

        python: can't open file 'MainMenu.py': [Errno 2] No such file or directory

        Ja sama tulos vaikka avaan komentotulkin järjestelmänvalvojana. Jatkan ihmettelyä...

        Et tarvitse järjestelmänvalvojan oikeusia, mutta on erittäin tärkeää että komentotulkin avattuasi siirryt CD komentoja käyttäen siihen samaan kansioon johon purit *.zip paketin ja että vielä varmistat DIR komennolla tiedostojen olevan siinä kansiossa.


      • Anonyymi kirjoitti:

        Muuten olithan komentoa antaessasi siinä kansiossa, missä tuo MainMenu.py tiedostokin on. Vain silloin tuosta kansiosta muodostuu TYÖKANSIO. Hitto miten vaikea minun on hyväksyä sellaista käsitettä, kuin työkansion puuttuminen.

        Jos se tosiaankin on näin, on polku annettava aina kun johonkin tiedostoon viitataan ja se on kyllä pirunmoinen kiusa.

        No niin. Tällaisella komennolla pääsin eteenpäin:

        C:\>python \kirjaluettelo-main\MainMenu.py

        Kopioin siis kirjaluettelo-main-kansion C:n juureen ja olin kyseisessä kansiossa, kun annoin komennon.

        No tämän jälkeen tuli kuitenkin jälleen se ikkuna, jossa: Kaivattiin (Kirjasto.dat) tiedostoa, mutta sitä ei löytynyt -viesti.

        OK-valinnalla pääsee kyseisestä ikkunasta siellä komentotulkissakin eteenpäin ja saan valikon esiin ja siitäkin pääsen valitsemaan, mutta kun se ei jotenkin vieläkään löydä/hyväksy sitä Kirjasto.dat:ia...

        Yritän vielä tänään-huomenna tarjota myös sitä DIR-komentoa.


      • Katjaana kirjoitti:

        No niin. Tällaisella komennolla pääsin eteenpäin:

        C:\>python \kirjaluettelo-main\MainMenu.py

        Kopioin siis kirjaluettelo-main-kansion C:n juureen ja olin kyseisessä kansiossa, kun annoin komennon.

        No tämän jälkeen tuli kuitenkin jälleen se ikkuna, jossa: Kaivattiin (Kirjasto.dat) tiedostoa, mutta sitä ei löytynyt -viesti.

        OK-valinnalla pääsee kyseisestä ikkunasta siellä komentotulkissakin eteenpäin ja saan valikon esiin ja siitäkin pääsen valitsemaan, mutta kun se ei jotenkin vieläkään löydä/hyväksy sitä Kirjasto.dat:ia...

        Yritän vielä tänään-huomenna tarjota myös sitä DIR-komentoa.

        DIR-komennolla löytyy alla olevat tiedostot, eli kyllä se Kirjasto.dat siellä muiden mukana on:



        Directory of C:\kirjaluettelo-main

        07.01.2021 17.45 <DIR> .
        07.01.2021 17.45 <DIR> ..
        06.01.2021 16.18 912 ColorFile.py
        06.01.2021 16.18 2 318 HaetaanKirjaLuettelostaFile.py
        06.01.2021 16.18 741 Kirjasto.dat
        06.01.2021 16.18 627 LataaKirjaLuetteloFile.py
        06.01.2021 17.05 2 391 MainMenu.py
        06.01.2021 16.18 1 595 MuokataanKirjaLuetteloaFile.py
        06.01.2021 16.18 1 315 PoistaKohdeKirjaLuettelostaFile.py
        06.01.2021 16.18 624 README.md
        06.01.2021 16.18 1 145 TallennaKirjaLuetteloFile.py
        06.01.2021 16.18 681 TulostaKirjaLuetteloFile.py
        06.01.2021 16.18 829 UusiKohdeKirjaLuetteloonFile.py
        07.01.2021 17.45 <DIR> __pycache__
        11 File(s) 13 178 bytes
        3 Dir(s) 899 535 982 592 bytes free


      • Anonyymi
        Katjaana kirjoitti:

        No niin. Tällaisella komennolla pääsin eteenpäin:

        C:\>python \kirjaluettelo-main\MainMenu.py

        Kopioin siis kirjaluettelo-main-kansion C:n juureen ja olin kyseisessä kansiossa, kun annoin komennon.

        No tämän jälkeen tuli kuitenkin jälleen se ikkuna, jossa: Kaivattiin (Kirjasto.dat) tiedostoa, mutta sitä ei löytynyt -viesti.

        OK-valinnalla pääsee kyseisestä ikkunasta siellä komentotulkissakin eteenpäin ja saan valikon esiin ja siitäkin pääsen valitsemaan, mutta kun se ei jotenkin vieläkään löydä/hyväksy sitä Kirjasto.dat:ia...

        Yritän vielä tänään-huomenna tarjota myös sitä DIR-komentoa.

        Kun suoritat tällä tavalla, kuten kerroit

        C:\>python \kirjaluettelo-main\MainMenu.py

        on sinun työkansio C:\

        jotta ohjelma toimisi on kaikkien tiedostojen sijaittava työkansiossa. Tämä opastuksen painopiste on siirtymässä käyttöjärjestelmän opastukseksi, ja kuten aiemin sanoin minulla ei ole moneen vuoteen ollut mitään kosketusta windowsiin, olen onnistuneesti unohtanut sen.

        Sinun on syytä kääntyä tällä foorumilla olevien puoleen päästäksesi eteen päin: https://bbs.io-tech.fi/forums/ohjelmointi-pelikehitys-ja-muu-sovelluskehitys.24/


      • Anonyymi kirjoitti:

        Kun suoritat tällä tavalla, kuten kerroit

        C:\>python \kirjaluettelo-main\MainMenu.py

        on sinun työkansio C:\

        jotta ohjelma toimisi on kaikkien tiedostojen sijaittava työkansiossa. Tämä opastuksen painopiste on siirtymässä käyttöjärjestelmän opastukseksi, ja kuten aiemin sanoin minulla ei ole moneen vuoteen ollut mitään kosketusta windowsiin, olen onnistuneesti unohtanut sen.

        Sinun on syytä kääntyä tällä foorumilla olevien puoleen päästäksesi eteen päin: https://bbs.io-tech.fi/forums/ohjelmointi-pelikehitys-ja-muu-sovelluskehitys.24/

        Eikö työkansio ole tässä tapauksessa kirjaluettelo-main? Löysihän komentotulkki hyvin MainMenun:kin, kuten kirjoitin 07.01.2021 klo 18:40.

        Ja tuonne C:n juureen sen kokonaisuuden siirsin (kokeilumielessä) ja sieltä se sen myös löysi (kaikki tiedostot siis, paitsi ei Kirjasto.dat:a). Mietin vielä, että miksi sen Kirjasto.dat-tiedoston pitää olla *.dat? Millä ohjelmalla se olikaan tehty alunperin, jos muuttaisin sen takaisin sellaiseksi? Muutoinhan tuo kokonaisuus näyttää käyvän ja kukkuvan, mutta sitä 'datia' se ei ymmärrä.


      • Anonyymi
        Katjaana kirjoitti:

        Eikö työkansio ole tässä tapauksessa kirjaluettelo-main? Löysihän komentotulkki hyvin MainMenun:kin, kuten kirjoitin 07.01.2021 klo 18:40.

        Ja tuonne C:n juureen sen kokonaisuuden siirsin (kokeilumielessä) ja sieltä se sen myös löysi (kaikki tiedostot siis, paitsi ei Kirjasto.dat:a). Mietin vielä, että miksi sen Kirjasto.dat-tiedoston pitää olla *.dat? Millä ohjelmalla se olikaan tehty alunperin, jos muuttaisin sen takaisin sellaiseksi? Muutoinhan tuo kokonaisuus näyttää käyvän ja kukkuvan, mutta sitä 'datia' se ei ymmärrä.

        Työkansio on se kansio missä sinä komentoja kirjoitat. Työkansion polku näkyy komentokehotteessa (Command Prompt) vilkkuvan kursorin takana. Kun avaat CDM -ikkunan, työkansiosi on luultavasti:

        C:\User\Katjaana

        Sanoit että olet purkanut *.zip paketin (\kirjaluettelo-main\) kansioon. Tuossa ei ollut koko polku, joten oletan sen olevan

        C:\User\Katjaana\kirjaluettelo-main\

        Mikäli arvasin kokopolun oikein vaihdat työkansion näin:

        CD C:\User\Katjaana\kirjaluettelo-main

        Nyt voit varmistaa että tiedostot on siinä samassa kansiossa missä sinäkin:

        DIR

        Ja jos olivat, suoritat komennon:

        python MainMenu.py

        H U O Ml
        Älä sijoita niitä tiedostoja C:\ -aseman juureen, se ei ole niile oikea paikka. Muistelen ettei niitä voi edes ilman ylläpitäjän oikeuksia suorittaa juurikansiossa.


      • Anonyymi kirjoitti:

        Työkansio on se kansio missä sinä komentoja kirjoitat. Työkansion polku näkyy komentokehotteessa (Command Prompt) vilkkuvan kursorin takana. Kun avaat CDM -ikkunan, työkansiosi on luultavasti:

        C:\User\Katjaana

        Sanoit että olet purkanut *.zip paketin (\kirjaluettelo-main\) kansioon. Tuossa ei ollut koko polku, joten oletan sen olevan

        C:\User\Katjaana\kirjaluettelo-main\

        Mikäli arvasin kokopolun oikein vaihdat työkansion näin:

        CD C:\User\Katjaana\kirjaluettelo-main

        Nyt voit varmistaa että tiedostot on siinä samassa kansiossa missä sinäkin:

        DIR

        Ja jos olivat, suoritat komennon:

        python MainMenu.py

        H U O Ml
        Älä sijoita niitä tiedostoja C:\ -aseman juureen, se ei ole niile oikea paikka. Muistelen ettei niitä voi edes ilman ylläpitäjän oikeuksia suorittaa juurikansiossa.

        Ok... tätä pitää kokeilla viikonloppuna. Tosiaan sinne C:n juureen vein kopion kansiosta (jonka sisällä tiedostot), kun en tuntunut sillä CD-komennolla pääsevän eilen vielä sinne, minne halusin. Nyt vain poistan kopion ja jatkan harjoitusta sieltä alkuperäisestä paikkaa.


      • Anonyymi kirjoitti:

        Työkansio on se kansio missä sinä komentoja kirjoitat. Työkansion polku näkyy komentokehotteessa (Command Prompt) vilkkuvan kursorin takana. Kun avaat CDM -ikkunan, työkansiosi on luultavasti:

        C:\User\Katjaana

        Sanoit että olet purkanut *.zip paketin (\kirjaluettelo-main\) kansioon. Tuossa ei ollut koko polku, joten oletan sen olevan

        C:\User\Katjaana\kirjaluettelo-main\

        Mikäli arvasin kokopolun oikein vaihdat työkansion näin:

        CD C:\User\Katjaana\kirjaluettelo-main

        Nyt voit varmistaa että tiedostot on siinä samassa kansiossa missä sinäkin:

        DIR

        Ja jos olivat, suoritat komennon:

        python MainMenu.py

        H U O Ml
        Älä sijoita niitä tiedostoja C:\ -aseman juureen, se ei ole niile oikea paikka. Muistelen ettei niitä voi edes ilman ylläpitäjän oikeuksia suorittaa juurikansiossa.

        Aivan upeaa!

        Herjaa enää clear:sta, eli pitää vielä perata joku niistä cls:ksi. Ei siis enää sitä ongelmaa, että ei löydä Kirjasto.dat:a. Valitsin tosin vasta tuosta valikosta tuon kohdan 5, mutta alla tulos. Nyt pitääkin sitten jatkaa ihailemalla ja ihmettelemällä näitä yksittäisiä koodikokonaisuuksia!

        K I R J A L U E T T E L O N P Ä Ä V A L I K K O
        1. Hae kirjan/kirjailijan nimellä tai vuosiluvulla.
        2. Muokkaa kirjaluettelon merkintää.
        3. Poista kirjaluettelon merkintä.
        4. Lisää kirjaluetteloon merkintä.
        5. Tulosta kirjaluettelo.
        6. Tallenna kirjaluettelo.
        7. Lopetus

        Anna valintasi [1-7] : 5
        'clear' is not recognized as an internal or external command,
        operable program or batch file.

        KIRJA KIRJOITTAJA VUOSI
        Peppi Pitkätossu Astrid Lindgren 1945
        Vaahteramäen Eemeli Astrid Lindgren 1963
        Pikku naisia Louisa M. Alcott 1868
        Annan nuoruusvuodet L. M. Montgomery 1908
        Joulupukin joululoma Mauri Kunnas 2020
        Hurjan hauska unikirja Mauri Kunnas 2019
        Pipsan joulukalenteri Satu Karhu 2019
        Pieni luontokirja Mauri Kunnas 2018
        Mikä tähän kuuluu? 3-4v Reetta Wirtanen 2019


      • Katjaana kirjoitti:

        Aivan upeaa!

        Herjaa enää clear:sta, eli pitää vielä perata joku niistä cls:ksi. Ei siis enää sitä ongelmaa, että ei löydä Kirjasto.dat:a. Valitsin tosin vasta tuosta valikosta tuon kohdan 5, mutta alla tulos. Nyt pitääkin sitten jatkaa ihailemalla ja ihmettelemällä näitä yksittäisiä koodikokonaisuuksia!

        K I R J A L U E T T E L O N P Ä Ä V A L I K K O
        1. Hae kirjan/kirjailijan nimellä tai vuosiluvulla.
        2. Muokkaa kirjaluettelon merkintää.
        3. Poista kirjaluettelon merkintä.
        4. Lisää kirjaluetteloon merkintä.
        5. Tulosta kirjaluettelo.
        6. Tallenna kirjaluettelo.
        7. Lopetus

        Anna valintasi [1-7] : 5
        'clear' is not recognized as an internal or external command,
        operable program or batch file.

        KIRJA KIRJOITTAJA VUOSI
        Peppi Pitkätossu Astrid Lindgren 1945
        Vaahteramäen Eemeli Astrid Lindgren 1963
        Pikku naisia Louisa M. Alcott 1868
        Annan nuoruusvuodet L. M. Montgomery 1908
        Joulupukin joululoma Mauri Kunnas 2020
        Hurjan hauska unikirja Mauri Kunnas 2019
        Pipsan joulukalenteri Satu Karhu 2019
        Pieni luontokirja Mauri Kunnas 2018
        Mikä tähän kuuluu? 3-4v Reetta Wirtanen 2019

        Mmm... V.S.C.:ssä ei sitten jostain syystä jälleen(kään) löydä Kirjasto.dat:a... mutta testailen kokonaisuutta muuten tuolla komentokehotteessa!


      • Katjaana kirjoitti:

        Mmm... V.S.C.:ssä ei sitten jostain syystä jälleen(kään) löydä Kirjasto.dat:a... mutta testailen kokonaisuutta muuten tuolla komentokehotteessa!

        Jahas... siellä on vielä korjattavaa hauissa... ei löydä kirjan nimellä ja kun haluaa hakea vuosiluvulla, niin se kysyykin, että anna kirjailijan nimi ja päin vastoin.


      • Anonyymi
        Katjaana kirjoitti:

        Jahas... siellä on vielä korjattavaa hauissa... ei löydä kirjan nimellä ja kun haluaa hakea vuosiluvulla, niin se kysyykin, että anna kirjailijan nimi ja päin vastoin.

        H I E N O A
        Sinä teit sen, no joo siinä on näköjään mennyt informaatiot ristiin.

        Myös muokkausinformaatio antaa ymmärtää että jos muokkaat listan viimeistä tietuetta, niin muokkaus tallennetaan, senkin voit korjata kertomaan että kaikkia tietueita voit muokata mutta vain listassa viimeiseksi muokattu tietue tallennetaan.


      • Anonyymi kirjoitti:

        H I E N O A
        Sinä teit sen, no joo siinä on näköjään mennyt informaatiot ristiin.

        Myös muokkausinformaatio antaa ymmärtää että jos muokkaat listan viimeistä tietuetta, niin muokkaus tallennetaan, senkin voit korjata kertomaan että kaikkia tietueita voit muokata mutta vain listassa viimeiseksi muokattu tietue tallennetaan.

        Koitan osata korjata ensi viikolla..., mutta saatko sinä haettua kirjoja niiden nimellä, kirjailijan nimellä jne.? Eli se valikon kohta 1.


      • Anonyymi
        Katjaana kirjoitti:

        Koitan osata korjata ensi viikolla..., mutta saatko sinä haettua kirjoja niiden nimellä, kirjailijan nimellä jne.? Eli se valikon kohta 1.

        Valikkokohta 1 on haku kirjan nimellä, ja kun koitin sanalla "joulu" tuli vastaukseksi:


        KIRJA                   KIRJOITTAJA           VUOSI
        Joulupukin joululoma    Mauri Kunnas          2020
        Pipsan joulukalenteri   Satu Karhu            2019


        Paina jotain jatkaaksesi!


      • Anonyymi
        Katjaana kirjoitti:

        Koitan osata korjata ensi viikolla..., mutta saatko sinä haettua kirjoja niiden nimellä, kirjailijan nimellä jne.? Eli se valikon kohta 1.

        Valikkokohta 2 on haku kirjailijan nimellä, ja sitä testasin sanalla "Mauri", ja tulos oli:

        KIRJA                   KIRJOITTAJA           VUOSI
        Joulupukin joululoma    Mauri Kunnas          2020
        Hurjan hauska unikirja  Mauri Kunnas          2019
        Pieni luontokirja       Mauri Kunnas          2018

        Paina jotain jatkaaksesi!


      • Anonyymi kirjoitti:

        Valikkokohta 2 on haku kirjailijan nimellä, ja sitä testasin sanalla "Mauri", ja tulos oli:

        KIRJA                   KIRJOITTAJA           VUOSI
        Joulupukin joululoma    Mauri Kunnas          2020
        Hurjan hauska unikirja  Mauri Kunnas          2019
        Pieni luontokirja       Mauri Kunnas          2018

        Paina jotain jatkaaksesi!

        Ok..., mitäköhän sitten eilen katsoin. Kokeilen uudelleen ja sitten yritän korjata ne ristiin menneet informaatiot.


      • Anonyymi kirjoitti:

        Valikkokohta 2 on haku kirjailijan nimellä, ja sitä testasin sanalla "Mauri", ja tulos oli:

        KIRJA                   KIRJOITTAJA           VUOSI
        Joulupukin joululoma    Mauri Kunnas          2020
        Hurjan hauska unikirja  Mauri Kunnas          2019
        Pieni luontokirja       Mauri Kunnas          2018

        Paina jotain jatkaaksesi!

        En nyt kyllä ymmärrä... ei se hae komentokehoitteessa edelleenkään oikein. Korjasinkohan nyt väärin, kun sitä ristiinmennyttä korjasin, vai jäikö sitten vain joku pieni kohta korjaamatta, vaikka yritin olla tarkkana...


      • Anonyymi
        Katjaana kirjoitti:

        En nyt kyllä ymmärrä... ei se hae komentokehoitteessa edelleenkään oikein. Korjasinkohan nyt väärin, kun sitä ristiinmennyttä korjasin, vai jäikö sitten vain joku pieni kohta korjaamatta, vaikka yritin olla tarkkana...

        Kuvailisitko tarkemmin, onko ongelma vain hakutuloksissa. Toimiiko muokkaus, entä haku muokatusta tietueesta.

        Ilmestyykö kiintolevylle hakusanan annettua, "result" -tiedosto, sisältääkö tiedoston antamasi hakusanan.

        Esiintyykö epämääräisiä merkkejä, onko muita suoritusaikaisia virheitä.

        Oletko koskaan yrittänyt tuottaa python koodia Geany koodieditorin kanssa:
        https://www.geany.org/download/releases/


      • Anonyymi kirjoitti:

        Kuvailisitko tarkemmin, onko ongelma vain hakutuloksissa. Toimiiko muokkaus, entä haku muokatusta tietueesta.

        Ilmestyykö kiintolevylle hakusanan annettua, "result" -tiedosto, sisältääkö tiedoston antamasi hakusanan.

        Esiintyykö epämääräisiä merkkejä, onko muita suoritusaikaisia virheitä.

        Oletko koskaan yrittänyt tuottaa python koodia Geany koodieditorin kanssa:
        https://www.geany.org/download/releases/

        Muut mielestäni toimivat ok, tosin en ihan tarkkaan kaikkea ole vielä testannut, mutta tuo haku ei löydä oikeita tuloksia. Voisiko se vika olla vain siinä, että olen nyt korjannut jotain väärin?

        Jos tuo Geany on hyvä, niin kokeilen sitä jatkossa!


      • Anonyymi
        Katjaana kirjoitti:

        Muut mielestäni toimivat ok, tosin en ihan tarkkaan kaikkea ole vielä testannut, mutta tuo haku ei löydä oikeita tuloksia. Voisiko se vika olla vain siinä, että olen nyt korjannut jotain väärin?

        Jos tuo Geany on hyvä, niin kokeilen sitä jatkossa!

        Antaisitko esimerkin, väärästä hakutuloksesta, käytetty hakusana ja vastaukset sille.

        Kyllä Geany on tutustumisen arvoinen, onko se hyvä; en ota kantaa, sinä päätät mikä sinulle sopii.


      • Anonyymi kirjoitti:

        Antaisitko esimerkin, väärästä hakutuloksesta, käytetty hakusana ja vastaukset sille.

        Kyllä Geany on tutustumisen arvoinen, onko se hyvä; en ota kantaa, sinä päätät mikä sinulle sopii.

        Tosi nätisti se tosiaan antaa päävalikon 5-kohdan: tulosta kirjaluettelo, mutta kun teen esim. Hae kirjan nimellä -haun ja syötän vaikka Peppi Pitkätossu, niin tuossa alla tulos.

        Peppi Pitkätossu
        Traceback (most recent call last):
        File "MainMenu.py", line 61, in <module>
        MainMenu()
        File "MainMenu.py", line 53, in MainMenu
        if valinta == "1": os.system('cls'); HaeMenu()
        File "MainMenu.py", line 30, in HaeMenu
        if valinta == "1": os.system('cls'); HaeKirjanNimella(Lista)
        File "C:\Users\Katjaana\kirjaluettelo-main\HaetaanKirjaLuettelostaFile.py", line 20, in HaeKirjanNimella
        ResultSize = os.path.getsize("result")
        File "C:\Users\Katja\AppData\Local\Programs\Python\Python38-32\lib\genericpath.py", line 50, in getsize
        return os.stat(filename).st_size
        FileNotFoundError: [WinError 2] Määritettyä tiedostoa ei löydy: 'result'


      • Anonyymi
        Katjaana kirjoitti:

        Tosi nätisti se tosiaan antaa päävalikon 5-kohdan: tulosta kirjaluettelo, mutta kun teen esim. Hae kirjan nimellä -haun ja syötän vaikka Peppi Pitkätossu, niin tuossa alla tulos.

        Peppi Pitkätossu
        Traceback (most recent call last):
        File "MainMenu.py", line 61, in <module>
        MainMenu()
        File "MainMenu.py", line 53, in MainMenu
        if valinta == "1": os.system('cls'); HaeMenu()
        File "MainMenu.py", line 30, in HaeMenu
        if valinta == "1": os.system('cls'); HaeKirjanNimella(Lista)
        File "C:\Users\Katjaana\kirjaluettelo-main\HaetaanKirjaLuettelostaFile.py", line 20, in HaeKirjanNimella
        ResultSize = os.path.getsize("result")
        File "C:\Users\Katja\AppData\Local\Programs\Python\Python38-32\lib\genericpath.py", line 50, in getsize
        return os.stat(filename).st_size
        FileNotFoundError: [WinError 2] Määritettyä tiedostoa ei löydy: 'result'

        Yritä katkasta se haku ennen ä -kirjainta. Jos toimii, saattaa olla että sinun on vaihdettava sinne Windowsin käyttämä koodisivu, koska "Zenity For Windows" vai mikä se nyt sinulla oli, ilmeisesti ottaa syötteen vastaan järjestelmän koodisivua käyttäen, ja meidän on mentävä sen mukaan, ellet jostain löydä asetustiedostoa jolla pakotat Zenity samalla koodisivulle.

        Jos virhe on tuo, tulisi sen sekoilla muitakin hakuja tehdessä, jos niihin sisältyy (äöå), pienellä tai isolla kirjoitettuna.


      • Anonyymi
        Katjaana kirjoitti:

        Tosi nätisti se tosiaan antaa päävalikon 5-kohdan: tulosta kirjaluettelo, mutta kun teen esim. Hae kirjan nimellä -haun ja syötän vaikka Peppi Pitkätossu, niin tuossa alla tulos.

        Peppi Pitkätossu
        Traceback (most recent call last):
        File "MainMenu.py", line 61, in <module>
        MainMenu()
        File "MainMenu.py", line 53, in MainMenu
        if valinta == "1": os.system('cls'); HaeMenu()
        File "MainMenu.py", line 30, in HaeMenu
        if valinta == "1": os.system('cls'); HaeKirjanNimella(Lista)
        File "C:\Users\Katjaana\kirjaluettelo-main\HaetaanKirjaLuettelostaFile.py", line 20, in HaeKirjanNimella
        ResultSize = os.path.getsize("result")
        File "C:\Users\Katja\AppData\Local\Programs\Python\Python38-32\lib\genericpath.py", line 50, in getsize
        return os.stat(filename).st_size
        FileNotFoundError: [WinError 2] Määritettyä tiedostoa ei löydy: 'result'

        Yksi tapa selvittää mitä merkistökoodausta järjestelmäsi käyttää, on tehdä suorittaa pieni testi.

        import locale
        print(locale.getpreferredencoding())


      • Anonyymi
        Anonyymi kirjoitti:

        Yksi tapa selvittää mitä merkistökoodausta järjestelmäsi käyttää, on tehdä suorittaa pieni testi.

        import locale
        print(locale.getpreferredencoding())

        Ehkä meidän pitää palata asiaan ensivuonna, kunhan olet kerinnyt päästä sinuksi sen järjestelmäsi kanssa. Sen jälkeen on helpompaa opetella jotain ohjelmointiin liittyvää.


      • Anonyymi kirjoitti:

        Yritä katkasta se haku ennen ä -kirjainta. Jos toimii, saattaa olla että sinun on vaihdettava sinne Windowsin käyttämä koodisivu, koska "Zenity For Windows" vai mikä se nyt sinulla oli, ilmeisesti ottaa syötteen vastaan järjestelmän koodisivua käyttäen, ja meidän on mentävä sen mukaan, ellet jostain löydä asetustiedostoa jolla pakotat Zenity samalla koodisivulle.

        Jos virhe on tuo, tulisi sen sekoilla muitakin hakuja tehdessä, jos niihin sisältyy (äöå), pienellä tai isolla kirjoitettuna.

        Hmm..., se ei onnistu haussaan ilman ääkkösiäkään.


      • Katjaana kirjoitti:

        Hmm..., se ei onnistu haussaan ilman ääkkösiäkään.

        En kyllä ymmärrä, mikä tässä nyt voi olla... jos se sinulla hakee oikein samasta Kirjasto.dat-tiedostosta. Ja hakeehan se minullakin oikein sen luettelon, siinä lukee Peppi Pitkätossukin aivan oikein, mutta sitten, kun aletaan tekemään hakuja, niin sitten ei enää onnistu.


      • Anonyymi kirjoitti:

        Ehkä meidän pitää palata asiaan ensivuonna, kunhan olet kerinnyt päästä sinuksi sen järjestelmäsi kanssa. Sen jälkeen on helpompaa opetella jotain ohjelmointiin liittyvää.

        Tämähän oli sinulta toteutettu ehkäpä hieman liian tasokkaaksi vielä minulle. Minulle olisi varmaan riittänyt sellainen 'perussetti', joka vain hakee, lisää ja poistaa.


    • Anonyymi

      Osaatko ottaa jollakin ohjelmalla kuvakaappauksia, niistä viretilanteista. Yksi kuva puhuu enemmän kuin 1000 sanaa.

      • Anonyymi

        Tai ei sittenkään, älä pistä mitään kuvia jakoon. En ole varma että osaat ottaa kuvakaappaukset niin ettei yksityisyytesi vaarannu. Unohda kuvat, luovutaan mieluummin tästä projektista, kun vaarannetaan sinun verkkoidentiteetti.


      • Anonyymi
        Anonyymi kirjoitti:

        Tai ei sittenkään, älä pistä mitään kuvia jakoon. En ole varma että osaat ottaa kuvakaappaukset niin ettei yksityisyytesi vaarannu. Unohda kuvat, luovutaan mieluummin tästä projektista, kun vaarannetaan sinun verkkoidentiteetti.

        Tämä varmaan poistavat. Minusta jo tilin teko tällaiselle roskasivustolle, joka tienaa leipänsä sillä että käyttäjät haukkuvat ja kiusaavat täällä toisiaan yötä päivää, on erittäin harkitsematonta.


    Ketjusta on poistettu 4 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Mitä ihmettä

      Kaipaat hänessä
      Ikävä
      106
      1864
    2. Välillä käy mielessä

      olisiko sittenkin ollut parempi, että emme koskaan olisi edes tavanneet. Olisi säästynyt monilta kyyneleiltä.
      Ikävä
      81
      1447
    3. Mika Muranen juttu tänään

      Jäi puuttumaan tarkennus syystä teolle. Useat naapurit olivat tehneet rikosilmoituksia tästä kaverista. Kaikki oli Muras
      Sananvapaus
      7
      1441
    4. Oho! Farmi-tippuja Wallu Valpio ei säästele sanojaan Farmi-oloista "Se oli niin luotaantyöntävää..."

      Wallu oikein listaa epämiellyttävät asiat… Monessa realityssä ollut Wallu Valpio ei todellakaan säästele sanojaan tippum
      Tv-sarjat
      13
      1409
    5. Lopeta tuo mun kiusaaminen

      Ihan oikeasti. Lopeta tuo ja jätä mut rauhaan.
      Ikävä
      148
      1362
    6. Kotipissa loppuu

      Onneksi loppuu kotipizza, kivempi sotkamossa käydä pitzalla
      Kuhmo
      23
      1277
    7. Mitä oikein

      Näet minussa? Kerro.
      Ikävä
      93
      1277
    8. Uskoontulo julistetun evankeliumin kautta

      Ja kun oli paljon väitelty, nousi Pietari ja sanoi heille: "Miehet, veljet, te tiedätte, että Jumala jo kauan aikaa sitt
      Raamattu
      647
      1202
    9. Hanna Kinnunen sai mieheltään tiukkaa noottia Tähdet, tähdet -kotikatsomosta: "Hän ei kestä, jos..."

      Hanna Kinnunen on mukana Tähdet, tähdet -kisassa. Ja upeasti Salkkarit-tähti ja radiojuontaja onkin vetänyt. Popedan Lih
      Tv-sarjat
      8
      1088
    10. Helvetin hyvä, että "hullut" tappavat toisensa

      On tämä merkillistä, että yritetään pitää hengissä noita paskaperseitä, joilla ei ole muuta tarkoitusta, kuin olla riida
      Kokkola
      16
      1087
    Aihe