微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用GUI小部件通过子进程的Popen捕获input请求并返回它以继续该过程,重复直到结束?

如何解决如何使用GUI小部件通过子进程的Popen捕获input请求并返回它以继续该过程,重复直到结束?

我使用wxPython作为我的GUI,使用NVDA作为我的屏幕阅读器,并带有可刷新的盲文显示器。 NVDA目前不支持正确读取tkinter软件包。

我的目标:在使输出流变为多行的同时,只读TextCtrl;捕获对input()处理的请求并使用认对话框标题转换input(prompt)-> TextEntry(),提示消息,并等待我的单行字符串的空TextCtl,在单击Enter字符串后返回输入输入流,并继续接受输出到原始输出TextCtrl。

我的目标是将我的终端使用此表格替换为有限类型的命令行程序,当我逐行跟踪输出直到过程结束时,仅需要我输入一行即可。

现在,我的程序是这样编码的:

import os,subprocess

import wx


class PyOutputFrame(wx.Frame):
    
    def __init__(self,title="Program Output"):
        
        wx.Frame.__init__(self,None,title=title)
        
        menubar = wx.MenuBar()
        actionmenu = wx.Menu()
        chdirmenuitem = actionmenu.Append(wx.ID_ANY,'Change Current Dir')
        menubar.Append(actionmenu,'&Action')
        self.Bind(wx.EVT_MENU,self.OnChange,chdirmenuitem)
        self.SetMenuBar(menubar)
        
        panel = wx.Panel(self)
        self.entxt = wx.TextCtrl(panel,style=wx.TE_PROCESS_ENTER)
        self.entxt.Bind(wx.EVT_TEXT_ENTER,self.OnEnter)
        self.outxt = wx.TextCtrl(panel,style=wx.TE_MULTILINE|
                                              wx.TE_READONLY|
                                              wx.TE_BESTWRAP)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.entxt,wx.EXPAND)
        sizer.Add(self.outxt,1,wx.EXPAND)
        panel.SetSizer(sizer)
        
    def OnEnter(self,event):
        
        self.outxt.Clear()
        cmd = self.entxt.GetValue()
        proc = subprocess.run(cmd,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,shell=True)
        self.outxt.WriteText(proc.stdout.decode())
        self.outxt.SetInsertionPoint(0)
        self.outxt.SetFocus()
        
    def OnChange(self,event):
        
        dlg = wx.DirDialog(self,style=wx.DD_CHANGE_DIR)
        dlg.ShowModal()

if __name__ == '__main__':
    app = wx.App()
    frm = PyOutputFrame()
    frm.Show()
    app.MainLoop()

这需要新的代码用于​​ p>

1:进程启动时,如果输出不需要输入,则直接打印以逐行输出TextCtrl 2:当输出行需要我输入时,自动执行以下操作:1)创建带有提示作为消息的弹出消息框,并在一行输入框中键入我的输入,然后按ENTER将其发送到进程,或者2)展开我的输入框。原始输入TextCtrl,最初用于启动进程(例如“ py echoname.py”)以在需要输入时接受多行输入,无需使用弹出对话框 3:将该输入转换为输出,并在其提示输出(如果有)旁边 4:重复2和3(如果有) 5:使用其余任何输出来完成该过程

测试脚本以读取和输入:

print('Hi')
while True:
    ans = input('Tell me your name: ')
    if ans == 'q': break
    print(f'Yo {ans.title()}!')
print('Bye!')

大图原理:我使用盲文显示器来阅读文本,我的目标是从使用命令行程序的终端转向这种GUI界面,因为它将重点转移到多行输出的顶部,而不是需要通过盲文显示器逐行爬到终端的顶部。终端机更适合目标用户,而不是盲文显示用户。 谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。