标签: pyqt5

使用PyQt4刮取Javascript驱动的网页 - 如何访问需要身份验证的网页?

我必须在我们公司的内部网上抓一个非常非常简单的页面,以便自动化我们的一个内部进程(将函数的输出返回成功与否).

我找到了以下示例:

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtWebKit import *

class Render(QWebPage):
  def __init__(self, url):
    self.app = QApplication(sys.argv)
    QWebPage.__init__(self)
    self.loadFinished.connect(self._loadFinished)
    self.mainFrame().load(QUrl(url))
    self.app.exec_()

  def _loadFinished(self, result):
    self.frame = self.mainFrame()
    self.app.quit()

url = 'http://sitescraper.net'
r = Render(url)
html = r.frame.toHtml()
Run Code Online (Sandbox Code Playgroud)

来自http://blog.sitescraper.net/2010/06/scraping-javascript-webpages-in-python.html,它几乎是完美的.我只需要能够提供身份验证来查看页面.

我一直在查看PyQt4的文档,我承认很多都是我的头脑.如果有人可以提供帮助,我会很感激.

编辑: 不幸的是gruszczy的方法对我不起作用.当我通过urllib2做了类似的事情时,我使用了以下代码并且它有效...

username = 'user'
password = 'pass'

req = urllib2.Request(url)
base64string = base64.encodestring('%s:%s' % (username, password))[:-1]
authheader = "Basic %s" % base64string
req.add_header("Authorization", authheader)

handle = urllib2.urlopen(req)
Run Code Online (Sandbox Code Playgroud)

python ssl pyqt web-scraping pyqt5

9
推荐指数
1
解决办法
6797
查看次数

多继承元类冲突

我需要一个类的双重继承.我尝试了几种语法,但我不理解元类的概念.

from PyQt5.QtGui import QStandardItem
from configparser import ConfigParser

class FinalClass(ConfigParser, QStandardItem):
    def __init__(self, param):
        ConfigParser.__init__(self)
        QStandardItem.__init__(self)
Run Code Online (Sandbox Code Playgroud)

python pyqt multiple-inheritance python-3.x pyqt5

9
推荐指数
2
解决办法
5341
查看次数

PyQt5和asyncio:从永不完成的收益率

我正在尝试创建一个基于PyQt5和asyncio的新应用程序(使用python 3.4,期待最终使用async/await升级到3.5).我的目标是使用asyncio,以便即使应用程序等待某些连接的硬件完成操作,GUI也能保持响应.

在查看如何合并Qt5和asyncio的事件循环时,我发现了一个邮件列表发布,建议使用quamash.但是,在运行此示例(未修改)时,

yield from fut
Run Code Online (Sandbox Code Playgroud)

nevers似乎又回来了.我看到输出'Timeout',所以定时器回调显然会触发,但Future未能唤醒等待方法.当手动关闭窗口时,它告诉我有未完成的期货:

Yielding until signal...
Timeout
Traceback (most recent call last):
  File "pyqt_asyncio_list.py", line 26, in <module>
    loop.run_until_complete(_go())
  File "/usr/local/lib/python3.5/site-packages/quamash/__init__.py", line 291, in run_until_complete
    raise RuntimeError('Event loop stopped before Future completed.')
RuntimeError: Event loop stopped before Future completed.
Run Code Online (Sandbox Code Playgroud)

我在使用python 3.5的Ubuntu和使用3.4的Windows上测试了这个,在两个平台上都有相同的行为.

无论如何,由于这不是我实际尝试实现的,我还测试了一些其他代码:

import quamash
import asyncio
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

@asyncio.coroutine
def op():
  print('op()')

@asyncio.coroutine
def slow_operation():
  print('clicked')
  yield from op()
  print('op done')
  yield from asyncio.sleep(0.1)
  print('timeout expired') …
Run Code Online (Sandbox Code Playgroud)

python pyqt5 python-asyncio

9
推荐指数
1
解决办法
3455
查看次数

Python内核为第二轮PyQt5 GUI而死

  • 在Python 3.5.2中使用Spyder | Anaconda 4.2.0(64位)Windows软件包.qt:5.6.0
  • 首次运行时,GUI窗口按预期打开
  • 对于第二次运行,没有任何打开,并且接收内核死亡,重新启动日志消息.

gui1.py:

import sys from PyQt5.QtWidgets import QApplication, QWidget

app = QApplication(sys.argv)

w = QWidget()

w.resize(250,150) w.show()

#sys.exit(app.exec_()) 
app.exec_()
Run Code Online (Sandbox Code Playgroud)

IPhython日志:

runfile('F:/work/ws_python/TestProj1/gui1/gui1.py', wdir='F:/work/ws_python/TestProj1/gui1')

runfile('F:/work/ws_python/TestProj1/gui1/gui1.py', wdir='F:/work/ws_python/TestProj1/gui1')

