我创建了一个PyQt应用程序,它基本上模仿了一个简单的终端(带有只读QTextEdit的纯文本显示,带有QLineEdit的输入,在用户按下返回时发送其内容),这样我就可以添加额外的显示人造终端旁边的元素。
使用普通的shell终端,我可以输出如下文字:
print("Hello world!")
使用GUI进行复制相对容易:
class MainWindow(QWidget):
# Setup etc...
def OnReturnPressed(self, e):
# Linked to the appropriate signal of the LineEdit containing
# user input
input = self.GetLineEditContentsAndClear()
MainCode(input, self.Output)
def Output(self, text):
# ...Outputs text to the display TextEdit
def MainCode(input, outputFuction)
outputFunction("Hello World!")
同样,我可以从默认终端获取输入,如下所示:
name = input("Enter your name:")
但是,我不知道如何使用GUI进行等效操作,因为主要代码(如上面的输出示例中所示)必须由GUI输入触发。
我目前最好的尝试是从QWidget的QLineEdit“返回键按下”信号调用主代码,将QLineEdit中的任何文本传递给主代码,然后每当我从主代码传递到return
需要新的输入,但这会导致绝对的混乱,因为我试图回到代码执行中的同一点,就像我return
编辑时那样。
有没有办法编写一个类似input()
的函数来等待来自GUI的输入然后返回它并从中断处继续执行?我想要的是能够做到这样的事情:
import mygui # Contains all necessary GUI code
def MainCode():
# Setup and initialize GUI, then run it as a separate thread
# or process
#
# For the sake of the example, call it 'myguiinstance'
# Setup other stuff
# Main Loop
while(true):
input = myguiinstance.GetInput("Enter input")
# Puts the main code on hold until the GUI returns input.
while not CheckIfInputIsValid(input) #Defined elsewhere
input = myguiinstance.GetInput("Invalid input. Enter input:")
output1, output2, output3 = ProcessInput(input)
output = format("Foo: {0}\nBar: {1}\nFoobar: {2}",
output1, output2, output3)
myguiinstance.Output(output)