【问题标题】:Python AttributeError: module 'runAnalytics' has no attribute 'run'Python AttributeError:模块'runAnalytics'没有属性'run'
【发布时间】:2016-12-26 23:19:32
【问题描述】:

我正在尝试使用 tkinter 从我的 main.py 文件中获取输入,然后在 runAnalytics.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)

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'

【问题讨论】:

  • 循环导入问题。重组你的代码,这样你就不会有两个模块相互导入。

标签: python input tkinter python-3.5 attributeerror


【解决方案1】:

你有一个循环导入:

import runAnalytics
# ..
from main import input1

在再次导入main 时,runAnalytics 还没有机会执行def run():.. 部分。

通过删除 from main import input1 行来解决此问题,并将该对象作为参数传入:

def run(input1):

在调用函数时从 main.py 模块传入:

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

除了循环导入之外,还有一个问题是,在 Python 中作为主脚本运行的任何文件都将存储为 __main__ 模块。再次导入相同的脚本将导致创建一个 second 模块,现在名称为 main,并且在该模块中创建的任何对象都与 __main__ 中的对象不同。

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

【讨论】:

  • 这比我的回答要好得多,因为它涵盖了这两个问题。
【解决方案2】:
from runAnalytics import run

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

您不想在tk 987654323 @。相反,您应该通过root并创建一个toplevel窗口。

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

【讨论】:

  • 这仍然无法正常工作,因为圆形导入。 from main import input1行将在run 987654328 runAnalyticsfrom runAnalytics import run仍然失败。 span>
  • @ martijnpieters是的,你是正确的,我正在掩盖另一个问题,我现在看到你的答案现在覆盖。谢谢!
【解决方案3】:

尝试将 () 添加到 runAnalytics.run 的末尾。您目前正在告诉它寻找它没有的 run 属性而不是函数

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

【讨论】:

  • 这不起作用,因为它会在声明按钮后立即运行。
  • 你可以这样做:loadAnalytics = tkinter.Button(loadApplication, text = "Load Analytics", command = lambda: runAnalytics.run())
  • 是的,你的回答更有意义
  • @double_j:这也行不通,因为main.py主脚本,所以导入为__main__import main 将添加另一个模块对象,main.input1__main__.input1 将是两个不同的对象
猜你喜欢
  • 1970-01-01
  • 2017-05-30
  • 2019-03-18
  • 1970-01-01
  • 2018-04-28
  • 2023-04-06
  • 2018-06-16
  • 2015-03-09
  • 2020-10-18
相关资源
最近更新 更多