21 Востаннє редагувалося N1ck (11.08.2017 15:14:08)

Re: Піаніно на python

Є ще таке питання. Як його чітко сформулювати я не знаю. Розпишу як я бачу. Ось я написав симфонію, викорисстовуючу дану програму,все коректно збереглося.
Однак,наприклад,я захотів видалити якусь ноту(і з робочого екрану й з пам’яті). Як це зробити?
Якщо можна просто поясніть,що мені для цього потрібно вивчити,загуглити(я навіть не знаю,що слід гуглити)

22

Re: Піаніно на python

Ну дивіться. У вас є модель (внутрішнє представлення) вашої симфонії одним пальцем по білих клавішах однієї октави - list, і два зовнішніх представлення - ноти на формі та відтворення музики. З другим легше - якщо видалити ноту, то play буде брати всі дані з моделі. Але друге представлення ви формуєте послідовно, функцією add, яка ніде, крім внутрішнього стану форми, не зберігає, що саме вона додала. Отже, вам слід або додати в add збереження зображень нот у відповідний список, або перебирати всі віджети форми функцією winfo_children(), шукати зображення нот і знищувати їх, а потім циклом по нотах симфонії створювати їх заново.

Подякували: N1ck, leofun012

23

Re: Піаніно на python

koala написав:

Ну дивіться. У вас є модель (внутрішнє представлення) вашої симфонії одним пальцем по білих клавішах однієї октави - list, і два зовнішніх представлення - ноти на формі та відтворення музики. З другим легше - якщо видалити ноту, то play буде брати всі дані з моделі. Але друге представлення ви формуєте послідовно, функцією add, яка ніде, крім внутрішнього стану форми, не зберігає, що саме вона додала. Отже, вам слід або додати в add збереження зображень нот у відповідний список, або перебирати всі віджети форми функцією winfo_children(), шукати зображення нот і знищувати їх, а потім циклом по нотах симфонії створювати їх заново.

Відразу питання,що таке модель(внутрішнє представлення) це простіше кажучи код?

24

Re: Піаніно на python

Модель - це дані, що відображають об'єкт моделювання.

Подякували: N1ck, ostap34PHP2

25 Востаннє редагувалося N1ck (20.08.2017 17:00:41)

Re: Піаніно на python

З допомогою було створено наступний код:

from tkinter import *
from PIL import Image, ImageTk
from pygame import mixer
import time
from collections import deque
 
root = Tk()
 
a = int(10)
 
global Mylist 
Mylist = []

def plus():  
    
    global a
    a = int(a)
    a += 30
 
    for y in range(50,150,20): 
        c.create_line(0, y, 500+a, y, width=2,fill="black")

def add_photo(vert,img):
    c.create_image(0+a,vert,image=img,tags = 'image')
 
def play_note(mp3):  
    mixer.init()
    mixer.music.load(mp3)
    mixer.music.play()
    root.after(2000)
    mixer.music.stop()
    
def create_add_note(vert,img,mp3):  
    def add(event): 
        add_photo(vert,img) 
        plus()
        play_note(mp3)  
        Mylist.append(mp3) 
        
    return add
 
def bu(event): 
    root.destroy()

def play(event):
    
    for play_note1 in (Mylist):     
        play_note(play_note1)

selected = None
real_number  = None # Перший всадник апокаліпсису

def canvas_on_click(event):
    global selected,real_number
    
    overlap_items = c.find_overlapping(event.x, event.y, event.x, event.y)
    
    
    overlap_items = list(_id for _id in overlap_items if 'image' in c.gettags(_id))
    number = overlap_items[0] # Продовження жаху
    real_number = (number // 6) - 1 # Id просто кратне 6 і тоді я можу дізнатися порядковий номер ноти
    
    if overlap_items:
        item = overlap_items[0]
        selected = item       
        bbox = c.bbox(item)  
        c.delete('selection')  
        c.create_rectangle(bbox, outline='red', width=2, tags='selection') 
    else:
        selected = None
        c.delete('selection')  

#c.bind('<1>', canvas_on_click)


def remove_selected():
    
    if selected is not None:
        global Myllist
        
        Mylist.pop(real_number) #типу видалення того елементу
        c.delete(selected)  
        c.delete('selection')  

b = Button(root, text='Remove', command=remove_selected)
#b.pack()


c = Canvas(width=500,height=300,bg="white",cursor="pencil")
c.pack()
for y in range(50,150,20):
    c.create_line(0, y, 500, y, width=2,fill="black")

pilImage = Image.open("notaall.png")
DO= ImageTk.PhotoImage(pilImage)
 
pillImageRe = Image.open('notaall.png')
RE = ImageTk.PhotoImage(pillImageRe)
 
scr = Scrollbar(root) 
scr.config(command = c.xview,orient = HORIZONTAL )
scr.pack() 
 
but = Button(root,text='Press to destroy window') 
but.place(x=0,y=0)
but.bind('<Button-1>',bu)

but2 = Button(root,text = 'Press to replay')
but2.place(x =200,y = 0) 
but2.bind('<Button-1>',play)

b.pack()

c.bind('<1>', canvas_on_click)

root.bind('a',create_add_note(140,DO,'1.mp3')) 
root.bind('s',create_add_note(130,RE,'2.mp3'))
          
root.mainloop()

Дайте,будь ласка, магічний пинок в сторону як видалити звук.
Я розумію типу так. Ось я клікнув по ноті. Дізнався,що вона в списку,наприклад 5 й видалив.
Воно то працює(видаляє і ноту і звук ),але так нормальні люди не пишуть