如何避免循环导入?

How to avoid circular imports?

概览

编辑:更改后@IjonTichy 的

我正在尝试跨文件导入两个变量。我有一个使用 tkinter 的 GUI 文件和另一个存储许多变量的文件。问题具体在于 GUI 文件有一个 tk.Entry 字段,因此变量的值是动态的,并且会根据输入的内容而变化。我不想在这里使用按钮。我正在使用 tk.StringVar 对象来保存数据(可能在下面的代码中更清楚。

第二个变量只是一个基于计算的浮点数,因此很容易在那里分配。我遇到的问题是此文件需要 tk.StringVar 值来执行计算。

我试过的

所以首先我尝试简单地从每个文件中获取变量,使用 import [filename] 然后在我需要调用它时使用 [filename].[variable]。可以预见的是,由于循环导入,这导致了错误,这是有道理的。

随后,我尝试将所有这些数据转储到一个配置文件中,并允许从第三个文件中提取这两个文件,但结果也是一样的。

代码

vitals.py

from datetime import date
from decimal import Decimal

birth = date(1992, 6, 22)
today = date.today()

age = today.year - birth.year - ((today.month, today.day) < (birth.month, birth.day))
weight = 0
height = 177.5
activity = 1.2
#tdee = bmr * activity

def bmr(weight, height, age):
    return Decimal(((10 * float(weight)) + (6.25 * height) - (5 * age) + 5))

GUI.py

import tkinter as tk
import config

app = tk.Tk()
defaultColour = "beige"

mainFrame = tk.Frame(width=200, height=200, bg=defaultColour)
mainFrame.pack(fill=tk.BOTH, side=tk.LEFT, expand=True)

weightLabel = tk.Label(master=mainFrame,text='weight', bg=defaultColour)
weightLabel.pack()

weightVar = tk.DoubleVar() #NEW LINE

weightEntry = tk.Entry(mainFrame, textvariable=weightVar)
weightEntry.pack()
weightEntry.focus_set()

vitals.weight = weightVar.get()
print(vitals.bmr(vitals.weight, vitals.height, vitals.age))

ageLabel = tk.Label(master=mainFrame,text='age: ' + str(config.age), bg=defaultColour)
ageLabel.pack()

app.bind("<Escape>", lambda e: app.destroy())

app.mainloop()

问题

对于如何正确构建它,我有点不知所措。那么有人能告诉我哪里出错了吗?或者,如果您可以向我指出一些教授良好编码结构的资源的方向。这是我第一次编写应用程序,对于这个问题的空洞深表歉意。

非常感谢。

转储 config.py 文件。 在 vitals.py 中初始化您的变量并更改 GUI.py.

中的变量

即里面 vitals.py:

weight = 0

和里面 GUI.py

import vitals
vitals.weight = weightVar.get()

编辑:

你现在的新问题是因为你的bmr值取决于体重。

当你这样做时

import vitals

bmr 使用初始值计算。 当您想动态计算 bmr 时,您需要将其更改为函数。所以在 vitals.py:

def bmr(weight, height, age):
    return Decimal(((10 * float(weight)) + (6.25 * height) - (5 * age) + 5))
    

然后你从 GUI.py:

调用它
import vitals
vitals.weight = weightVar.get()
print(vitals.bmr(vitals.weight, vitals.height, vitals.age))

编辑2:

您需要对所有依赖于其他变量的值执行此操作