質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Python

    7996questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Pythonでtkinterに関数を用いたときのエラー

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 482

gymgym

score 67

def fft(data, N, fs, fc1, fc2, numtaps):
        spectrum_list = []
        freq01_list = []
        dt = 1 / fs  # サンプリング間隔
        t = np.arange(0, N*dt, dt) # 時間軸
        nyq = 1 / (2*dt)    # ナイキスト周波数
        freq = np.linspace(0, 1.0/dt, N) # 周波数軸

        b = scipy.signal.firwin(numtaps, [fc1, fc2], pass_zero=False, nyq=nyq)

        # scipyによるFIRフィルタ
        data = scipy.signal.lfilter(b, 1, data)

        sample_freq = fftpack.fftfreq(data.size, d=dt)  # Hz:フーリエ変換の横軸
        data_fft = fftpack.fft(data)  # フーリエ変換
        s_power = np.abs(data_fft)
        pidxs = np.where(sample_freq > 0)  # プラスだけ抽出
        freqs, power = sample_freq[pidxs], np.abs(data_fft)[pidxs]
        freq_list = freq[23:146:4]
        spe = s_power[23:146:4] # 特徴量

        theta01 = s_power[22:36]
        alpha01 = s_power[45:55]
        beta01 = s_power[78:94]

        spectrum = [theta01,alpha01,beta01]

        return(spectrum)

def show_selection(x, y):
    for i in lb.curselection():
        if i == 0:
            one = sum(x)
            zero = len(x) - sum(x)
            if one < zero:
                label.config(text="OK")
        elif i == 1:
            one = sum(y)
            zero = len(y) - sum(y)
            if one > zero:
                label.config(text="BAD")

if __name__ == '__main__':
    root = Tk()
    root.title('Scrollbar 1')

    # Frame
    frame1 = ttk.Frame(root, padding=10)
    frame1.grid()

    # Listbox
    currencies = ("A", "B")
    v1 = StringVar(value=currencies)
    lb = Listbox(frame1, listvariable=v1,height=3)
    lb.grid(row=0, column=0)

    # Label (新規追加)
    label = Label(frame1, width=18)
    label.grid(row=1, column=0, columnspan=2)

    # Scrollbar
    scrollbar = ttk.Scrollbar(
        frame1,
        orient=VERTICAL,
        command=lb.yview)
    lb['yscrollcommand'] = scrollbar.set
    scrollbar.grid(row=0,column=1,sticky=(N,S))

    a = [0,0,0,0,1,1,1]
    b = [1,1,1,1,1,0,0]

    a = fft(a,len(a), 125, 4, 30, 255)

    #Button
    button1 = ttk.Button(frame1, text='OK', command=lambda: show_selection(a,b))
    button1.grid(row=2, column=0, columnspan=2)

    root.mainloop()


以上のコードを実行すると、エラーがでました。

2017-12-15 17:20:20.425 python[27614:569403] -[NSApplication _setup:]: unrecognized selector sent to instance 0x7fa882dd7da0
2017-12-15 17:20:20.433 python[27614:569403] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSApplication _setup:]: unrecognized selector sent to instance 0x7fa882dd7da0'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fffb68a32cb __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x00007fffcb6bb48d objc_exception_throw + 48
    2   CoreFoundation                      0x00007fffb6924f04 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
    3   CoreFoundation                      0x00007fffb6815755 ___forwarding___ + 1061
    4   CoreFoundation                      0x00007fffb68152a8 _CF_forwarding_prep_0 + 120
    5   Tk                                  0x00000001019b1c02 TkpInit + 471
    6   Tk                                  0x000000010192d2a9 Tk_Init + 1794
    7   _tkinter.cpython-36m-darwin.so      0x0000000101806da4 Tcl_AppInit + 84
    8   _tkinter.cpython-36m-darwin.so      0x0000000101806a7b _tkinter_create + 1115
    9   libpython3.6m.dylib                 0x00000001011014b1 _PyCFunction_FastCallDict + 497
    10  libpython3.6m.dylib                 0x00000001011831e7 call_function + 439
    11  libpython3.6m.dylib                 0x000000010117f992 _PyEval_EvalFrameDefault + 27346
    12  libpython3.6m.dylib                 0x0000000101183c4f _PyEval_EvalCodeWithName + 2447
    13  libpython3.6m.dylib                 0x0000000101184802 _PyFunction_FastCallDict + 738
    14  libpython3.6m.dylib                 0x00000001010b8cf7 _PyObject_FastCallDict + 247
    15  libpython3.6m.dylib                 0x00000001010b8e15 _PyObject_Call_Prepend + 149
    16  libpython3.6m.dylib                 0x00000001010b8b30 PyObject_Call + 96
    17  libpython3.6m.dylib                 0x000000010111959d slot_tp_init + 125
    18  libpython3.6m.dylib                 0x00000001011158d9 type_call + 313
    19  libpython3.6m.dylib                 0x00000001010b8cc5 _PyObject_FastCallDict + 197
    20  libpython3.6m.dylib                 0x00000001011830e8 call_function + 184
    21  libpython3.6m.dylib                 0x000000010117f992 _PyEval_EvalFrameDefault + 27346
    22  libpython3.6m.dylib                 0x0000000101183c4f _PyEval_EvalCodeWithName + 2447
    23  libpython3.6m.dylib                 0x0000000101178e04 PyEval_EvalCode + 100
    24  libpython3.6m.dylib                 0x00000001011aeab1 PyRun_FileExFlags + 209
    25  libpython3.6m.dylib                 0x00000001011ae263 PyRun_SimpleFileExFlags + 851
    26  libpython3.6m.dylib                 0x00000001011c70d9 Py_Main + 3529
    27  python                              0x00000001010a7df8 main + 232
    28  libdyld.dylib                       0x00007fffcbfa1235 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
