如何使用 PyQT5 编写非阻塞代码以使用 PyDrive 上传到 google 驱动器?

How to write non blocking code using PyQT5 for uploading to google drive with PyDrive?

我正在尝试通过单击 PyQT5 的按钮使用 pydrive 将数据上传到 Google 驱动器。我想在状态栏(或标签上)显示一条消息,如“正在进行数据备份......”。

但是我只有在上传完成后才会收到消息。似乎 pydrive 上传过程会阻止 PyQT 进程,直到上传完成。

如何实现在上传过程中显示消息。下面是我的代码:

def __init__(self, *args, **kwargs):
    super(HomeScreen,self).__init__()
    loadUi('uiScreens/HomeScreen.ui',self)
    self.pushButton.clicked.connect(self.doDataBackup)

def doDataBackup(self):
    dbfile = "mumop.db"     #File to upload
    self.statusBar().showMessage("Data back up in progress....") # This is blocked by pydrive
    print("Data backup is in progress.....")  # This test line is not blocked by pdrive
    upload.uploadToGoogleDrive(dbfile))
    
# This  method is in another file
def uploadToGoogleDrive(file):
    gauth = GoogleAuth()
    gauth.LoadCredentialsFile("upload/mumopcreds.txt")
    if gauth.credentials is None:
        gauth.LocalWebserverAuth()
    elif gauth.access_token_expired:
        gauth.Refresh()
    else:
        gauth.Authorize()
    gauth.SaveCredentialsFile("upload/mumopcreds.txt")
    drive = GoogleDrive(gauth)
    file1 = drive.CreateFile()
    file1.SetContentFile(file)
    file1.Upload()

简单的方法是在 self.statusBar().showMessage(...) 之后添加 QApplication.processEvents()。 在使用您的 google 访问权限阻止事件队列之前,这应该会处理所有 UI 更新。

一种更复杂的方法是将 google 访问外包到另一个线程(参见例如 this tutorial),但这对您的用例来说可能有点矫枉过正。