【问题标题】:Python Tkinter TypeError: 'int' object is not callablePython Tkinter TypeError:'int'对象不可调用
【发布时间】:2016-08-20 19:51:50
【问题描述】:

我正在尝试从 main.py 获取用户输入,然后使用该信息在 runAnalytics 上生成输出。我遇到的问题是,有时,当dividen_yield 不可用时,用户输入会产生None 值(可能是null,我不知道),然后我的整个程序将停止。但是,当有股息收益率时,它可以完美运行。

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

[错误]

Tkinter 回调异常 回溯(最近一次通话最后): 调用中的文件“C:\Users\MyName\AppData\Local\Programs\Python\Python35-32\lib\tkinter__init__.py”,第 1550 行 返回 self.func(*args) 文件“C:\Users\MyName\Documents\Python Projects\DataAnalytics\main.py”,第 13 行,在 loadAnalytics = Button(loadApplication, text = "Load Analytics", command=lambda: runAnalytics.run(input1)) 运行中的文件“C:\Users\MyName\Documents\Python Projects\DataAnalytics\runAnalytics.py”,第 21 行 股息收益率=标签(负载分析,文本=“股息收益率:”+ticker.get_dividend_yield()).pack() TypeError: 'int' 对象不可调用

【问题讨论】:

    标签: python tkinter typeerror python-3.5 yahoo-finance


    【解决方案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 声明(双行缩进,用于直接复制和粘贴 sn -p):

        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() 语句会在必要时将所有类型转换为所需的字符串输出:

    请注意,标签文本中有一个小错字,我没有修复(CLose 应该是 Close

    【讨论】:

    • 非常感谢,它完美无缺。如果您不介意我问,为什么添加 .format 有效?这样做有什么不同的编译方式吗?
    • 另外,我再次运行它,但删除了括号“{}”,它执行但没有出现。为什么需要括号?抱歉,我只是好奇。
    • 括号是要填充到字符串中的变量的占位符。您还可以计算或命名那些占位符,当您将多个变量传递到字符串中时,这非常好,事情可能会变得有点混乱(查看文档)。不幸的是,我不完全确定格式迷你语言是如何在幕后工作的。但是,正式的规范可以在PEP 3101中找到
    猜你喜欢
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2012-04-03
    相关资源
    最近更新 更多