我正在尝试用imaplib 创建一个邮箱检查器,它与python,队列和多线程没有gui工作得很好.
但是当我试图把一个gui,我所做的每一个功能,让gui冻结直到完成.
我从各种doc(添加qthread,signal,cursorr etcc)尝试了很多东西,而且没有一个教程对我有用.
有人可以帮助我理解如何在运行函数时设置或附加文本到QtextEdit,因为它只在完成后工作.
这是我的代码:
class Checker(QtCore.QThread):
signal = QtCore.pyqtSignal(object)
def __init__(self, lignesmailtocheck):
QtCore.QThread.__init__(self)
self.lignesmailtocheck = lignesmailtocheck
def run(self):
lignemailtocheck = self.lignesmailtocheck.strip()
maillo, passo = lignemailtocheck.split(":",1)
debmail, finmail = maillo.split("@",1)
setimap =["oultook.com:imap-mail.outlook.com", "gmail.com:imap.gmail.com"]
for lignesimaptocheck in sorted(setimap):
ligneimaptocheck = lignesimaptocheck.strip()
fai, imap = ligneimaptocheck.split(":",1)
if finmail == fai:
passo0 = passo.rstrip()
try :
mail = imaplib.IMAP4_SSL(imap)
mail.login(maillo, passo)
mailboxok = open("MailBoxOk.txt", "a+", encoding='utf-8', errors='ignore')
mailboxok.write(maillo+":"+passo+"\n")
mailboxok.close()
totaly = maillo+":"+passo0+":"+imap
print(maillo+":"+passo+"\n")
self.send_text.emit(totaly)
time.sleep(1)
except imaplib.IMAP4.error:
print ("LOGIN …Run Code Online (Sandbox Code Playgroud) 这应该很简单,但我找不到答案.我试过这个PyQt4代码:
label.setAlignment(Qt.AlignCenter)
Run Code Online (Sandbox Code Playgroud)
但这没有给我带来好运.
谢谢
我正在使用PyQt5来抓取网页,这对于http:// URL非常有用,但对于https:// URL则完全没有.
我脚本的相关部分如下:
class WebPage(QWebPage):
def __init__(self):
super(WebPage, self).__init__()
self.timerScreen = QTimer()
self.timerScreen.setInterval(2000)
self.timerScreen.setSingleShot(True)
self.timerScreen.timeout.connect(self.handleLoadFinished)
self.loadFinished.connect(self.timerScreen.start)
def start(self, urls):
self._urls = iter(urls)
self.fetchNext()
def fetchNext(self):
try:
url = next(self._urls)
except StopIteration:
return False
else:
self.mainFrame().load(QUrl(url))
return True
def processCurrentPage(self):
url = self.mainFrame().url().toString()
html = self.mainFrame().toHtml()
#Do stuff with html
print('loaded: [%d bytes] %s' % (self.bytesReceived(), url))
def handleLoadFinished(self):
self.processCurrentPage()
if not self.fetchNext():
qApp.quit()
Run Code Online (Sandbox Code Playgroud)
对于安全页面,脚本返回空白页面.回来的唯一html就是<html><head></head><body></body></html>.
我有点失落.我是否缺少与处理安全URL相关的设置?
我有一个问题,下面的行self.tableView.set??????????(df)应该在PyQt5中显示数据帧.我放 ???那里我错过了我需要的代码.
def btn_clk(self):
path = self.lineEdit.text()
df = pd.read_csv(path)
self.tableView.set??????????(df)
Run Code Online (Sandbox Code Playgroud)
其余的代码可以工作,因为如果我print(df)在上面的代码中使用,数据框就会在IPython控制台中打印出来.所以,Pandas读取CSV并打印出来.
但是,我尝试了很多东西让它在PyQt5中显示出来并且没有任何效果.我对PyQt不太熟悉,刚刚开始玩它而且我被困在这里.
这是我的代码:
from PyQt5 import QtCore, QtGui, QtWidgets
import pandas as pd
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(662, 512)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
self.horizontalLayout.setObjectName("horizontalLayout")
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setObjectName("lineEdit")
self.verticalLayout.addWidget(self.lineEdit)
self.tableView = QtWidgets.QTableView(self.centralwidget)
self.tableView.setObjectName("tableView")
self.verticalLayout.addWidget(self.tableView)
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
self.horizontalLayout.addLayout(self.verticalLayout)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 662, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow) …Run Code Online (Sandbox Code Playgroud) 当我使用pyinstaller编译PyQt代码时,我遇到了一个问题.
我用这行来编译:
c:\Anaconda3\Scripts\pyinstaller.exe -y -F --distpath="." MyQt.py
Run Code Online (Sandbox Code Playgroud)
然后我收到此错误消息:
File "c:\anaconda36bis\lib\site-packages\PyInstaller\hooks\hook-zmq.py", line
18, in <module>
hiddenimports.extend(collect_submodules('zmq.backend'))
File "c:\anaconda36bis\lib\site-packages\PyInstaller\utils\hooks\__init__.py",
line 619, in collect_submodules
repr(pkg_dir), package))
File "c:\anaconda36bis\lib\site-packages\PyInstaller\utils\hooks\__init__.py",
line 90, in exec_statement
return __exec_python_cmd(cmd)
File "c:\anaconda36bis\lib\site-packages\PyInstaller\utils\hooks\__init__.py",
line 77, in __exec_python_cmd
txt = exec_python(*cmd, env=pp_env)
File "c:\anaconda36bis\lib\site-packages\PyInstaller\compat.py", line 562, in
exec_python
return exec_command(*cmdargs, **kwargs)
File "c:\anaconda36bis\lib\site-packages\PyInstaller\compat.py", line 369, in
exec_command
out = out.decode(encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 152: invali
d start byte
Run Code Online (Sandbox Code Playgroud)
我不清楚错误信息,我不明白为什么会这样.
pyinstaller是否可能尝试使用不兼容的模块?我在我的脚本中使用这些:
# -*- coding: utf-8 -*- …Run Code Online (Sandbox Code Playgroud) 我正在构建一个PyQt5应用程序,我希望它有一个黑暗的主题.以前我曾经使用Android开发,我可以为整个应用程序设置一个黑暗的主题
是否在Qt中内置了一个黑暗的主题(适用于应用程序中的所有小部件,这是跨平台的)?
我一直在试验QT5Python,使用pyqt5. 我注意到大多数教程都推荐使用pyuic5将 XML UI 转换为 Python 代码。我还看过一些教程,他们使用uic.loadUi("myui.ui")来动态加载XML UI. 这对我来说似乎是一个更简洁、更模块化的解决方案,但它似乎是一个不受欢迎的选择。是否有理由pyuic5使用更完善的解决方案来转换您的代码?
考虑这个mcve:
import math
import sys
import textwrap
import time
from pathlib import Path
from collections import defaultdict
from PyQt5.Qsci import QsciLexerCustom, QsciScintilla
from PyQt5.Qt import *
from pygments import lexers, styles, highlight, formatters
from pygments.lexer import Error, RegexLexer, Text, _TokenType
from pygments.style import Style
EXTRA_STYLES = {
"monokai": {
"background": "#272822",
"caret": "#F8F8F0",
"foreground": "#F8F8F2",
"invisibles": "#F8F8F259",
"lineHighlight": "#3E3D32",
"selection": "#49483E",
"findHighlight": "#FFE792",
"findHighlightForeground": "#000000",
"selectionBorder": "#222218",
"activeGuide": "#9D550FB0",
"misspelling": "#F92672",
"bracketsForeground": "#F8F8F2A5",
"bracketsOptions": "underline",
"bracketContentsForeground": "#F8F8F2A5",
"bracketContentsOptions": "underline",
"tagsOptions": …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关如何用 Python 编写国际象棋程序的教程。
它使用python-chess引擎。该引擎的函数显然会返回 SVG 数据,可用于显示棋盘。
import chess
import chess.svg
from IPython.display import SVG
board = chess.Board()
SVG(chess.svg.board(board=board,size=400))
Run Code Online (Sandbox Code Playgroud)
但是当我运行该代码时,我看到的只是终端中的一行,没有图像。
<IPython.core.display.SVG object>
本教程简要介绍了 Jupyter Notebooks 以及如何使用它们来显示 SVG 图像。我没有使用 Jupyter Notebooks 的经验,尽管我从 pip 安装了这个包并且稍微了解了如何使用它,但我在解决原来的棋盘问题上并没有取得太大进展。但我确实拥有使用 C++ 进行 Qt 开发的经验,并且由于 Qt 具有 Python 绑定,因此我决定使用这些绑定。
这是我写的:
import sys
import chess
import chess.svg
from PyQt5 import QtGui, QtSvg
from PyQt5.QtWidgets import QApplication
from IPython.display import SVG, display
app = QApplication(sys.argv);
board = chess.Board();
svgWidget = QtSvg.QSvgWidget(chess.svg.board(board=board, size=400));
#svgWidget.setGeometry(50,50,759,668)
svgWidget.show()
sys.exit(app.exec_()) …Run Code Online (Sandbox Code Playgroud) 升级您的操作系统总是有风险的。您很可能会遇到一些兼容性问题。我冒险将我的 macOS 从 Catalina 升级到最新的 Big Sur。之后,新操作系统中的显示看起来很漂亮,但是我所有的 PyQt5 应用程序都无法在这个新操作系统中启动。GUI 窗口没有像往常一样弹出,终端中也没有显示错误信息。我花了一整天的时间试图找出导致这个问题的原因。我找到了解决方案,但以一种奇怪的方式让我感到困惑。
事实证明,在我在主脚本中添加以下三行后,应用程序恢复正常。
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('TkAgg')
Run Code Online (Sandbox Code Playgroud)
在我看来,新操作系统与 Qt5Agg 后端存在一些兼容性问题。但奇怪的是,这个解决方案也适用于 Pyqt5 应用程序之一,我根本不使用 matplotlib。
我用的Python版本是3.8.4,我手上的PyQt5版本是5.15.1。
我希望有人可以向我解释使该解决方案起作用的幕后情况。我也希望这个临时解决方案可以帮助遇到同样问题的人。
pyqt5 ×10
python ×9
pyqt ×7
https ×1
matplotlib ×1
pandas ×1
pygments ×1
pyinstaller ×1
python-chess ×1
qscintilla ×1
qstyle ×1
qt ×1
qt5 ×1
qtableview ×1
scintilla ×1
ssl ×1
svg ×1