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