Как я могу вернуть пользовательский ввод как переменную для вызова другим скриптом?

Я хочу вернуть значение пользовательского ввода из графического интерфейса, созданного с помощью Tkinter, я хочу, чтобы оно сохранялось как переменная, поэтому я могу использовать функцию импорта из другого скрипта для обратного вызова этого значения (для вычислений).

Я попытался назначить несколько функций кнопке и установить переменную из файла def.

Четыре скрипта внизу отлично работают с графическим интерфейсом, однако в настоящее время я установил для них значение Ярлык = ввод () - таким образом предлагая пользователю ввести значение в консоль, я бы хотел, чтобы это было сделано из графического интерфейса. при выборе модели. (думаю, критерий = v) из приведенного ниже кода.

import tkinter as tk

# --- main ---

scripts = ["CPS.py", "BPS.py", "WWI.py", "WWSST.py",]

OPTIONS = ["Combined Pumping Stations", "Booster Pumping Station", "Waste Water Ionisation", "Waste Water Sludge Storage Tanks (Concrete)"]

root = tk.Tk()
root.title('Birch Forest')
root.minsize(500,200)

# --- Listbox ---

tk.Label(root, text='Element Name', bg='#00C78C').pack(fill='x')

l = tk.Listbox(root, selectmode='single')

l.pack(side = "left", fill = "both",expand=True)
l.insert('end', *OPTIONS)

# --- Textbox ---

def printtext():
    global e
    string = e.get() 
    v = (string)
    print(v)

e = tk.Entry(root)
e.pack()
e.focus_set()

b = tk.Button(root,text='Save',command=printtext)
b.pack(side='bottom')


# --- functions --- 
def on_button():

    # different examples with `curselection()`

    for idx in l.curselection():
        if OPTIONS[idx] == 'Combined Pumping Stations':
            print("Running Random Forest Simulation")
        elif OPTIONS[idx] == 'Booster Pumping Stations':
            print("Running Random Forest Simulation")
        elif OPTIONS[idx] == 'Waste Water Ionisation':
            print("Running Random Forest Simulation")
        elif OPTIONS[idx] == 'Waste Water Sludge Storage Tanks (Concrete)':
            print("Running Random Forest Simulation")

    for idx in l.curselection():
        if idx == 0:
            import CPS
        elif idx == 1:
            import BPS
        elif idx == 2:
            import WWI
        elif idx == 3:
            import WWSST

# --- Button ---

b = tk.Button(root, text='Run Simulation', bg='#76EEC6', command=on_button)
b.pack(fill = "x", side = "right", expand = True)

root.mainloop()

https://i.stack.imgur.com/DZ8qn.pnghttps://i.stack.imgur.com/lhOgY.png

Проще говоря; Я хотел бы, чтобы v в строке 28 возвращалась как переменная в обозревателе переменных, чтобы я мог вызывать ее в скрипте CPS при определении значения критерия.

Можете ли вы предоставить какой-нибудь код, чтобы мы могли увидеть, что вы уже пробовали?

Collin Phillips 29.05.2019 17:33

Молниеносный Коллин! У меня возникли проблемы с форматированием кода для Stackoverflow.

Ethan Mercer 29.05.2019 17:34

Я не понимаю ваш вопрос или код в нем. Когда я запускаю его, возникает ModuleNotFoundError: No module named 'xxx' в зависимости от выбранного элемента Listbox, поэтому другие скрипты не работают «идеально с графическим интерфейсом». Глобальная переменная scripts нигде не используется. Вы не упоминаете об этом в вопросе, но продолжаете передавать пользовательский ввод (думаю, из виджета Entry в переменной с именем yearstick) одному из этих внешних скриптов. Пожалуйста, редактировать свой вопрос еще раз и уточните, что именно вы хотите знать.

martineau 29.05.2019 18:39

Доброе утро @martineau, я добавил 2 изображения, которые могут помочь объяснить мою проблему. Я хотел бы знать, как вернуть пользовательский ввод в качестве переменной, чтобы я мог вызывать эту переменную из другого скрипта.

Ethan Mercer 30.05.2019 10:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
540
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По сути, вы хотите обмениваться данными между основным скриптом и некоторыми другими, которые он использует. Хороший способ сделать это — сохранить эти данные в модуле и импортировать их во все сценарии, которым нужен доступ к этим значениям.

Сначала создайте пустой файл сценария, например import.

Затем добавьте shared.py в начало основного скрипта (например, import shared).

После этого измените обратный вызов кнопки «Сохранить» Birchforest.py, чтобы он сохранял значение в именованном атрибуте этого модуля:

import shared
.
.
.
# --- Textbox ---

def printtext():
    global e
    shared.v = e.get()  # Store current Entry value in shared module.

Наконец, вы должны добавить printtext() начало сценариев, которые будут import shared использоваться основным сценарием (например, import, CPS.py и т. д.), чтобы они могли получить доступ к этим общим данным.

Например:

import shared

print('in CPS')
print('  shared.v:', shared.v)

... # rest of script

После этого они смогут получить доступ к любым значениям, которые основной скрипт поместил в пространство имен модуля BPS.py.

Это работает, потому что sharedмодули кэшируются в import, и если другой скрипт sys.modulesявляется модулем, который уже был importкеширован каким-то другим скриптом, кэшированное значение используется вместо перезагрузки и повторного выполнения именованного скрипта.

Фактически это означает, что модули реализованы таким образом, что они следуют Одноэлементный шаблон проектирования, потому что они являются экземплярами класса import.

Если вы хотите, вы можете определить значения по умолчанию для значений атрибутов, и в этом случае types.ModuleType больше не будет пустым. Однако имейте в виду, что изменения, внесенные в эти значения во время выполнения с помощью операторов присваивания в любом другом модуле, будут нет постоянными, поскольку изменения вносятся только в версию модуля в памяти (кэшируется в списке shared.py), а не в соответствующий файл скрипта sys.modules.

Похожая идея описана в разделе Как разделить глобальные переменные между модулями? онлайн-документации.

Другие вопросы по теме