Python AttributeError:module';runAnalytics';没有属性';运行';

Python AttributeError:module';runAnalytics';没有属性';运行';,python,input,tkinter,python-3.5,attributeerror,Python,Input,Tkinter,Python 3.5,Attributeerror,我试图使用tkinter从main.py文件中获取一个输入,然后在runAnalytics.py中使用该输入 from yahoo_finance import Share from main import input1 import tkinter import os import centerWindow def run(): ticker = input1 loadAnalytics = tkinter.Tk() loadAnalytics.title("$"

我试图使用tkinter从main.py文件中获取一个输入,然后在runAnalytics.py中使用该输入

from yahoo_finance import Share
from main import input1
import tkinter
import os
import centerWindow


def run():
    ticker = 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()
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)

centerWindow.center(loadApplication)

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

loadApplication.mainloop()
runAnalytics.py

from yahoo_finance import Share
from main import input1
import tkinter
import os
import centerWindow


def run():
    ticker = 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 1, in <module>
    import runAnalytics
  File "C:\Users\MyName\Documents\Python Projects\MarketData\runAnalytics.py", line 2, in <module>
    from main import input1
  File "C:\Users\MyName\Documents\Python Projects\MarketData\main.py", line 13, in <module>
    loadAnalytics = tkinter.Button(loadApplication, text = "Load Analytics", command = runAnalytics.run)
AttributeError: module 'runAnalytics' has no attribute 'run'
回溯(最近一次呼叫最后一次):
文件“C:\Users\MyName\Documents\Python Projects\MarketData\main.py”,第1行,在
导入运行分析
文件“C:\Users\MyName\Documents\Python Projects\MarketData\runAnalytics.py”,第2行,在
从主导入输入1
文件“C:\Users\MyName\Documents\Python Projects\MarketData\main.py”,第13行,在
loadAnalytics=tkinter.Button(loadApplication,text=“Load Analytics”,command=runAnalytics.run)
AttributeError:模块“runAnalytics”没有属性“run”
尝试将()添加到runAnalytics.run的末尾。您当前正在告诉它查找它没有的
run
属性,而不是函数

loadAnalytics = tkinter.Button(loadApplication, text = "Load Analytics", command = runAnalytics.run())
您不想启动另一个
tk
mainloop
。相反,您应该传递
根目录
,并创建顶级窗口

def run(root):
    ticker = input1
    parent = Toplevel(root)
    parent.title("$" + ticker + " Data")
    # the rest of your code

您有一个循环导入:

import runAnalytics
# ..
from main import input1
当再次导入
main
时,
runAnalytics
还没有机会执行
def run():
。。节

通过从主导入输入1中删除
行来解决此问题,并将该对象作为参数传入:

def run(input1):
调用函数时,从
main.py
模块传入:

loadAnalytics = tkinter.Button(loadApplication, text = "Load Analytics", command = lambda: runAnalytics.run(input1))
除了循环导入之外,还有一个问题,即在Python中作为主脚本运行的任何文件都将存储为
\uuuuu main\uuuu
模块。再次导入同一脚本将导致创建第二个模块,现在名为
main
,并且在该模块中创建的任何对象都不同于
\uuuuu main\uuu
中创建的对象


接下来,您需要从
run
中删除
loadAnalytics.mainloop()
调用,因为您不应该从已经运行的循环中启动新的mainloop。您可能还想创建一个新的
TopLevel
窗口,而不是创建另一个
Tk()
root。如果您这样做,您也必须将
loadApplication
传递到
run

循环导入问题。重新构造代码,这样就不会有两个模块相互导入。这将不起作用,因为它将在声明按钮后立即运行。您可以这样做:
loadAnalytics=tkinter.button(loadApplication,text=“Load Analytics”,command=lambda:runAnalytics.run())
Yes,你的回答更能说明问题sense@double_j:这也不起作用,因为
main.py
是主脚本,所以作为
\uuuuu main\uuuuu
导入
import main
将添加另一个模块对象,而
main.input1
\uuuuuuuuu main\uuuuuuuuu.input1
将是两个不同的对象。由于循环导入,这仍然不起作用。主导入输入的
行将在
runAnalytics
中定义的
run
之前运行,而从runAnalytics导入运行的
行仍将失败。@MartijnPieters是的,您是正确的,我正在讨论另一个问题,现在我看到您的答案涵盖了这两个问题。谢谢这比我的答案好得多,因为它涵盖了这两个问题。