如何将用户输入作为变量返回,以供另一个脚本调用?

时间:2019-05-29 15:32:27

标签: python user-interface tkinter

我想从用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中在确定标准值时对其进行调用。

1 个答案:

答案 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 sharedimport等将要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?部分中描述了类似的想法。