Qt: Возьмите диалог открытия файла системы

Я хотел бы автоматизировать загрузку файла на веб-сайт, используя QWebView PyQt4, но есть часть, которую я пока не могу понять. Для загрузки файла на веб-сайте есть кнопка, которая открывает диалоговое окно, из которого вы должны выбрать локальный файл. Итак, это мои вопросы 🙂 Есть ли способ управления этим диалогом, когда я нажимаю кнопку? Есть ли лучший способ добиться этого?

редактировать

Веб-сайт https://maps.google.com/ и я загружаю файл .kml через Мои места> Создать карту> Импорт.

2

Решение

Возможно, что вы ищете QWebPage :: chooseFile() (Я полагаю, это зависит также от того, как веб-сайт обрабатывает это). Переопределите это и посмотрите, достаточно ли это. Делайте что хотите и возвращайте выбранный путь к файлу.

РЕДАКТИРОВАТЬ: Теперь, когда вы предоставили ссылку, которую я протестировал и, кажется, работает.

4

Другие решения

Хорошо, для начала позвольте мне начать с справочной информации и ссылок.

Модуль, который я буду использовать, pywin32 скачать Вот, конкретно win32gui, Ссылка на API Вот.

Теперь, прежде чем вы сможете манипулировать диалогом, вам нужно «перейти» к дескриптору окна, используйте следующие win32.FindWindow Справочник по API Вот, который выглядит следующим образом, где два входа являются lpclassName в этом случае #32770 (обозначает диалог) Вот и lpWindowName который в этом случае File Upload,

HWND WINAPI FindWindow(
_In_opt_  LPCTSTR lpClassName,
_In_opt_  LPCTSTR lpWindowName
);

Код для поиска дескриптора файла:

import win32gui

control = win32gui.FindWindow("#32770", "File Upload")

И он хранит ручку, которая в моем случае была 721470,

Следующий шаг — найдите дескрипторы объектов GUI в диалоге, я покажу пример Cancel кнопка. Чтобы найти ручку, я буду использовать FindWindowEx Ссылка API здесь,

import win32con
import win32api

ButtonHandle = win32gui.FindWindowEx(control, 0, "Button", "Cancel");
win32api.SendMessage(ButtonHandle, win32con.BM_CLICK, 0, 0)

Ссылка Вот для BM_CLICK а также Вот для SendMessage,

Финальный код:

import win32gui
import win32api
import win32con

window = win32gui.GetForegroundWindow()
title = win32gui.GetWindowText(window)
control = win32gui.FindWindow("#32770", "File Upload")
ButtonHandle = win32gui.FindWindowEx(control, 0, "Button", "Cancel")
win32api.SendMessage(ButtonHandle, win32con.BM_CLICK, 0, 0)

Другой способ заключается в использовании watsup.winGuiAuto модуль, Вот, пример ниже:

from watsup.winGuiAuto import *

optDialog = findTopWindow(wantedText="File Upload")

CancelButton = findControl(optDialog,wantedClass="Button", wantedText="Cancel")

clickButton(SaveButton)

Но я считаю, что самый простой способ — это использовать autoit Вот, Я использовал это раньше в PyQT, чтобы стрелять команды.

Надеюсь это поможет!

Дополнительные ссылки (версии pywin32):

win32gui Вот

win32api Вот

1

Я думаю, что решение, данное @LucaCarlon, является правильным и заслуживает бонуса.

Вот протестированная чистая демонстрация PyQt4, которая более или менее воспроизводит реализацию по умолчанию:

import sys
from PyQt4 import QtCore, QtGui, QtWebKit

class WebPage(QtWebKit.QWebPage):
def chooseFile(self, frame=None, path=''):
return QtGui.QFileDialog.getOpenFileName(self.parent(), '', path)

if __name__ == '__main__':

app = QtGui.QApplication(sys.argv)
view = QtWebKit.QWebView()
view.setPage(WebPage(view))
view.load(QtCore.QUrl('https://maps.google.com/'))
view.show()
sys.exit(app.exec_())
1
По вопросам рекламы [email protected]