wxPython-在textctrl小部件中捕获shell输出?
我正在同时学习python和wxPython…:)因此,我有一组可以从命令行正常运行的python文件:wxPython-在textctrl小部件中捕获shell输出?,wxpython,subprocess,textctrl,Wxpython,Subprocess,Textctrl,我正在同时学习python和wxPython…:)因此,我有一组可以从命令行正常运行的python文件:/scan-dtest~/Pictures——例如,我将创建一个名为“test”的图片数据库 我一直在为此努力开发前端(我没有编写原始的命令行python文件),我可以使用以下方法运行它: def bt_ScanUpdateClick(self, event): self.SetSizeWH(450,360) ## DEBUG self.tc_MainDatabase
/scan-dtest~/Pictures
——例如,我将创建一个名为“test”的图片数据库
我一直在为此努力开发前端(我没有编写原始的命令行python文件),我可以使用以下方法运行它:
def bt_ScanUpdateClick(self, event):
self.SetSizeWH(450,360)
## DEBUG
self.tc_MainDatabase.Value = "test.db"
if self.tc_MainDatabase.Value == "":
self.LogWindow.Value += "ERROR:\tNo database name selected!\n"
else:
scanCMD = "./scan -d " + self.tc_MainDatabase.Value + " "
numLines=0
maxLines=(int(self.multiText.GetNumberOfLines()))
if self.multiText.GetLineText(numLines) == "":
self.LogWindow.Value += "ERROR\tNo folder selected to scan!\n"
else:
self.LogWindow.Value += "Running Scan...\n\n"
while (numLines < maxLines):
scanCMD += str(self.multiText.GetLineText(numLines)) + " "
numLines += 1
self.LogWindow.Value += scanCMD
p = subprocess.Popen([scanCMD],shell=True,stdout=subprocess.PIPE,stdin=subprocess.PIPE)
self.LogWindow.Value += p.communicate()[0]
def bt_scannupdateclick(self,event):
自我设定值WH(450360)
##调试
self.tc_maindabase.Value=“test.db”
如果self.tc_maindabase.Value==“”:
self.LogWindow.Value+=“错误:\t未选择数据库名称!\n”
其他:
scanCMD=“./scan-d”+self.tc\u maindabase.Value+”
numLines=0
maxLines=(int(self.multiText.GetNumberOfLines())
如果self.multiText.GetLineText(numLines)=“”:
self.LogWindow.Value+=“错误\t未选择要扫描的文件夹!\n”
其他:
self.LogWindow.Value+=“正在运行扫描…\n\n”
而(numLines
这给我带来了一个问题:
有什么想法吗?粗略地说,屏幕更新发生在事件循环的每个迭代过程中。当代码运行时,事件循环被困在同一个迭代中,因此无法进行屏幕更新 要解决这个问题,您需要在单独的线程或进程中运行长期运行的任务。因为wxPython是单线程的,所以对GUI的任何更新(例如写入输出行)都必须在主线程中完成。要做到这一点,工作线程可以使用
wx.CallAfter
,这将计划在GUI线程中尽早运行命令
有关更多信息,请参阅wxPython wiki上的页面,并参阅本网站上的问题 粗略地说,屏幕更新发生在事件循环的每个迭代过程中。当代码运行时,事件循环被困在同一个迭代中,因此无法进行屏幕更新 要解决这个问题,您需要在单独的线程或进程中运行长期运行的任务。因为wxPython是单线程的,所以对GUI的任何更新(例如写入输出行)都必须在主线程中完成。要做到这一点,工作线程可以使用
wx.CallAfter
,这将计划在GUI线程中尽早运行命令
有关更多信息,请参阅wxPython wiki上的页面,并参阅本网站上的问题 在上面Bryan的回答和这个链接之间:[wxpython:实时捕获子流程的输出][1]。。。我让它工作了![1] :在上面Bryan的回答和此链接之间:[wxpython:实时捕获子流程的输出][1]。。。我让它工作了![1]: