Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import wx
- from winsound import Beep
- class MyFrame(wx.Frame):
- # Создаём список нот, который понадобится во время работы с кнопками
- notes_list = ['C', 'Cs', 'D', 'Ds', 'E', 'F', 'Fs', 'G', 'Gs', 'A', 'As', 'B']
- # создаём список, где будут кнопки
- buttons_list = []
- # Список частот малой октавы для подстановки в методы
- KO_frequencies_list = [131, 138, 148, 155, 165, 174, 185, 196, 207, 220, 233, 247]
- # Создаём список кодов 12 клавиш малой октавы
- KO_codes_list = [85, 73, 79, 80, 74, 75, 76, 59, 77, 44, 46, 47]
- # чтобы каждый раз при срабатывании события не вычислять
- # и не тратить время
- # делаем это заранее
- codes_and_frequencies = dict(zip(KO_codes_list, KO_frequencies_list))
- notes_and_frequencies = dict(zip(notes_list, KO_frequencies_list))
- def __init__(self, parent, title=''):
- super().__init__(parent, title=title)
- self.panel = wx.Panel(self, wx.ID_ANY)
- self.sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
- self.sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
- self.panel.SetSizer(self.sizer_2)
- # создаём кнопки
- for note in self.notes_list:
- self.buttons_list.append(wx.Button(
- self.panel,
- wx.ID_ANY,
- note
- ))
- self.buttons_list[-1].SetName(note)
- self.sizer_2.Add(self.buttons_list[-1])
- self.buttons_list[-1].Bind(wx.EVT_BUTTON, self.OnPlayK)
- self.Layout()
- # Привязываем обработчики событий нажатия клавиш малой октавы
- for elem in [self, self.panel]+self.buttons_list:
- elem.Bind(wx.EVT_KEY_DOWN, self.OnKeyDownK)
- # ***
- # Создаём метод
- def OnPlayK(self, event):
- event.Skip()
- note = event.GetEventObject().GetName()
- if note not in self.notes_and_frequencies:
- print("Нота {} ещё не добавлена".format(note))
- return
- Beep(self.notes_and_frequencies[note], 300)
- # ***
- # Создаём метод обработки клавиш
- def OnKeyDownK(self, event):
- event.Skip()
- key = event.GetKeyCode()
- if key not in self.codes_and_frequencies:
- print("Клавиша с кодом №{} ещё не добавлена".format(key))
- return False
- Beep(self.codes_and_frequencies[key], 300)
- class MyApp(wx.App):
- def OnInit(self):
- self.frame = MyFrame(None, 'Синтезатор "Двойная дюжина"')
- self.frame.Centre()
- self.SetTopWindow(self.frame)
- self.frame.Show()
- self.frame.panel.SetFocus()
- return True
- if __name__ == "__main__": app = MyApp(); app.MainLoop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement