2016-08-19 98 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

相關問題