Kernel died, restarting

Kernel died, restarting

Kernel died, restarting
Run Code Online (Sandbox Code Playgroud)

为什么内核为第二次运行而死,以及如何解决它?

(即使使用#sys.exit(app.exec_())作为最后一行,也要这样做.)

python ipython spyder anaconda pyqt5

9
推荐指数
1
解决办法
5104
查看次数

AttributeError:'Ui_MainWindow'对象没有属性'setCentralWidget'PyQt5

我仍然在为我的数据库的GUI工作,现在我有一个不同的错误:

Traceback (most recent call last):
  File "G:\Python\Database Kast Thuis\PyQt Test\MainMenu_ui.py", line 84, in <module>
    ex = Ui_MainWindow()
  File "G:\Python\Database Kast Thuis\PyQt Test\MainMenu_ui.py", line 16, in __init__
    self.setupUi(self)
  File "G:\Python\Database Kast Thuis\PyQt Test\MainMenu_ui.py", line 55, in setupUi
    MainWindow.setCentralWidget(self.centralwidget)
AttributeError: 'Ui_MainWindow' object has no attribute 'setCentralWidget'
Run Code Online (Sandbox Code Playgroud)

我不了解PyQt的事情,所以我不明白问题是什么.

代码是:(这是编辑版本,原始版本发布如下)

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'Main_Menu.ui'
#
# Created by: PyQt5 UI code generator 5.5.1
#
# WARNING! All changes made in this file will …
Run Code Online (Sandbox Code Playgroud)

python pyqt qt-designer qmainwindow pyqt5

9
推荐指数
1
解决办法
2万
查看次数

将我的PyQt5应用程序部署到Android

我在Windows上用Python 3.6编写了一个PyQt5应用程序,该应用程序在Windows上完美运行,我使用PyInstaller制作一个.exe文件来运行应用程序,效果很好!

是否可以让我的应用在Android上运行?我试过PyQtDeployment没有成功.

有什么建议?

android python-3.x pyqt5

9
推荐指数
0
解决办法
330
查看次数

使用CSS更改QDocketWidget悬停标题栏颜色

我有一个带有a的GUI,QDockwidget我希望如果用户用鼠标光标悬停在它上面,则停靠窗口小部件标题栏的颜色会改变颜色.我在下面有一个小测试程序,当光标位于标题栏上方时,标题栏会改变颜色.但是,如果光标位于停靠窗口小部件的其余部分上方,它也会更改颜色.有没有什么办法解决这一问题?

CSS = """

    QDockWidget::title {
        background-color: lightblue; 
        border: 1px solid black;
    }

    QDockWidget::title:hover {
        background: yellow;
    }

    QMainWindow::separator {
        background: palette(Midlight);
    }

    QMainWindow::separator:hover {
        background: palette(Mid);
    }
"""

from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt, QSize

class CenteredLabel(QtWidgets.QWidget):

    def __init__(self, text, parent=None):
        super().__init__(parent=parent)
        self.verLayout = QtWidgets.QVBoxLayout()
        self.setLayout(self.verLayout)
        self.horLayout = QtWidgets.QHBoxLayout()
        self.verLayout.addLayout(self.horLayout)
        self.label = QtWidgets.QLabel(text)
        self.horLayout.addWidget(self.label)

    def sizeHint(self):
        return QSize(300, 400)


class MyWindow(QtWidgets.QMainWindow):

    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.setCentralWidget(CenteredLabel("Central Widget"))
        self.dockWidget = QtWidgets.QDockWidget("Dock Title", parent=self)
        self.dockWidget.setWidget(CenteredLabel("Dock Widget"))
        self.addDockWidget(Qt.LeftDockWidgetArea, …
Run Code Online (Sandbox Code Playgroud)

python qt pyqt pyqt5

9
推荐指数
1
解决办法
212
查看次数

如何使用 python PyQt5 确定我的应用程序(窗口)的活动屏幕(监视器)?

我正在开发一个使用许多小部件(QGroupBox、QVBoxLayout、QHBoxLayout)的应用程序。最初它是在普通的高清显示器上开发的。但是,最近我们中的许多人升级到了 4K 分辨率的显示器。现在一些按钮和滑块被压缩得非常小以至于无法使用。

现在我尝试进行一些更改,以便该应用程序可以与 HD 和 4K 显示器一起使用。

我开始阅读以下链接:

https://leomoon.com/journal/python/high-dpi-scaling-in-pyqt5/在此处输入链接描述

我想每当我的窗口在特定监视器中打开时,我都可以调用以下代码:

if pixel_x > 1920 and pixel_y > 1080:
  Qapp.setAttribute(Qt.AA_EnableHighDpiScaling, True)
  Qapp.setAttribute(Qt.AA_UseHighDpiPixmaps, True)
else:
  Qapp.setAttribute(Qt.AA_EnableHighDpiScaling, False)
  Qapp.setAttribute(Qt.AA_UseHighDpiPixmaps, False)
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用以下代码获取显示器分辨率(pixel_x 和 pixel_y),使用相关帖子here

import sys, ctypes

user32 = ctypes.windll.user32
user32.SetProcessDPIAware()
screen_width  = 0 #78
screen_height = 1 #79
[pixel_x , pixel_y ] = [user32.GetSystemMetrics(screen_width), user32.GetSystemMetrics(screen_height)]
Run Code Online (Sandbox Code Playgroud)

screen_width = 0, screen_height = 1给了我主显示器的分辨率(在我们的案例中主要是笔记本电脑,它们是高清的)。screen_width = 78, screen_height = 79给了我虚拟机的组合分辨率。但我不明白如何根据我的应用程序打开的位置动态获取这些值。

我的应用程序窗口的开发方式是,它将在上次关闭的同一监视器中打开。现在的问题是,每当我的 GUI 被调用并适应该分辨率时,我都想获得活动监视器分辨率。如果有人可以帮助我,我会很高兴。

我很想知道每次将窗口从高清显示器拖动到 4K 显示器时是否可以调用屏幕分辨率计算,反之亦然。

编辑:我在这里的这篇文章中发现了类似的东西,但我无法从中得到太多。

Edit2:基于@Joe …

python user-interface resolution pyqt5 pythoninterpreter

9
推荐指数
2
解决办法
2442
查看次数

setColumnStretch 和 setRowStretch 如何工作

我有一个使用PySide2它构建的应用程序,setColumnStretch用于列拉伸和setRowStretch行拉伸。它运行良好,但我无法理解它是如何工作的。我参考了 qt 文档,但它对我没有帮助。我被困在这些括号内的两个值上。

例如 :

glay = QtWidgets.QGridLayout(right_container)
glay.addWidget(lineedit, 0, 0)
glay.addWidget(button2, 0, 2)

glay.addWidget(widget, 2, 0, 1, 3)  

glay.addWidget(button, 4, 0)                                    
glay.addWidget(button1, 4, 2)

glay.setColumnStretch(1, 1)                                     # setColumnStretch
glay.setRowStretch(1, 1)                                        # setRowStretch
glay.setRowStretch(2, 2)                                        # setRowStretch
glay.setRowStretch(3, 1)                                        # setRowStretch

Run Code Online (Sandbox Code Playgroud)

这会产生如下图所示的输出:

图片

但是如何?这四个值里面有glay.addWidget(widget, 2, 0, 1, 3)什么作用呢?请用例子向我解释这一切。

python pyqt python-3.x qgridlayout pyqt5

9
推荐指数
1
解决办法
4032
查看次数

如何在qt设计器中创建切换开关按钮?

我正在尝试在 qt 设计器中创建切换按钮。我也在互联网上参考,但我找不到如何做到这一点。谁能知道如何做切换开关按钮。我已附上示例按钮图像。

切换按钮

编辑

我在下面创建了一个文本框,我想要这个切换按钮。当我尝试添加时,它会抛出错误。如何在文本区域下方添加按钮?我也附上了代码片段。

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QPropertyAnimation, QRectF, QSize, Qt, pyqtProperty
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import (
    QAbstractButton,
    QApplication,
    QHBoxLayout,
    QSizePolicy,
    QWidget,
)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
       MainWindow.setObjectName("MainWindow")
       MainWindow.resize(472, 180)
       self.centralwidget = QtWidgets.QWidget(MainWindow)
       self.centralwidget.setObjectName("centralwidget")
       self.url = QtWidgets.QLineEdit(self.centralwidget)
       self.url.setGeometry(QtCore.QRect(30, 20, 411, 31))
       font = QtGui.QFont()
       font.setFamily("MS Shell Dlg 2")
       font.setPointSize(10)
       font.setBold(True)
       font.setWeight(75)
       self.url.setFont(font)
       self.url.setAutoFillBackground(False)
       self.url.setStyleSheet("border-radius:10px;")
       self.url.setAlignment(QtCore.Qt.AlignCenter)
       self.url.setCursorMoveStyle(QtCore.Qt.LogicalMoveStyle)
       self.url.setObjectName("url")
       MainWindow.setCentralWidget(self.centralwidget)
       self.menubar = QtWidgets.QMenuBar(MainWindow)
       self.menubar.setGeometry(QtCore.QRect(0, 0, 472, 21))
       self.menubar.setObjectName("menubar")
       MainWindow.setMenuBar(self.menubar)
       self.statusbar = …
Run Code Online (Sandbox Code Playgroud)

python pyqt qt-designer pyqt5

9
推荐指数
1
解决办法
2万
查看次数