2016-08-19 128 views
0

我试图从main.py获取用户输入,然后将输出定制到所述用户输入。我不仅得到这个错误,而且似乎我的runAnalytics正在运行,当我启动main.py时,而不是当我点击按钮命令时这样做。Python AttributeError:'str'对象没有属性'get_price'

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 (most recent call last): File "C:\Users\MyName\Documents\Python Projects\MarketData\main.py", line 13, in loadAnalytics = tkinter.Button(loadApplication, text = "Load Analytics", command = runAnalytics.run(input1)) File "C:\Users\MyName\Documents\Python Projects\MarketData\runAnalytics.py", line 12, in run print ("Price per share: " + ticker.get_price()) AttributeError: 'str' object has no attribute 'get_price'

+1

确实很奇怪。你可以在前面插入'print(type(ticker))'并分享结果吗? –

+0

你的问题是与共享谁没有返回一个对象,如你所期望的,但一个字符串。这就是为什么python无法找到“get_price”属性的原因。 –

+0

'def run(input1):'这里引用的代码与你运行的真的完全一样吗?看起来'Share'对象是'str',但这绝对不会发生在给予'yahoo_finance' API的情况下。 – Messa

回答

2

因为结合时,它执行的功能您的假设runAnalytics运行是正确的按照你做的方式按钮。

根据您需要使用顺序lambda功能的功能绑定中传递给这样的按钮effbot docs

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) 

创建Entry插件称为input1,然后将其传递给函数。事情是,input1不包含您输入到条目窗口小部件中的字符串,而是包含对窗口小部件(窗口小部件ID)的引用。为了获得小部件的内容,您需要调用它的.get()方法,如我的代码片段所示。

+0

好的,谢谢!这解决了他们都在运行的问题!正如我刚才所说,我是这个新手。你能解释一下“def test_func(val):print(val)”在做什么吗? – Andrew

+0

我评论说,程序仍然运行。 – Andrew

+0

您需要将回调函数绑定到单击按钮时执行的按钮。由于我需要一个简单的示例回调,并且没有在系统上安装'yahoo_fincance'模块,我决定采用这种方式。 porgramm代码不会像在线重新加载那样'在线'更新。因此,要进行任何更改,查看您需要启动并重新启动整个脚本有什么不同。 – albert

相关问题