WebHU - Programozási kérdések és válaszok

Képváltás a tkinter vászonban while ciklusban

A kódom teljes egésze itt.

A tkinter vásznát használva megpróbálok létrehozni egy kis játékot, amely lehetővé teszi az emberek számára, hogy gyakorolják a hangok megtanulását a magas kulcson.

Kezdetben egy véletlenszerű hangjegy jelenik meg, és a felhasználónak ki kell választania a megfelelő hangot. Nem tudom úgy szerkeszteni a vásznat, hogy új jegyzet képe jelenjen meg, ha a tanuló a helyes választ kapta.

Valaki elmagyarázná, hogy mi a probléma a kódommal?

while True:
    randomNote = randint(0, 11)
    path = noteFiles[randomNote]
    correctNote = notes[randomNote]
    img = Image.open(path)
    tk_img = ImageTk.PhotoImage(img)
    canvas.create_image(505, 200, image=tk_img)

    root.mainloop()
    if correctNote == noteChosen:
        ''' User got last note right '''
        canvas.delete("all")

  • A mainloop() hívása utáni kódok nem fognak végrehajtani, amíg a program ki nem lép, ha egyáltalán nem. Gondoskodnia kell arról, hogy a kód a ciklus közben végrehajtására kerüljön – billentyű-összerendelés, command= opció egy gombon, vagy számos más módon. Közel sem adott elég részletet a programjának működéséről ahhoz, hogy konkrét választ kapjon. 29.04.2017
  • Kicsit új vagyok ebben a témában, így nem igazán tudom, mit mondjak, de ha szükséges, megadhatom a kód többi részét. Nem olyan hosszú. 29.04.2017
  • A Tkinter és a while True hurkok nem jönnek ki jól.. 29.04.2017
  • Ha kérdése van az általam megadott kóddal kapcsolatban, nyugodtan tegye fel őket. Olyan sok probléma van a kódban, amelyet meg kell oldani, hogy a magyarázat egy tkinter oktatóanyag megírását eredményezi... Remélem, hogy egy olyan kódrészlettel, amely úgy működik, ahogy szüksége van rá, folytathatja a fejlődést, és saját maga dolgozhatja ki a további részleteket. 29.04.2017

Válaszok:


1

Futtassa az alábbi kódot, és próbálja megérteni, mit és hogyan csinál. Újra és újra megjelenít egy véletlenszerű "jegyzetet" az ötből, amikor megnyomja a megjelenített jegyzet gombját (egyébként kinyomtatja a rosszul kiválasztott jegyzetet, és megvárja, amíg helyesen veszi). Azt hiszem, ez az, amire szüksége van. Saját szkriptelési kísérlete azt mutatja, hogy némi munkát kell végeznie a tkinter mögötti alapvető mechanizmusok megértésében. Olvassa el a megjegyzéseket, hogy megtudja, mi volt a hiba a saját kódolási kísérletében.

Figyelje meg, hogy magának kell bővítenie a szótárakat, hogy a gombok által lefedje a jegyzetek teljes skáláját.

A "rejtett" funkció az, hogy a jobbra mutató nyíl gombbal válthat a következő hangra, ha nem tetszik a megjelenített :D .

from random import randint
from tkinter import *
import tkinter as tk
from PIL import ImageTk, Image

root = Tk()
root.wm_attributes("-topmost", 1)
root.geometry('{}x{}'.format(1100, 720)) # window size
# canvas = Canvas(root, bd=0, highlightthickness=0)
canvas = Canvas(root, width=950, height=700)
# canvas.pack()

def client_exit():
    ''' Quit Button '''
    exit()

def pickNote(value):
    ''' Changes noteChosen var to the note's button pressed '''
    global correctNote
    noteChosen = value 
    if noteChosen == correctNote:
        print("SUCCESS !!!")
        displayRandomNote(None)
    else:
        print( " :( ", noteChosen, " :( ")

# Creates button to exit the program
quitButton = tk.Button(text="Quit", command=client_exit)
quitButton.place(x=480, y=480)

# Creates buttons for various notes
aButton = tk.Button(text="A", command=lambda *args: pickNote("A"))
aButton.config(height=3, width=9)
aButton.place(x=190, y=400)

bButton = tk.Button(text="B", command=lambda *args: pickNote("B"))
bButton.config(height=3, width=9)
bButton.place(x=280, y=400)

cButton = tk.Button(text="C", command=lambda *args: pickNote("C"))
cButton.config(height=3, width=9)
cButton.place(x=370, y=400)

dButton = tk.Button(text="D", command=lambda *args: pickNote("D"))
dButton.config(height=3, width=9)
dButton.place(x=460, y=400)

eButton = tk.Button(text="E", command=lambda *args: pickNote("E"))
eButton.config(height=3, width=9)
eButton.place(x=550, y=400)

