Как избежать циклического импорта? - PullRequest
0 голосов
/ 20 июня 2020

Обзор

РЕДАКТИРОВАТЬ: ИЗМЕНЕНО ПОСЛЕДУЮЩИЕ @ IjonTichy's ОТВЕТ

Я пытаюсь импортировать две переменные в файлы. У меня есть файл GUI с использованием tkinter и еще один файл, в котором хранится ряд переменных. Проблема в том, что файл GUI имеет поле tk.Entry, поэтому значение переменной - dynamic c и изменяется в зависимости от того, что вводится. Я бы предпочел не использовать здесь кнопку. Я использую объект 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()

Вопрос

Я немного не понимаю, как мне это правильно структурировать. сможет ли кто-нибудь сказать мне, в чем я ошибаюсь? Или вы могли бы указать я в направлении некоторых ресурсов, которые учат хорошей структуре кодирования. Я пишу приложение впервые, поэтому извиняюсь за бессмысленность этого вопроса.

Большое спасибо.

1 Ответ

0 голосов
/ 20 июня 2020

Дамп файла config.py. инициализируйте свои переменные в vitals.py и измените переменные с GUI .py.

, т.е. внутри vitals.py:

weight = 0

и внутри GUI .py

import vitals
vitals.weight = weightVar.get()

Изменить:

новая проблема, которая у вас теперь есть, заключается в том, что ваше значение bmr зависит от веса.

когда вы делаете

import vitals

bmr вычисляется с инициализированным значением. Если вы хотите, чтобы bmr вычислялся динамически, вам нужно преобразовать его в функцию. Итак, in 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))

edit2:

, вам нужно сделать это для все значения, которые зависят от других переменных

...