Drodzy,
jest kod zawierający klasę Okno(), wewnątrz której (w metodzie ScrolledText) powinien wykonywać się program.
Czy konstrukcja, odwoływania, zagnieżdżenia, typu:
class okno():
def operacja(init, txt):
(...)
def nazwa_notki(n):
def czestotliwosc_na_numer(f):
def numer_na_czestotliwosc(n)
def notka_do_fftbin(n):
(...)
print (...)
while (...)
window1.mainloop()
Mogą być? Jeżeli wszystko się kompiluje, to ciężko mi stwierdzić, gdzie jest problem, że to nie jest wywoływane.
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import pyaudio
from tkinter import scrolledtext
from tkinter import *
from PIL import ImageTk, Image
class okno():
window1 = Tk()
window1.title('Tuner Gitarowy')
window1.geometry('1380x855')
img = ImageTk.PhotoImage(Image.open('z_gitara.png'))
window1 = Label(window1, background='NavajoWhite3', image=img)
window1.pack(side='right', fill='both', expand='yes')
txt = scrolledtext.ScrolledText(window1, width=60, height=53)
txt.grid(column=0, row=1)
def operacja(init, txt):
FSAMP = 22050 # czestotliwosc probkowania w Hz
ROZMIAR_PROB = 2048 # ilosc probek
KLATEK_NA_FFT = 16 # ilosc klatek zajmujacych srednio przez szybka transformate fouriera
NOTKA_MIN = 40 # E2
NOTKA_MAX = 64 # E4
# dla wyswietlenia nazw dzwieku
NOTACJA = 'E F F# G G# A A# B C C# D D#'.split()
# nowe dzwieki
PROBKI_NA_FFT = ROZMIAR_PROB * KLATEK_NA_FFT
KROK_CZESTOTLIWOSCI = float(FSAMP) / PROBKI_NA_FFT
def nazwa_notki(n):
return NOTACJA[n % NOTKA_MIN % len(NOTACJA)] + str(int(n / 12 - 1))
def czestotliwosc_na_numer(f):
return 64 + 12 * np.log2(f / 329.63)
def numer_na_czestotliwosc(n):
return 329.63 * 2.0 ** ((n - 64) / 12.0)
# pobranie minumalnego\maksymalnego nr indeksu z szybkiej transformaty fouriera
def notka_do_fftbin(n):
return numer_na_czestotliwosc(n) / KROK_CZESTOTLIWOSCI
imin = max(0, int(np.floor(notka_do_fftbin(NOTKA_MIN - 1))))
imax = min(PROBKI_NA_FFT, int(np.ceil(notka_do_fftbin(NOTKA_MAX + 1))))
# Przydzial przestrzeni aby uruchomic szybka transformate fouriera
buf = np.zeros(PROBKI_NA_FFT, dtype=np.float32)
numer_klatki = 0
# inicjalizacja dzwieku
stream = pyaudio.PyAudio().open(format=pyaudio.paInt16, channels=1, rate=FSAMP, input=True, frames_per_buffer=ROZMIAR_PROB)
stream.start_stream()
# tworzenie funkcji Hanninga
window = 0.5 * (1 - np.cos(np.linspace(0, 2 * np.pi, PROBKI_NA_FFT, False)))
# wypisanie poczatkowego tekstu
print('pobieranie probek w:', FSAMP, 'Hz z maksymalna rozdzielczoscia', KROK_CZESTOTLIWOSCI, 'Hz')
# otrzymywane dane w czasie:
while stream.is_active(txt):
# przesuwanie bufora i wprowadzenie nowych danych
buf[:-ROZMIAR_PROB] = buf[ROZMIAR_PROB:]
buf[-ROZMIAR_PROB:] = np.fromstring(stream.read(ROZMIAR_PROB), np.int16)
# Uruchom szybka transformate fouriera na okiennym buforze
fft = np.fft.rfft(buf * window)
# pobierz czestotliwosc maksymalnej wartosci z zakresu
czestotliwosc = (np.abs(fft[imin:imax]).argmax() + imin) * KROK_CZESTOTLIWOSCI
# pobierz numer notatki i najblizsza notatke
n = czestotliwosc_na_numer(czestotliwosc)
n0 = int(round(n))
# dane wyjsciowe konsoli, gdy mamy pelny bufor
numer_klatki += 1
txt.insert(INSERT, 'Numer: {:7.2f} Wysokosc: {:7.2f} Hz Nota: {:>3s} {:+.2f}'.format(n, czestotliwosc, nazwa_notki(n0), n - n0))
window1.mainloop()
Udostępniam paczkę z kodem, chodzi o "Guitar.py", python, jakiego używam do kompilacji jest w wersji 2.7
https://megawrzuta.pl/download/290e41fecb230bbbe5582059d3f3afe0.html