fButton = tk.Button(text="F", command=lambda *args: pickNote("F"))
fButton.config(height=3, width=9)
fButton.place(x=640, y=400)

gButton = tk.Button(text="G", command=lambda *args: pickNote("G"))
gButton.config(height=3, width=9)
gButton.place(x=730, y=400)

noteFiles = { 1:'1.png', 2:'2.png',  3:'3.png', 4:'4.png', 5:'5.png' } 
notes     = { 1:'A'    , 2:'B'    ,  3:'C'    , 4:'D'    , 5:'E'     } 

randomNote    = randint(1, 5)
path          = noteFiles[randomNote]
correctNote   = notes[randomNote]
img           = Image.open(path)
tk_img        = ImageTk.PhotoImage(img)
imageOnCanvas = canvas.create_image(130, 150, image=tk_img) # position of image center in window
canvas.pack()

def displayRandomNote(event):

    global canvas
    global imageOnCanvas
    global tk_img
    global correctNote
    global notes
    randomNote  = randint(1, 5)
    path        = noteFiles[randomNote]
    correctNote = notes[randomNote]
    img         = Image.open(path)
    tk_img      = ImageTk.PhotoImage(img)
    canvas.itemconfig(imageOnCanvas, image=tk_img) # change the displayed picture
    canvas.pack()

    # userResponse = input("Which note?\n           ")
    # if userResponse == correctNote:
    #     print("                      SUCCESS :) !!!")
    #     print("(switch focus)")
    # else:
    #     print("                      TRY ANOTHER ONE ...")
    #     print("(switch focus)")

# print("Switch window focus to CONSOLE to input the answer. ")
# print("Swicht window focus to IMAGE (press right arrow key for a Note)")

root.bind('<Right>', displayRandomNote) # on right arrow key display random note

root.mainloop()

KIEGÉSZÍTÉS: A következő dolog, amit ebben a programban végre kell hajtani, az, hogy a jobb gomb megnyomásakor hagyjuk lejátszani a megjelenített hangot.

1.png 2.png 3.png 4.png 5.png

29.04.2017
  • Sikerült beépítenem az általad elmondottakat, de az egyetlen dolog, amit innentől nem tudtam megtenni, az az, hogy ellenőrizhessem, hogy az Ön által választott megjegyzés a helyes válasz volt-e. Megpróbáltam megvalósítani ezt a displayRandomNote függvényben, de nem sikerült. 29.04.2017
  • Egyszer próbáltam bemenetet használni, de megpróbálom újra. Miért nem elegendő a felhasználó által megnyomott gomb alapján választott note változó megváltoztatása a felhasználói bevitelhez? 29.04.2017
  • Bizonyos mértékig működik. Nem jelenít meg semmilyen hibaüzenetet, de amikor beírom a megfelelő megjegyzést, nem írja ki a Sikert úgy, ahogy kellene. Még mindig szeretnék olyan gombokat beépíteni, mint az eredeti kódomban, ha lehetséges. Kezdem azt hinni, hogy ez a projekt egy kicsit túlszárnyalta a fejem, tekintve, hogy általában szívom a programozást, lol 29.04.2017

  • 2

    A grafikus felhasználói felületű programok teljesen eltérően működnek, mint a normál Python-szkriptek.

    A grafikus felhasználói felületek általában eseményhurokban futnak, feldolgozzák az egérkattintásokat, a billentyűk lenyomását és más szintetikus eseményeket. A tkinterben ez a mainloop(). A fő hurok előtt végrehajtott összes kód beállítási kód.

    Amikor a fő hurok fut, a kód egyetlen része, amely ténylegesen lefut, azok a visszahívási függvények, amelyeket definiált és csatolt pl. gombnyomások és egyéb események.

    Tehát csatoljon visszahívást a gombokhoz. Ebben a visszahívásban hasonlítsa össze a kiválasztott hangot a láthatóval. Ha helyes, frissítse a vásznat. Ha nem helyes, mutasson meg egy üzenetablakot.

    Vegye figyelembe, hogy amikor a visszahívás fut, megszakítja az események feldolgozását az eseményhurokban. Tehát a visszahívásoknak gyorsan be kell fejeződniük. Ha egy hosszan tartó számítást kell végrehajtania, apró darabokra vághatja, és végrehajthatja azokat egy időtúllépési eseménykezelőben (a tkinterben after néven), vagy elindíthatja egy külön folyamatban a multiprocessing.Process segítségével. Technikai okokból a threading használata a hosszú távú számításokhoz nem működik jól a CPythonban.

    Az Ön által közzétett kódot nézve ahelyett, hogy az összes gombot külön-külön hozná létre, egy ciklusban hozza létre őket. És azt javaslom, hogy az abszolút elhelyezés helyett használja a pack vagy (lehetőleg) grid gombot a gombok elhelyezéséhez.

    29.04.2017
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..