【问题标题】:Python AttributeError: 'str' object has no attribute 'get_price'Python AttributeError:“str”对象没有属性“get_price”
【发布时间】:2016-12-27 02:06:44
【问题描述】:

我正在尝试从 main.py 获取用户输入,然后根据所述用户输入调整输出。我不仅收到此错误,而且似乎我的 runAnalytics 在我启动 main.py 时正在运行,而不是在我点击按钮命令时运行。

main.py

import runAnalytics
import tkinter
import os
import centerWindow

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

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

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

centerWindow.center(loadApplication)

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

loadApplication.mainloop()

runAnalytics.py

from yahoo_finance import Share
import tkinter
import os
import centerWindow

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

    print ("Price per share: " + ticker.get_price())

    ticker.refresh()
    print ("Price per share: " + ticker.get_price())

    print("The dividend yield is: " + ticker.get_dividend_yield())

    print("The 52 week low is: " + ticker.get_year_low())
    print("The 52 week high is: " + ticker.get_year_high())
    print("The volume is: " + ticker.get_volume())

    print("The previous close was: " + ticker.get_prev_close())
    print("The previous open was: " + ticker.get_open())

    loadAnalytics.mainloop()

错误信息:

Traceback(最近一次调用最后一次): 文件“C:\Users\MyName\Documents\Python Projects\MarketData\main.py”,第 13 行,在 loadAnalytics = tkinter.Button(loadApplication, text = "Load Analytics", command = runAnalytics.run(input1)) 运行中的文件“C:\Users\MyName\Documents\Python Projects\MarketData\runAnalytics.py”,第 12 行 print ("每股价格:" +ticker.get_price()) AttributeError: 'str' 对象没有属性 'get_price'

【问题讨论】:

  • 确实很奇怪。可以在前面插入print(type(ticker)) 并分享结果吗?
  • 你的问题在于 Share 没有像你期望的那样返回一个对象,而是一个字符串。这就是python找不到“get_price”属性的原因。
  • 这里引用的def run(input1):的源代码真的和你运行的一模一样吗?看起来Share 对象是str,但考虑到yahoo_finance API,这种情况永远不会发生。
  • 是的,我在这里发布的所有内容都是我正在运行的内容。
  • 我注释掉了所有干扰并添加了“print(type(ticker))”。我收到了这个输出: @Jean-FrançoisFabre

标签: python string tkinter python-3.5 attributeerror


【解决方案1】:

您对runAnalytics 正在运行的假设是正确的,因为该函数是在按照您的方式将其绑定到按钮时执行的。

根据effbot docs,您需要使用lambda 函数才能将带有传递参数的函数绑定到这样的按钮:

import tkinter

def test_func(val):
    print(type(val))
    print(val)
    share_id = val.get()
    print(share_id)


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

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

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


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

loadApplication.mainloop()

但是,要记住第二件事:

input1 = tkinter.Entry(loadApplication)

创建一个名为input1Entry 小部件,然后将其传递给函数。问题是 input1 不包含您在条目小部件中键入的字符串,而是对小部件的引用(小部件 ID)。为了获取小部件的内容,您需要调用它的 .get() 方法,如我的代码 sn-p 所示。

【讨论】:

  • 好的,谢谢!这解决了他们都运行的问题!正如我之前所说,我对此并不陌生。你能解释一下“def test_func(val): print(val)”在做什么吗?
  • 我把它注释掉了,程序仍然运行。
  • 您需要将一个回调函数绑定到一个按钮,只要单击该按钮就会执行该回调函数。由于我需要一个简单的示例回调并且没有在我的系统上安装yahoo_fincance 模块,所以我决定采用这种方式。 porgramm 代码不会像实时重新加载那样“在线”更新。因此,要使任何更改生效,看看您需要启动和重新启动整个脚本有什么不同。
  • 阅读您的编辑后,我将ticker = Share(input1) 更改为ticker = Share(input1.get()),我的问题得到了解决!我希望我能两次支持你的答案。非常感谢,我整天都在做这个,最简单的错误让我束手无策。 @阿尔伯特
猜你喜欢
  • 1970-01-01
  • 2018-12-01
  • 2015-09-30
  • 2021-10-22
  • 2020-09-22
  • 2020-06-25
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多