2016-08-20 117 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