我想从用Tkinter制作的GUI返回用户输入值,我希望将其存储为变量,因此我可以在另一个脚本中使用from函数的import来回调该值(用于计算)。
我尝试为按钮分配多个功能,并从def内设置变量。
底部的四个脚本与GUI完美配合,但是,我目前将它们设置为yardstick = input()-因此提示用户将值输入到控制台中,我希望从选择模型时在GUI中进行操作。 (请考虑使用码= 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
简单地放入;我希望第28行的v在变量资源管理器中作为变量返回,因此我可以在脚本CPS中在确定标准值时对其进行调用。
答案 0 :(得分:0)
基本上,您想要做的是在主脚本与其import
的其他脚本之间共享数据。做到这一点的一种好方法是将数据存储在模块中,然后将其导入所有想要访问这些值的脚本中。
首先创建一个空脚本文件,例如shared.py
。
然后在主脚本(即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
模块名称空间中的所有值。
之所以可行,是因为import
个模块被缓存在sys.modules
中,并且如果另一个脚本import
是已经被其他脚本import
缓存的模块,则被缓存使用value代替重新加载并再次执行命名脚本。
这实际上意味着模块的实现方式意味着它们遵循Singleton design pattern,因为它们是types.ModuleType
类的实例。
如果愿意,可以为属性值定义默认值,在这种情况下,shared.py
将不再为空。但是请记住,在运行时通过其他任何模块中的赋值语句对这些值所做的更改将 不持久,因为这些更改仅在模块的内存版本中进行(缓存) sys.modules
列表中),而不是相应的脚本.py
文件本身。
在线文档的How do I share global variables across modules?部分中描述了类似的想法。