Python gui - 将输入传递给脚本

时间:2014-08-12 14:42:32

标签: python user-interface tkinter

我目前有一个主要的python脚本(main.py),它读取第二个脚本(input.py)的输入,该脚本可以由用户修改。用户在第二个脚本中设置维数(ndim),点数(npts)等变量,并使用以下内容将其读入main.py

filename = sys.argv[-1]    
m = __import__(filename)

      ndim = m.ndim
      npts1 = m.npts1
      npts2_recorded = m.npts2_recorded

脚本由以下命令执行:

python main.py input

我想用GUI替换input.py。 Tkinter似乎是一个明智的起点,我可以看到如何创建一个GUI,使用户能够设置他们原本在input.py中设置的各种选项。但是,我不知道如何从GUI向main.py传递此信息。是否存在等效于__import(filename)__的{​​{1}},它可以从用户在GUI中进行的选择中提取信息,或者是否有另一种方法可以实现相同的效果。

基于以下答案的最小(非)工作示例: 此代码创建文件example.txt,但提供给block1的文本不会写入文件。

from Tkinter import *

def saveCallback():
  with open("example.txt",'w') as outfile:
    outfile.write(block1.get())

def UserInput(status,name):
  optionFrame = Frame(root)
  optionLabel = Label(optionFrame)
  optionLabel["text"] = name
  optionLabel.pack(side=LEFT)
  var = StringVar(root)
  var.set(status)
  w = Entry(optionFrame, textvariable= var)
  w.pack(side = LEFT)
  optionFrame.pack()
  return w

if __name__ == '__main__':
  root = Tk()

  block1 = UserInput("", "Block size, dimension 1")

  Save_input_button = Button(root, text = 'Save input options', command = saveCallback())
  Save_input_button.pack()
  root.mainloop()

1 个答案:

答案 0 :(得分:1)

使用一个文件,将GUI中的选择保存到文件中(就像之前使用input.py一样),然后读取文件。

所以,在你的main.py

  1. 打开GUI
  2. 用户输入到文件的首选项
  3. 像以前一样阅读文件。
  4. 这里唯一的缺点是您必须在main.py脚本中确保GUI已经关闭。为此你可以使用subprocess模块,你可以使用几个函数进行阻止,直到进程返回或结束。

    使用这种方法,您只需输入:

      

    python main.py

    以及main.py内的某个地方:

    # The function call will wait for command to complete, then return the returncode attribute.
    rcode = subprocess.call(['python', 'gui_input.py'])
    

    将条目的值写入文件的代码示例。

    import tkinter
    
    top = tkinter.Tk()
    
    
    def saveCallback():
        with open("example.txt", 'w') as outfile:
            outfile.write(e1.get())
    
    
    e1 = tkinter.Entry(top)
    b1 = tkinter.Button(top, text ="Save", command = saveCallback)
    
    e1.pack(side=tkinter.LEFT)
    b1.pack(side=tkinter.RIGHT)
    
    
    top.mainloop()