Abort trap: 6


上記のエラーの内容がなにが間違っているのかわかりません。
fft関数をmainの中で実行しようとするとでてきます。

tkinterと関数を使うときは、注意しなければいけない点があるのでしょうか。

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

aの書き換えがまずいのではないでしょうか。

    a = [0,0,0,0,1,1,1] <-
    b = [1,1,1,1,1,0,0]

    a = fft(a,len(a), 125, 4, 30, 255) <-

    #Button
    button1 = ttk.Button(frame1, text='OK', command=lambda: show_selection(a,b))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/18 15:59

    回答ありがとうございます。
    ご指摘のとおりになおしても同じエラーがでてしまいました。

    キャンセル

  • 2017/12/18 16:04

    例えば、
    a = [0,0,0,0,1,1,1]
    b = [1,1,1,1,1,0,0]
    c = fft(a,len(a), 125, 4, 30, 255)
    としてもエラーになったということですか?

    キャンセル

  • 2017/12/18 16:06

    はい。
    まさに、そのとおりにして同じエラーがでました。

    キャンセル

  • 2017/12/18 16:28

    一応確認ですが、
    #c = fft(a,len(a), 125, 4, 30, 255)
    ならば、正常に走るという意味で、fftを使うとエラーが出るということですか?

    キャンセル

  • 2017/12/18 16:35

    そういうことです。fftがエラーの原因みたいです。
    また、fft自体はエラーがでず、正常に動きます。

    キャンセル

  • 2017/12/18 18:04

    難解な振る舞いですね。
    pythonは比較的メモリが安全な言語なので、変数に想定外の操作がなされない限り、リークによってバグが生じることは考え難いのですが。
    どこでエラーが出たのかを確かめるために、以下のよう絞り込むことが考えられます。

    ものは試しですが、fftを実行したことによってのエラーかどうかを確かめるために、
    button1 = ttk.Button(frame1, text='OK', command=lambda: show_selection(a,b))
    c = fft(a,len(a), 125, 4, 30, 255)
    のようにttk.Buttonの後にfftをコールした場合どうなるのかを確かめると何かの情報が得られるかもしれません。
    エラーが出る限り、fftの実行を遅らせていき、最終的に
    root.mainloop()
    の後まで遅らせることで、どこでコールされるとエラーが出るのかを試すことができます。

    キャンセル

  • 2017/12/18 18:08

    ありがとうございます。やってみます。

    キャンセル

  • 2017/12/18 18:15

    またfftに渡したa=dataに何か悪さがされた可能性を排除するために
    data_ = scipy.signal.lfilter(b, 1, data)
    のようにdata_という別の変数名を使うことも考えられます。
    もっとも、これは
    button1 = ttk.Button(frame1, text='OK', command=lambda: show_selection(a,b))
    の前に一度
    print(a)
    することで、確かめられそうです。

    root.mainloop()
    に入ってメインループが回り始めてから、変数がどのように処理されているのかがポイントになるかと思われます。
    特に、最初に、
    command=lambda: show_selection(a,b)
    が実行された後で、ボタンをクリックした際にどの変数のポインタを見ているのかが気になるところです。
    これは、fftをコメントアウトしてから、
    def show_selection(x, y)
    の直後に、
    print(id(x), id(y))
    をすることによって、ポインタの変更を確認することができます。
    もしかしたら、出力が結構増えるかもしれませんが…

    キャンセル

  • 2017/12/18 23:08

    手元で環境を整えてから上記のコードを実行したところ、エラーが再現できませんでした。(正常に実行されました)
    pythonやtkのバージョンおよびOSの種類・バージョンを確認していただけますか?

    キャンセル

  • 2017/12/19 11:49

    version
    Python : 3.6.1 :: Anaconda custom (x86_64)
    tkinter : 8.5
    OS : macOS 10.12.6 です。

    キャンセル

  • 2017/12/19 17:42

    あまり考えたくないことですが、tkinterのバージョンがPythonとうまくかみ合っていない可能性があります。
    Homebrewなどでtkinterを最新のものにした後にPythonを再インストールすることでうまくいく可能性があります。

    https://teratail.com/questions/105521

    キャンセル

  • 2017/12/19 18:10

    何回かうまく実行できたのですが、再インストールしたほうがよさそうですか。

    キャンセル

  • 2017/12/19 20:12

    tkinter8.5の時代にMacの方でいろいろと実装のバグがあったらしく、そのとばっちりを受けている可能性があります。
    異なるライブラリ間の連携でのバグのため、修正することは難しく、新バージョンの使用が推薦されています。
    バグが生じたとき、いちいち疑わないといけないので、精神衛生上再インストールするほうがよいように思えます。
    ただ、付随するpythonのライブラリなど、いろいろと面倒なことが多そうなので、それらの間の天秤ですね。

    バグった機能は取り除いて、今あるものをとにかく動くすることが最優先のパターンもありますし、時間があるから再インストールしてすっきりしてしまえばもう考えなくて済むパターンもありますし。

    pythonの方の再インストールはpyenvなどを使えば、今使っているものをアンインストールせずに済むので、検討の余地があります。

    https://github.com/Homebrew/legacy-homebrew/issues/25974
    https://stackoverflow.com/questions/34805032/tkinter-scrollbar-bug-on-mac-with-activetcl-8-5-18
    https://qiita.com/MasatoKawakami/items/f441b022ce0c495c1752

    キャンセル

  • 2017/12/20 11:11

    pyenvを使ってバージョンを変えることで実行できるようになりました。
    丁寧にアドバイスしてくださりありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7996questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。