2016-08-20 173 views
0

我想從main.py獲取用戶輸入,然後使用該信息在runAnalytics上產生輸出。我遇到的問題是,有時,當dividen_yield不可用時,用戶輸入的值將爲None(可能爲null,我不知道),然後我的整個程序將停止。儘管有股息收益,但它完美地工作。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捐贈(雙行縮進的片段直接複製和粘貼)改變了你的Label聲明中runAnalytics.py文件:

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() 

這使得代碼可運行沒有任何錯誤,我的系統上,因爲.format()聲明確實必要時所有類型轉換爲所需的字符串輸出:

GUI working

注意,沒有在標籤的文本中的小錯字,我沒修好(CLose應該Close

+0

太感謝你了,那完美無缺。如果你不介意我問,爲什麼添加.format工作?這樣做是不同的編譯方式? – Andrew

+0

另外,我再次運行它,但刪除了括號「{}」,它執行但沒有出現。爲什麼需要括號?對不起,我只是好奇。 – Andrew

+1

括號是要填充到字符串中的變量的佔位符。你也可以計算或命名那些非常好的佔位符,當你將一個以上的變量傳遞給一個字符串時,事情可能會變得有點混亂(看看文檔)。不幸的是,我不完全確定格式迷你語言是如何工作的。然而,正式的規範可以在[PEP 3101](https://www.python.org/dev/peps/pep-3101/) – albert