Problem z wywołaniem okna Tkinter

Odpowiedz Nowy wątek
2019-02-08 16:36
0

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/downloa[...]cb230bbbe5582059d3f3afe0.html

edytowany 2x, ostatnio: Bartek Pieczka, 2019-02-08 16:41

Pozostało 580 znaków

2019-02-11 17:15
1
superdurszlak napisał(a):
Bartek Pieczka napisał(a):

Tak wygląda ten init.
Krzaczy mu przy wywołaniu img:

window1 = Label(self.window1, background='NavajoWhite3', image=self.img)

Bo tworzysz luźny obiekt window1, a próbujesz odwołać się do niego jak do pola: self.window1

Nie w tym problem, spójrz dwie linie wyżej :)

        self.window1 = Tk()

To już deklarujesz zmienną app.
Teraz usuń te linię którą tu zacytowałem.

Ale to po prostu błąd, jednak nadal nie jest to tym błędem który wyskoczył w interpreterze. Chodzi o obrazek:

Zresztą... Zaimportuj:

from tkinter import *

Wynikowo twój __init__ oraz deklaracja klasy powinna wyglądać tak:

class Okno(Tk.Frame):
    def __init__(self, master):
        super().__init__(self, master)

        self.img = Tk.PhotoImage(file='button_hh.png')
        self.window1 = Label(self, background='NavajoWhite3')
        self.window1.config(image=self.img)
        self.window1.image = self.img #To raczej nie jest potrzebne, ale nie jestem pewny, bo nie pamiętam. Dodaję w razie czego. 
        self.window1.pack(side='right', fill='both', expand='yes')
        self.txt = scrolledtext.ScrolledText(self.window1, width=60, height=53)
        self.txt.grid(column=0, row=1)
        self.yy()
        self.stream.is_active()
        self.xx()

Przy takim wywołaniu:

app = tkinter.Tk()
app.title('Tuner Gitarowy')
app.geometry('1380x855')

o = Okno(app)
app.mainloop()

Mam nadzieję że nigdzie się nie machnąłem, bo przez śledzenie wątku przez tyle wersji, już zacząłem się w tym gubić. Jeśli to nie pomoże, wyślij w załączniku cały plik, poprawię ci go i zaznaczę zmienione fragmenty, dla mojego spokoju ducha :D. I w twoich rękach zostawię czy zrozumiesz dlaczego jedne rzeczy będą tak rozwiązane, a inne inaczej :).


Linux Mint
Arduino / Python 3.5.2
edytowany 2x, ostatnio: Guaz, 2019-02-11 17:17
Uprzedziłeś mnie, właśnie miałem wkleić snippet z PhotoImage(file=file_path) ;) - superdurszlak 2019-02-11 17:19
Też tak często mi się zdarza, odpisuje a tu ktoś już wrzuci rozwiązanie :D - Guaz 2019-02-11 17:22
Najgorzej, jak już poprawiasz ostatnie literówki a tu czerwona jedyneczka w górnym rogu :D - superdurszlak 2019-02-11 17:25

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0