Я хочу вернуть значение пользовательского ввода из графического интерфейса, созданного с помощью 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 при определении значения критерия.
Молниеносный Коллин! У меня возникли проблемы с форматированием кода для Stackoverflow.
Я не понимаю ваш вопрос или код в нем. Когда я запускаю его, возникает ModuleNotFoundError: No module named 'xxx'
в зависимости от выбранного элемента Listbox
, поэтому другие скрипты не работают «идеально с графическим интерфейсом». Глобальная переменная scripts
нигде не используется. Вы не упоминаете об этом в вопросе, но продолжаете передавать пользовательский ввод (думаю, из виджета Entry
в переменной с именем yearstick
) одному из этих внешних скриптов. Пожалуйста, редактировать свой вопрос еще раз и уточните, что именно вы хотите знать.
Доброе утро @martineau, я добавил 2 изображения, которые могут помочь объяснить мою проблему. Я хотел бы знать, как вернуть пользовательский ввод в качестве переменной, чтобы я мог вызывать эту переменную из другого скрипта.
По сути, вы хотите обмениваться данными между основным скриптом и некоторыми другими, которые он использует. Хороший способ сделать это — сохранить эти данные в модуле и импортировать их во все сценарии, которым нужен доступ к этим значениям.
Сначала создайте пустой файл сценария, например 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
.
Похожая идея описана в разделе Как разделить глобальные переменные между модулями? онлайн-документации.
Можете ли вы предоставить какой-нибудь код, чтобы мы могли увидеть, что вы уже пробовали?