Python PBI.PyBusyInfo保持领先

时间:2014-04-30 22:04:35

标签: python dialog wxpython

我有下面的代码,通过applescript打开Quicktime并对文件进行处理,这需要一段时间,不能被打扰。我想要一个对话窗口打开其他所有内容,无论它必须保持在最顶层,只是说“处理文件,请稍候”。此代码有效,但只要quicktime通过applescript打开,PBI.PyBusyInfo就会消失。知道我怎么能这样做吗?

import wx
import os
import os.path
import wx.lib.agw.pybusyinfo as PBI
from subprocess import Popen, PIPE

class ScrolledWindow(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(510, 370), style=wx.STAY_ON_TOP | wx.DEFAULT_FRAME_STYLE & ~ (wx.RESIZE_BORDER | 
                                                wx.RESIZE_BOX | 
                                                wx.MAXIMIZE_BOX))

        self.tabbed = wx.Notebook(self, -1, style=(wx.NB_TOP))
        run_params = {}
        run_params["dropList1"] = ['HD 1920x1080', 'PAL 4x3', 'PAL 16x9', 'NTSC 4x3', 'NTSC 16x9']
        run_params["dropList2"] = ['Progressive', 'Interlaced']

        self.CreateStatusBar()
        menuBar = wx.MenuBar()
        menu = wx.Menu()
        self.SetMenuBar(menuBar)
        panel = wx.Panel(self, -1)
        self.Centre()
        self.Show()
        self.filePrep = PrepFile(self.tabbed, run_params)
        self.tabbed.AddPage(self.filePrep, "File Prep")

class PrepFile(wx.Panel):
    def __init__(self, parent, run_params):
        wx.Panel.__init__(self, parent)

        self.run_params = run_params
        self.fieldChoice = 'Progressive'
        self.formatOption = 'HD 1920x1080'

        outputOption = '''Format'''
        wx.StaticText(self, -1, outputOption, (33, 22), style=wx.ALIGN_CENTRE)

        self.choice1 = wx.Choice(self, pos=(35, 40), choices=self.run_params["dropList1"])
        self.choice1.SetSelection(0)
        self.choice1.SetFocus()
        self.choice1.Bind(wx.EVT_CHOICE, self.selectOption)

        fieldSetText = '''Fields'''
        wx.StaticText(self, -1, fieldSetText, (33, 82), style=wx.ALIGN_CENTRE)

        self.choice2 = wx.Choice(self, pos=(35, 100), choices=self.run_params["dropList2"])
        self.choice2.SetSelection(0)
        self.choice2.SetFocus()
        self.choice2.Bind(wx.EVT_CHOICE, self.fieldSet)

        self.buttonClose = wx.Button(self, -1, "Quit", pos=(195, 250))
        self.buttonClose.Bind(wx.EVT_BUTTON, self.OnClose)

        greyBox = wx.StaticBox(self, -1, '', pos=(20, 15), size=(235, 130))

        outputtxt3 = '''Drag and Drop Quicktimes'''
        wx.StaticText(self, -1, outputtxt3, pos=(35, 170), style=wx.ALIGN_CENTRE)

        self.drop_target = MyFileDropTarget(self)
        self.SetDropTarget(self.drop_target)
        self.tc_files = wx.TextCtrl(self, wx.ID_ANY, pos=(38, 190), size=(200, 25))
        self.buttonSubmit = wx.Button(self, -1, "Submit", pos=(250,190))
        self.buttonSubmit.Bind(wx.EVT_BUTTON, self.submit)

    def EvtRadioBox(self, event):
        self.mode = (event.GetString())

    def selectOption(self, e):
        self.formatOption = self.choice1.GetStringSelection()

    def fieldSet(self, e):
        self.fieldChoice = self.choice2.GetStringSelection()

    def setSubmissionDrop(self, dropFiles):
        """Called by the FileDropTarget when files are dropped"""
        self.tc_files.SetValue(','.join(dropFiles))
        self.selectedFiles = dropFiles
        print self.selectedFiles

    def submit(self, event):
        event.Skip()
        message = "Please wait..."
        busy = PBI.PyBusyInfo(message, parent=self, title="Processing Files") 
        wx.Yield()
        for item in self.selectedFiles:
            if os.path.isdir(item):
                print "It is a folder!"
                for root, dirs, files in os.walk(item):
                    for file1 in files:
                        if file1.endswith(".mov"):
                            currentFile = os.path.join(root, file1)
                            self.jesFile(currentFile)
        print "Finished"
        del busy

    def doSomething(self):
        print "Open Quicktime and process files via applescript"

    def OnClose(self, e):
        CloseApp()

class MyFileDropTarget(wx.FileDropTarget):
    """"""
    def __init__(self, window):
        wx.FileDropTarget.__init__(self)
        self.window = window

    def OnDropFiles(self, x, y, filenames):
        self.window.setSubmissionDrop(filenames)

app = wx.App()
ScrolledWindow(None, -1, 'App')
app.MainLoop()

1 个答案:

答案 0 :(得分:0)

您的问题似乎缺少启动AppleScript的调用(看起来您忘了将jesFile方法添加到示例代码中)。我只能推测你的代码不是在发布的例子中...但我的猜测是你的处理呼叫不是阻塞呼叫,所以你需要让它成为阻塞呼叫,或者保存忙到非阻塞进程调用返回时删除的类变量(希望您可以在发生这种情况时绑定回调函数)。