2016-08-20 38 views
0

私はmain.pyからユーザー入力を受け取り、その情報を使ってrunAnalyticsで出力を生成しようとしています。私が実行している問題は、時には、dividen_yieldが利用できないときにユーザ入力がNone(おそらくヌル、私は知らない)の値を生成し、次に私の全プログラムが停止することがあるということです。それは配当利回りがあるときに完璧に動作します。Python Tkinter TypeError: 'int'オブジェクトは呼び出し可能ではありません

main.py

import runAnalytics 
from tkinter import * 
import os 
import centerWindow 

loadApplication = Tk() 
loadApplication.title("Stock Analytics") 
loadApplication.geometry("1080x720") 

label1 = Label(loadApplication, text = "Ticker") 
input1 = Entry(loadApplication) 

loadAnalytics = Button(loadApplication, text = "Load Analytics", command=lambda: runAnalytics.run(input1)) 

centerWindow.center(loadApplication) 


label1.pack() 
input1.pack() 
loadAnalytics.pack() 

loadApplication.mainloop() 

runAnalytics.py

from yahoo_finance import Share 
from tkinter import * 
import os 
import centerWindow 

def run(input1): 
    ticker = Share(input1.get()) 
    loadAnalytics = Tk() 
    loadAnalytics.title("$" + "ticker" + "Data") 
    loadAnalytics.geometry("1080x720") 
    centerWindow.center(loadAnalytics) 

    ticker.refresh() 

    if ticker.get_dividend_yield() is None: 
     ticker.get_dividend_yield == 0 

    share_price = Label(loadAnalytics, text = "Share Price: " + ticker.get_price()).pack() 
    prev_open  = Label(loadAnalytics, text = "Previous Open: " + ticker.get_open()).pack() 
    prev_close  = Label(loadAnalytics, text = "Previous CLose: " + ticker.get_prev_close()).pack() 
    dividend_yield = Label(loadAnalytics, text = "Dividend Yield: " + ticker.get_dividend_yield()).pack() 
    year_low  = Label(loadAnalytics, text = "52 Week Low: " + ticker.get_year_low()).pack() 
    year_high  = Label(loadAnalytics, text = "52 Week High: " + ticker.get_year_high()).pack() 
    volume   = Label(loadAnalytics, text = "Volume: " + ticker.get_volume()).pack() 

    loadAnalytics.mainloop() 

[エラー]

Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\MyName\AppData\Local\Programs\Python\Python35-32\lib\tkinter__init__.py", line 1550, in call return self.func(*args) File "C:\Users\MyName\Documents\Python Projects\DataAnalytics\main.py", line 13, in loadAnalytics = Button(loadApplication, text = "Load Analytics", command=lambda: runAnalytics.run(input1)) File "C:\Users\MyName\Documents\Python Projects\DataAnalytics\runAnalytics.py", line 21, in run dividend_yield = Label(loadAnalytics, text = "Dividend Yield: " + ticker.get_dividend_yield()).pack() TypeError: 'int' object is not callable

答えて

1

私はあなたが得たよりも、あなたのコードを実行しようとしたさまざまなエラーを得た:

Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/tkinter/__init__.py", line 1533, in __call__ 
    return self.func(*args) 
    File "./main.py", line 15, in <lambda> 
    loadAnalytics = Button(loadApplication, text = "Load Analytics", command=lambda: runAnalytics.run(input1)) 
    File "/Users/Sven/temp/stackexchange/python/runAnalytics.py", line 22, in run 
    dividend_yield = Label(loadAnalytics, text = "Dividend Yield: " + ticker.get_dividend_yield()).pack() 
TypeError: Can't convert 'NoneType' object to str implicitly 

だから私は、あなたが得たトレースバックを再現することができませんでしたが、私はPythonのFormat Specification Mini-Languageは(スニペットの直接コピー&ペーストのための二重線のインデント)を与える使用してrunAnalytics.pyファイルにあなたのLabel宣言を変更:

share_price = Label(loadAnalytics,text='Share Price: {}'.format(ticker.get_price())).pack() 
    prev_open  = Label(loadAnalytics,text='Previous Open: {}'.format(ticker.get_open())).pack() 
    prev_close  = Label(loadAnalytics,text='Previous CLose: {}'.format(ticker.get_prev_close())).pack() 
    dividend_yield = Label(loadAnalytics,text='Dividend Yield: {}'.format(ticker.get_dividend_yield())).pack() 
    year_low  = Label(loadAnalytics,text='52 Week Low: {}'.format(ticker.get_year_low())).pack() 
    year_high  = Label(loadAnalytics,text='52 Week High: {}'.format(ticker.get_year_high())).pack() 
    volume   = Label(loadAnalytics,text='Volume: {}'.format(ticker.get_volume())).pack() 

GUI working

:必要に応じて.format()文は目的の文字列出力に、すべての型変換を行いますので、

これが私のシステム上のエラーなしのコードが実行可能に作られました私は解決していなかったラベルのテキストの小さなタイプミスがあることを

注意

+0

が完璧に働いていたこと、どうもありがとう(CLoseCloseする必要があります)。あなたが私に尋ねる気にならないなら、.formatを追加するのはなぜですか?それを行うことによって、何か違うものがコンパイルされていますか? – Andrew

+0

また、私はそれをもう一度実行したが、括弧 "{}"を削除して実行しましたが、何も表示されませんでした。大括弧はなぜ必要なのですか?申し訳ありません、私はちょうど興味があります。 – Andrew

+1

大括弧は、文字列に入力する変数のプレースホルダです。また、文字列に1つ以上の変数を渡すと物がちょっと乱雑になるかもしれません(ドキュメントを見てください)。残念ながら、私はフォーマットミニ言語がどのようにボンネットの下で働いているか完全にはわかりません。しかし、正式な仕様は[PEP 3101](https://www.python.org/dev/peps/pep-3101/)にあります。 – albert

関連する問題