Как я могу вернуть пользовательский ввод как переменную, которая будет вызвана другим скриптом? - PullRequest
0 голосов
/ 29 мая 2019

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

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

Четыре скрипта внизу отлично работают с графическим интерфейсом, однако в настоящее время я установил для них значение yardstick = input () - таким образом, предлагая пользователю ввести значение в консоль, я бы хотел, чтобы это было сделано из в графическом интерфейсе при выборе модели. (думаю, мера = 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.png https://i.stack.imgur.com/lhOgY.png

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

1 Ответ

0 голосов
/ 30 мая 2019

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

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

Затем добавьте import shared в начало основного сценария (т. Е. Birchforest.py).

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

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

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

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

Например:

import shared

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

... # rest of script

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

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

Это фактически означает, что модули реализованы таким образом, что они следуют шаблону проектирования Singleton - потому что это экземпляры класса types.ModuleType.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...