Как написать неблокирующий код с помощью PyQT5 для загрузки на диск Google с помощью PyDrive?

Я пытаюсь загрузить данные на Google Диск с помощью pydrive одним нажатием кнопки PyQT5. Я хочу отобразить сообщение о том, что выполняется резервное копирование данных.... в строке состояния (или на ярлыке).

Однако я получаю сообщение только после завершения загрузки. Кажется, что процесс загрузки 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()

person Angom    schedule 25.11.2020    source источник


Ответы (1)


И простым способом было бы добавить QApplication.processEvents() после self.statusBar().showMessage(...) . Это должно позаботиться обо всех обновлениях пользовательского интерфейса, прежде чем блокировать очередь событий с вашим доступом к Google.

Более сложным способом было бы передать доступ к Google другому потоку (см., например, этот учебник), но, возможно, это слишком много для вашего варианта использования.

person Christian Karcher    schedule 26.11.2020
comment
QApplication.processEvents() работает отлично. Спасибо - person Angom; 27.11.2020