Partage
  • Partager sur Facebook
  • Partager sur Twitter

liste de boutons tkinter

    19 novembre 2024 à 9:48:00

    bonjour, je suis débutant dans le développement. et je me suis lancé le défi de créer un lecteur de musique. et pour ça j'utilise tkinter dans lequel je créer des bouton associés aux musiques que j'ai rentré dans une liste. or lorsque j'appuie sur n'importe quel bouton, la dernière musique se lance

    paths = str(Path(__file__).parent)
    
    musics = []
    for i in (Path(paths + "\\musiques").glob('*.wav')):
        musics.append(i)
    
    musics_boutons = []
    
    def son(a):
        PlaySound(str(musics[a]),SND_ASYNC)
    
    
    for i in musics:
        name = extract_name(str(i))
        musics_boutons.append(Button(window,text=name, font=("Courrier",15) ,command = lambda : son(musics.index(i)),width=50,height=1,anchor="w",border=0))
    



    • Partager sur Facebook
    • Partager sur Twitter
      19 novembre 2024 à 10:28:11

      Bonjour,

      Un exemple de code qui créé des boutons dans une boucle

      Et chaque bouton lance une fonction avec un argument différent, un peu comme toi avec ta fonction son():

      # -*- coding:Latin-1 -*-
      # 14/10/2021 16:41:51
      
      # do ré mi fa sol la si
      # C  D  E  F  G   A  B
      
      from tkinter import *
      import winsound
      import os
      
      def play_note(wave_file):
          ''' Plays a single note '''
      
          winsound.PlaySound(wave_file,winsound.SND_ASYNC)
      
      treble = {'do':'c4.wav', 're':'d4.wav', 'mi':'e4.wav', 'fa':'f4.wav', 'sol':'g4.wav', 'la':'a5.wav', 'si':'b5.wav', 'do2':'c5.wav'}
      treble_sharp = {'do#':'c-4.wav', 're#':'d-4.wav', 'fa#':'f-4.wav', 'sol#':'g-4.wav', 'la#':'a-5.wav'}
      bass = {'do':'c3.wav', 're':'d3.wav', 'mi':'e3.wav', 'fa':'f3.wav', 'sol':'g3.wav', 'la':'a4.wav', 'si':'b4.wav'}
      bass_sharp = {'do#':'c-3.wav', 're#':'d-3.wav', 'fa#':'f-3.wav', 'sol#':'g-3.wav', 'la#':'a-4.wav'}
      
      pos = {'do#':68, 're#':123, 'fa#':233, 'sol#':288, 'la#':343}
      
      WIDTH, HEIGHT = 900, 375
      xc, yc = 30, 30
      xpitch = 55
      rw, rh = 6, 16
      sw, sh = 3, 7
      
      main_win = Tk()
      main_win.configure(background = 'ivory')
      main_win.title('Piano')
      main_win.geometry(str(WIDTH)+'x'+str(HEIGHT)+'+300+100')
      
      os.chdir('C:\\Phil\\Dev\\Python\\projects\\piano\\wave')
      
      #bass clef
      #regular notes
      for key, note in bass.items():
          b = Button(main_win, width = rw, height = rh, text=key, command=lambda k=note : play_note(k))
          b.place(x=xc, y=yc)
          xc += xpitch
      
      #sharp notes
      for key, note in bass_sharp.items():
          b = Button(main_win, bg = 'black', fg = 'white', width = sw, height = sh, text=key, command=lambda k=note : play_note(k))
          b.place(x=pos[key], y=yc)
      
      #treble clef
      #regular notes
      for key, note in treble.items():
          b = Button(main_win, width = rw, height = rh, text=key, command=lambda k=note : play_note(k))
          b.place(x=xc, y=yc)
          xc += xpitch
      
      #sharp notes
      for key, note in treble_sharp.items():
          b = Button(main_win, bg = 'black', fg = 'white', width = sw, height = sh, text=key, command=lambda k=note : play_note(k))
          b.place(x=pos[key]+383, y=yc)
      
      main_win.mainloop()
      



      -
      Edité par Phil_1857 19 novembre 2024 à 10:29:46

      • Partager sur Facebook
      • Partager sur Twitter
        19 novembre 2024 à 12:53:36

        donc a priori, la seule chose à changer serait la façon d'associer ta fonction:

        ...
        musics_boutons.append(Button(window,text=name, font=("Courrier",15) ,command = lambda k=musics.index(i): son(k),width=50,height=1,anchor="w",border=0))



        • Partager sur Facebook
        • Partager sur Twitter
          19 novembre 2024 à 16:42:10

          plus simplement, ligne15: ..., command = lambda i=i: son(musics.index(i)), ...

          Un bout de code tel que:

          for i in musics:
              name = extract_name(str(i))
              musics_boutons.append(Button(window,text=name, font=("Courrier",15) ,command = lambda : son(musics.index(i)),width=50,height=1,anchor="w",border=0))
          


          pourrait s'écrire:

          kws = dict(font=("Courrier",15), width=50,
                     height=1, anchor="w", border=0,
                     )
          
          for i, path in enumerate(musics):
              b = Button(window, kws,
                        text=path.stem,
                        command = lambda i=i: son(i),
                  )
              musics_boutons.append(b)

          n'oubliez pas que coder c'est passer pas mal de temps à se relire pour vérifier que ce qu'on a écrit est bien ce qu'on voulait. Et au plus vous écrirez de lignes inutiles au plus ce sera galère à relire/corriger.

          -
          Edité par mps 19 novembre 2024 à 17:44:08

          • Partager sur Facebook
          • Partager sur Twitter

          liste de boutons tkinter

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          • Editeur
          • Markdown