在GUI中替换Python程序的input()部分

时间:2017-06-13 14:39:22

标签: python user-interface user-input

我是python的新手,并且一直在使用最初用于命令行的程序。因此,它使用input()函数,特别是在循环的中间。大多数情况下,原始代码会执行以下操作:

for item in list:
    # some logic here
    user_input - input("prompt")
    # uses user_input

我已经决定要为它制作一个GUI,但我也想让它成为可选的。我有一个名为Viewer的类来装饰原始程序,我正在努力弄清楚如何最好地处理对input()的调用。

我的第一个想法是完全注入一个新的输入函数,这样它就可以在我的GUI文本框中查找输入而不是sys.stdout。我发现了很多关于如何将sys.stdout打印到GUI元素(如this)的Stack Overflow答案,但没有找到如何从一个元素中获取输入的答案。我的所有尝试都是通过创建一个循环结束冻结GUI,或者程序没有暂停输入,只是在提示提示时抓住框中的内容。

其次,我试图拆分我的函数以更好地匹配按钮的代码示例。因此,按钮1将触发function_part_1,直到需要输入为止。如果GUI标志被关闭,它将自动转到输入功能,否则它将返回并按下按钮将触发function_part_2:

def function_part_1(list):
   item = list[0]
   # do some logic on item 1
   if GUI:
      print("prompt")
      return
      # After this, the GUI waits for a button press, and then calls function_part_2
   else:
      function_input(list)


def function_input(list):
   user_input = input("prompt")
   function_part_2(user_input, list)


def function_part_2(user_input, list):
   # uses user_input on item
   list.remove(list[0])
   if list:
      function_part_1(list)
   else:
       return

但是,这很快变得难看。首先,它打破了许多循环,这需要大量的重构才能保持逻辑(特别是对于嵌套循环)。它还要求我将所有局部变量从function-part传递给function-part,这会使函数头爆炸。为了只为用户提供一个输入框,GUI必须具有逻辑以知道正在执行哪个功能以及接下来将使用哪个功能部件。它使我的功能更难以遵循并损害了可读性。

有更好的方法吗?

我正在使用appJar作为GUI,它基于Tkinter。我愿意切换到纯Tkinter,如果这会让事情变得更容易。

1 个答案:

答案 0 :(得分:0)

最简单的方法是覆盖this功能。这是使用tkinter的一个工作示例:

input