我正在尝试使用 PyQt5 中的基本语法突出显示、代码完成和可点击的函数和变量来制作一个简单的文本编辑器。我最大的希望是使用 PyQt5 的 QScintilla 端口
。
我在 Eli Bendersky 网站 ( http://eli.thegreenplace.net/2011/04/01/sample-using-qscintilla-with-pyqt )上找到了以下基于 QScintilla 的文本编辑器示例,Victor S. 已将其改编为 PyQt5 )。我认为这个例子是一个很好的起点:
#-------------------------------------------------------------------------
# qsci_simple_pythoneditor.pyw
#
# QScintilla sample with PyQt
#
# Eli Bendersky (eliben@gmail.com)
# This code is in the public domain
#-------------------------------------------------------------------------
import sys
import sip
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.Qsci import QsciScintilla, QsciLexerPython
class SimplePythonEditor(QsciScintilla):
ARROW_MARKER_NUM = 8
def __init__(self, parent=None):
super(SimplePythonEditor, self).__init__(parent)
# Set the default …Run Code Online (Sandbox Code Playgroud) 我对STM32F7器件(STMicroelectronics的Cortex-M7微控制器)上的时钟系统感到困惑.参考手册没有充分说明这些时钟之间的差异:
参考手册在"5.2时钟>> "章节中读取."RCC通过AHB时钟(HCLK)除以8来提供Cortex系统定时器(SysTick)的外部时钟".
这个陈述与CubeMX的数字相矛盾.请注意,在CubeMX中,我可以选择从HCLK到'Cortex系统定时器'的预分频器.它不一定是8分.
我正在用Python编写软件.我需要将Matplotlib时间动画嵌入到自制的GUI中.以下是有关它们的更多详细信息:
GUI也是用Python编写的,使用PyQt4库.我的GUI与您在网上可以找到的常见GUI没有太大区别.我只是继承QtGui.QMainWindow并添加一些按钮,布局,......
Matplotlib动画基于animation.TimedAnimation类.这是动画的代码:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
import matplotlib.animation as animation
class CustomGraph(animation.TimedAnimation):
def __init__(self):
self.n = np.linspace(0, 1000, 1001)
self.y = 1.5 + np.sin(self.n/20)
#self.y = np.zeros(self.n.size)
# The window
self.fig = plt.figure()
ax1 = self.fig.add_subplot(1, 2, 1)
self.mngr = plt.get_current_fig_manager()
self.mngr.window.setGeometry(50,100,2000, 800)
# ax1 settings
ax1.set_xlabel('time')
ax1.set_ylabel('raw data')
self.line1 = Line2D([], [], color='blue')
ax1.add_line(self.line1)
ax1.set_xlim(0, 1000)
ax1.set_ylim(0, 4)
animation.TimedAnimation.__init__(self, self.fig, interval=20, blit=True)
def …Run Code Online (Sandbox Code Playgroud) 即使是最新的 Eclipse Neon 版本在 4k 显示器上仍然有一些小图标。这就是为什么我试图让它们变得更大。为此,我从头开始构建 Eclipse IDE。

请阅读此 StackOverflow 问题以了解我是如何做到的:
从头开始构建 Eclipse IDE - 如何选择 CDT 而不是 JDT?
我编写了一个 Windows 批处理文件,它运行在所有文件夹中并更改它可以找到的每个图标的大小。在我的批处理文件,我相信每一个.png,.gif,.bmp,.jpg并且.ico其尺寸文件低于48×48像素的图标。我把尺寸加倍。
我在开始构建之前运行该批处理文件。
我得到了好坏参半的结果。下图显示一些图标确实变大了 - 但其他图标没有。以debug icon. 看起来它的尺寸仍然是旧的 16x16 像素。也许我的批处理文件不完整,它以某种方式跳过了那个。所以我检查了 eclipse 源代码文件夹并找到了debug icon. 它是 32x32 像素!所以我的批处理文件是正确的。为什么eclipse构建不能正确使用它?
任何帮助将非常感激。如果我成功使所有图标变大,我保证与所有人分享解决方案(并提及您的贡献):-)
我相信小的 Eclipse 图标对于所有具有高 dpi 显示器的人或那些没有鹰眼的人来说都是一个真正的痛苦。开发代码不应该是那些视力敏锐的人的特权——它应该是所有人都可以访问的。
PS:我还有一些与 Eclipse“从头开始构建”主题相关的其他问题。如果你有兴趣:
让我们大家联合起来自己构建 Eclipse IDE …
我的最终目标是将stdout几个子进程重定向到一些队列,并将它们打印在某处(可能在一个小 GUI 中)。
第一步是将子类Queue化为一个行为与stdout. 但这就是我被卡住的地方。Queue在 Python v3.5 中子类化多处理似乎是不可能的。
# This is a Queue that behaves like stdout
# Unfortunately, doesn't work in Python 3.5 :-(
class StdoutQueue(Queue):
def __init__(self,*args,**kwargs):
Queue.__init__(self,*args,**kwargs, ctx='')
def write(self,msg):
self.put(msg)
def flush(self):
sys.__stdout__.flush()
Run Code Online (Sandbox Code Playgroud)
我在下面的帖子中找到了这个片段(可能当时 Python 3.5 还不存在):Python multiprocessing redirect stdout of a child process to a Tkinter Text
在 Python v3.5 中,您在继承多处理Queue类时会偶然发现奇怪的错误消息。我发现了两个描述该问题的错误报告:
https://bugs.python.org/issue21367
https://bugs.python.org/issue19895
我有两个问题:
编辑 : …
我更喜欢在不考虑图形用户界面的情况下编写我的应用程序。一旦应用程序代码正常工作,我喜欢在它上面粘贴一个 GUI 层——两者之间有一个干净的界面。
我首先尝试使 GUI 在与应用程序不同的进程中运行。但我很快就后悔了那个实验。在两个进程之间建立通信链接绝非易事。所以我决定现在,多线程没问题(尽管 Python Global Interpreter Lock 使它们在单个内核上运行)。
该MainThread完全是在Qt的图形用户界面的手中。显然这是标准做法。所以让我们假设软件的整体结构应该是这样的(注意qtThread是MainThread 的同义词):
我的应用程序代码在appThread 中运行- 与 GUI 完全分离。但在某些时候,必须有互动。
我已经阅读了很多关于如何组织它的文章,但许多来源相互矛盾。根据很多人的说法,即使是官方的 Qt 应用程序也是错误的(官方文档鼓励对 QThread 进行子类化)。我能找到的最有启发性的文章是这些:
http://ilearnstuff.blogspot.be/2012/08/when-qthread-isnt-thread.html http://ilearnstuff.blogspot.be/2012/09/qthread-best-practices-when-qthread.html
即使考虑了所有这些,我仍然对一些事情保持怀疑。
问题 1. 启动appThread最合适的方式是什么?
启动appThread的最正确方法是什么?如果我错了,请纠正我,但我认为有两种选择:
选择 1:启动标准 Python 线程
Python 提供了threading可以导入以生成新线程的库:
import threading
if __name__ == '__main__':
# 1. Create the qt thread (is MainThread in fact)
qtApp = QApplication(sys.argv)
QApplication.setStyle(QStyleFactory.create('Fusion'))
# 2. …Run Code Online (Sandbox Code Playgroud) 我是ctags的新手。阅读有关程序的一些信息后,我得出结论,“通用ctags”是最新版本(“丰富的ctags”的后继版本),并且仍在积极开发中:https ://ctags.io/
大多数人在Linux上使用它。由于某些特定原因,我需要在Windows上使用它(更准确地说,是Windows 10,64位)。我正在寻找通用ctags的可执行文件。
您知道在哪里下载这样的可执行文件吗?
PS:我对cygwin方法不感兴趣(再次出于某些特定原因,但这会使我们在这里走得太远了)。
编辑:为了更好地了解ctags输出,请参考以下问题:了解ctags文件格式
我正在使用 Qt 框架来构建我的图形用户界面。我使用QGridLayout来整齐地放置我的 QWidget。
图形用户界面如下所示:
我的应用程序定期在运行时向 GUI 添加新的小部件。这些新的小部件通常不会添加在 QLayout 的末尾,而是添加在中间的某个位置。
执行此操作的过程有点麻烦。应用到上图中,我需要从 QGridLayout 中取出widg_C, , ... 。widg_D接下来,我添加widg_x和widg_y,最后我再次将其他小部件放回去。
这就是我从 QGridLayout 中删除小部件的方法:
for i in reversed(range(myGridLayout.count())):
self.itemAt(i).widget().setParent(None)
###
Run Code Online (Sandbox Code Playgroud)
只要您处理的是少量小部件,这个过程就不是一场灾难。但在我的应用程序中,我显示了很多小部件 - 也许 50 个或更多!当这个过程正在进行时,应用程序会冻结一秒钟,这对用户来说非常烦人。
有没有一种方法可以在 QLayout 中的某个位置插入小部件,而不需要取出其他小部件?
编辑:显然 QVBoxLayout 的解决方案非常简单。只需使用该函数insertWidget(..)而不是addWidget(..). 可以通过此链接找到文档:http://doc.qt.io/qt-5/qboxlayout.html#insertWidget
不幸的是,我找不到 QGridLayout 的类似功能。
编辑:许多人正确地提到,放回大量小部件不应导致性能问题 - 它确实非常快(谢谢@ekhumoro 指出这一点)。显然,我面临的性能问题与将小部件放回原处的算法有关。这是一个相当复杂的递归算法,它将每个小部件放在 QGridLayout 中的正确坐标上。这导致我的显示器出现“闪烁”。小部件被取出,然后放回内部,有一些延迟(由于算法) - 导致闪烁。
编辑:我找到了一个解决方案,这样我可以轻松地将新行插入到 QGridLayout 中。插入新行意味着我不需要从头开始取出并替换所有小部件 - 因此我避免了运行昂贵的递归算法。
解决方案可以在我下面的回答中找到。
我知道最新的 STM32 微控制器中的 RAM 存储器包含几个具有显着速度差异的部分。这就是为什么我试图围绕这些设备的链接描述文件(注意:arm-none-eabi-gcc工具链)。不幸的是,CubeMX 为 STM32F767ZI 生成的链接描述文件只是忽略了 RAM 中的不同部分:
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 512K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K
}
Run Code Online (Sandbox Code Playgroud)
STMicroelectronics 似乎已经做了一些努力,使其最新的STM32H743ZI的链接描述文件更加复杂:
/* Specify the memory areas */
MEMORY
{
DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
RAM_D1 (xrw) : ORIGIN = 0x24000000, LENGTH = 512K
RAM_D2 (xrw) : ORIGIN = 0x30000000, LENGTH = 288K …Run Code Online (Sandbox Code Playgroud) 我正在编写一个在Windows和Linux上都可以使用的makefile。因此,我尽可能避免使用特定于OS的Shell命令。
这是我的makefile中的片段,clean最后是函数:
# OS specific part
# -----------------
ifeq ($(OS),Windows_NT)
RM = del /F /Q
RMDIR = -RMDIR /S /Q
MKDIR = -mkdir
ERRIGNORE = 2>NUL || (exit 0)
SEP=\\
else
RM = rm -rf
RMDIR = rm -rf
MKDIR = mkdir -p
ERRIGNORE = 2>/dev/null
SEP=/
endif
PSEP = $(strip $(SEP))
# Definitions for nullstring and space
# -------------------------------------
nullstring :=
space := $(nullstring) #End
# Lists of all files and folders to keep or remove
# …Run Code Online (Sandbox Code Playgroud)