- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在为 Python 使用 PyQt
,并且正在构建一个图形用户界面。几周前我遇到了一个问题,我在 gui 模块之外有一个函数修改 gui 中的小部件(高级进度条、更新字符串等),并且这些修改没有反射(reflect)在 gui 中,直到函数更改完成运行。
对此的解决方案是在完成我想要的任何修改后简单地调用 app.processEvents()
,这将立即更新窗口的图形。
但现在我想知道,有没有办法在每次提前窗口时都这样做?
假设我调用了一个函数来修改进度条,但是这个函数需要很长时间才能运行。在调用该函数和修改进度条之间,app
不处理任何事件。所以,在这段时间里,我拉出一个 Chrome 窗口(或其他任何东西),然后关闭它,我的 gui 窗口是空白的,只是灰色,直到 app.processEvents()
再次被调用。
PyQt
中的功能是否允许我检测窗口何时被带到所有当前窗口的前面?
最佳答案
你应该看看QThread .
线程允许您在worker 线程中运行长时间、复杂的任务,而background 线程保持 GUI 响应,例如更新 QProgressBar,确保它响应运动事件。
基本思路是这样的:
# load modules
import time
from PySide import QtCore, QtGui
# APPLICATION STUFF
# -----------------
APP = QtGui.QApplication([])
# THREADS
# -------
class WorkerThread(QtCore.QThread):
'''Does the work'''
def __init__(self):
super(WorkerThread, self).__init__()
self.running = True
def run(self):
'''This starts the thread on the start() call'''
# this goes over 1000 numbers, at 10 a second, will take
# 100 seconds to complete, over a minute
for i in range(1000):
print(i)
time.sleep(0.1)
self.running = False
class BackgroundThread(QtCore.QThread):
'''Keeps the main loop responsive'''
def __init__(self, worker):
super(BackgroundThread, self).__init__()
self.worker = worker
def run(self):
'''This starts the thread on the start() call'''
while self.worker.running:
APP.processEvents()
print("Updating the main loop")
time.sleep(0.1)
# MAIN
# ----
def main():
# make threads
worker = WorkerThread()
background = BackgroundThread(worker)
# start the threads
worker.start()
background.start()
# wait until done
worker.wait()
if __name__ == '__main__':
main()
你得到的输出是这样的,展示了它是如何轮流进行长计算和更新主循环的:
0
Updating the main loop
1
Updating the main loop
2
Updating the main loop
3
Updating the main loop
4
Updating the main loop
5
Updating the main loop
6
Updating the main loop
Updating the main loop7
8
Updating the main loop
9
这连同一个QFocusEvent覆盖应该允许你做任何你想做的事。但最好将更新 GUI 和运行所需的长线程分开。
至于重写 QFocusEvent,您可以执行以下操作:
def focusInEvent(self, event):
event.accept()
# insert your code here
如果您选择实现线程以避免 GUI 阻塞,您应该阅读 basics of threading (因为线程有很多细微差别,除非您知道它们的潜在陷阱)。
关于python - 如何让 QtGui 窗口在屏幕上显示时处理事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34419926/
我创建了一个小型文本编辑器,用户可以通过将鼠标悬停在文本 block 上并旋转鼠标滚轮来增加字体大小。到目前为止,该部分正在发挥作用。我的问题是关于可视化字体大小的变化。 我想在鼠标位置画一个圆圈并在
我刚刚安装了 Mac OS X 10.8.3 和 Qt Creator 3、XCode 和 XCode 命令行工具。我正在尝试编译一个在另一台计算机上运行的项目,但每次我去“全部构建”时,我都会得到
请注意 redb.clicked[bool].connect(self.setColor) 行,为什么要添加 [bool] 部分?我试图删除该部分,将行修改为 redb.clicked.connect
在不同的 Windows 系统上打开相同的 QtGui 会导致标签大小或框架大小的不同显示,这让事情变得难看。我已经用 cx_freeze 编译了我的 pyqt4 应用程序到 .exe 文件,当我在另
我正在使用 Python 的日历小部件。我需要在单击按钮时调用小部件。情况是我找不到日历类中显示小部件本身的方法是什么。日历类取自这里: http://www.eurion.net/python-sn
我正在编写一个 QT 应用程序,我希望编译后的二进制文件与 GUI 和 CLI(未安装 X11)环境兼容。 以下是我使用 QApplication 或 QCoreApplication 的主要功能:
我对 Python 和 Qt 相当陌生,但我正在尝试使用一些动画图形元素创建一个 GUI。我可以制作一个简单的动画作品;在下面的代码中,class MyView 将在调用时工作,但 class Gra
这是我第一次使用 stackoverflow 来寻找问题的答案。我正在使用 QtGui.QTextEdit 来显示类似于下面的文本,并希望根据某些行是否包含某些文本来更改文本的颜色。 以 --[ 开头
我想知道是否有办法自定义进度条的颜色(QtGui.QProgressBar)。假设我们希望在条形图达到 100% 时将其变为绿色。 这是一个工作示例: import sys, time from Py
这个问题听起来很简单,但我一直在努力解决它。 我有 a.h, b.h, c.h, mainwindow.h 和a.cpp、b.cpp、c.cpp、main.cpp、mainwindow.cpp 在a、
我有一个 QtGui.QTableWidgetItem,我通过下面的 createRow 函数添加到表格中: def createRow(self, listA): rowNum = self
我正在为 Python 使用 PyQt,并且正在构建一个图形用户界面。几周前我遇到了一个问题,我在 gui 模块之外有一个函数修改 gui 中的小部件(高级进度条、更新字符串等),并且这些修改没有反射
当我创建实现 QWidget、QGraphicsView、QGraphicsItem 等的类时...我总是只包含 QtGui 而不是 QtWidget、QGraphicsView 等...这是不好的做
我安装了 Python 2.6,并且刚刚安装了为 Python 2.6 构建的 PyQt4(可在 http://www.riverbankcomputing.co.uk/software/pyqt/d
我安装了 Python 2.6,并且刚刚安装了为 Python 2.6 构建的 PyQt4(可在 http://www.riverbankcomputing.co.uk/software/pyqt/d
我在这个 windows 7 32 位上安装了 python3.3 x86(官方 python.org 安装程序) 然后从这里为 python3.3 windows x86 安装 PyQt4-4.10
如何从命令行爆炸 QSound? 在 PyQt4 下,playSound.py 可以像这样简单: QtGui.QSound('start.wav').play() 除非它在没有 .exec() 样式的
使用最新的 pyinstaller在 Windows 7 上制作独立的 exe (-F),运行 exe 时: ImportError: cannot import name QtGui 在 pyins
我正在尝试在 PyQt5 中绘制矩形。但有些事情总是不适合我。我指的是“QPainterPath 文档”,有这个例子: path = QPainterPath() path.addRect(20, 2
我正在Python2.7中使用Pyqt4构建用户界面,但是......当我单击“保存”按钮时,总是出现类型错误,即 TypeError: QFileDialog.getSaveFileName(QWi
我是一名优秀的程序员,十分优秀!