Python Qt:接管系统打开文件对话框

Python Qt:接管系统打开文件对话框,python,qt,pyqt4,qwebview,qfiledialog,Python,Qt,Pyqt4,Qwebview,Qfiledialog,我想使用PyQt4的QWebView自动将文件上传到网站,但有一部分我还不清楚。要上传文件,网站上有一个按钮,可以打开一个对话框,从中选择本地文件。所以,我的问题是:)有没有办法在我点击按钮后控制这个对话框?有没有更好的方法来实现这一点 编辑 该网站是,我正在通过My Places>Create Map>Import上传一个.kml文件。您可能正在寻找的是()(我想这也取决于该网站是如何处理的)。重新实施,看看是否足够。执行任意操作并返回所选的文件路径 编辑:既然您提供了我测试过的链接,而且似乎

我想使用PyQt4的QWebView自动将文件上传到网站,但有一部分我还不清楚。要上传文件,网站上有一个按钮,可以打开一个对话框,从中选择本地文件。所以,我的问题是:)有没有办法在我点击按钮后控制这个对话框?有没有更好的方法来实现这一点

编辑


该网站是,我正在通过My Places>Create Map>Import上传一个.kml文件。

您可能正在寻找的是()(我想这也取决于该网站是如何处理的)。重新实施,看看是否足够。执行任意操作并返回所选的文件路径


编辑:既然您提供了我测试过的链接,而且似乎可以使用。

好的,首先让我从背景信息和参考资料开始

我将使用的模块是
pywin32
下载,特别是
win32gui
,API参考

现在,在操作对话框之前,您必须“导航”到窗口句柄,下面使用的是
win32.FindWindow
API引用,如下所示,其中两个输入是
lpclassName
,在本例中为
#32770
(代表对话框)参考和
lpWindowName
,在本例中是
文件上传

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\u单击
发送消息
的参考

最终代码:

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

这里是一个纯粹的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_())

你能提供网站url吗?@enginefree当然,会编辑帖子吗?我提供的答案有用吗?@enginefree还不能检查出来,但看起来不错,我可能会在期限到期前判决你奖金,谢谢!