Python AttributeError: 'str' object has no attribute 'get_price'
Python AttributeError: 'str' object has no attribute 'get_price'
我正在尝试从 main.py 获取用户输入,然后根据所述用户输入调整输出。我不仅收到此错误,而且当我开始 main.py 时,我的 runAnalytics 似乎是 运行,而不是当我按下我的按钮命令时。
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'
您假设 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)
创建一个名为 input1
的 Entry
小部件,然后将其传递给该函数。问题是 input1
不包含您在条目小部件中键入的字符串,而是包含对小部件的引用(小部件 ID)。为了获取小部件的内容,您需要调用其 .get()
方法,如我的代码片段所示。
我正在尝试从 main.py 获取用户输入,然后根据所述用户输入调整输出。我不仅收到此错误,而且当我开始 main.py 时,我的 runAnalytics 似乎是 运行,而不是当我按下我的按钮命令时。
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'
您假设 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)
创建一个名为 input1
的 Entry
小部件,然后将其传递给该函数。问题是 input1
不包含您在条目小部件中键入的字符串,而是包含对小部件的引用(小部件 ID)。为了获取小部件的内容,您需要调用其 .get()
方法,如我的代码片段所示。