Python 创建线程安全的单例

之前在文章《深入理解 Python 中的类与元类》中讲了使用 __new__() 方法可以很方便地实现单例模式。但其实那段代码是线程不安全的。 验证代码如下: import threading import time class Singleton(object): _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: time.sleep(1) cls._instance = object.__new__…

Qt: 自定义 QWidget 响应 StyleSheet 样式

1. 必须重写 paintEvent() 根据官方文档的说明,如果希望自定义的 QWidget 派生类能够响应 StyleSheet 中定义的样式,就必须用如下代码重写 paintEvent() 方法。(其实应该叫做实现 paintEvent(),因为 QWidget::paintEvent() 本来是个空函数,啥都没做) 换成 Python + PySide6 语法就是: class CustomWidget(QWidget): def __init__(self, parent: QWidget = N…

QWidget 鼠标事件穿透

假设现在有两个重叠显示的 QWidget 部件,widget_1 与 widget_2。二者无父子关系,只是位置重叠,widget_1 在 widget_2 之上,如下图所示。 这个时候如果鼠标点击在 widget_1 上,widget_2 是不会响应鼠标事件的。因为事件被位于上层的 widget_1 捕获了。 如果我们想让鼠标事件穿透 widget_1,由 widget_2 捕获。就可以给 widget_1 设置 WA_TransparentForMouseEvents 属性,让它对所有鼠标事件“透明”。…

Python 项目目录结构与 pytest

最近在用 Python + Qt 做一个客户端项目,于是便重新梳理了一下项目目录结构,以及尝试用了下 pytest 写单元测试。 Python 项目的目录结构参考的是 stackoverflow 上的一位哥们的答案:how-are-python-projects-structured。   1 Python 项目目录结构 以下图为例: ① 项目(project)根目录叫做 TransferDog,项目的源码包(package)就叫做 transfer_dog。 ② 所有不应该暴露给用户的文件都要放…

WordPress 前端调试:无法删除中文命名的模板

1、不使用 min.js 在 wp-config.php 中增加一行 define( 'SCRIPT_DEBUG', true ); 即可让 WordPress 前端不使用 xx.min.js,直接使用 xx.js。 其他更多的调试设置,包括输出 php 日志、打印 sql 执行语句等,请阅读:debugging-in-wordpress 2、BUG,无法删除中文命名的模板 今天遇到一个 WordPress 自身的 BUG,就是当你在编辑文章的时候,创建了一个文章模板,并使用中文命名。然后当你删除这个模板的…

WordPress 技巧: 钩子、过滤器以及禁用字符转义 wptexturize()

这两天给网站换了一个不错的“文章目录”插件:ezTOC,然后无意中发现有些标题无法被正确跳转。查了半天,发现是跟 WordPress 的 wptexturize() 函数有关系。 一、WordPress 中的钩子与过滤器 钩子(hook)是 WordPress 中一种用来修改代码执行逻辑的机制。 1、首先在原来的代码中,使用 apply_filters($hook_name, ...) 或者 do_action($hook_name, ...),埋入一个钩子 hook_name,表示在此处执行这个 hook…

深入理解 Python 中的类与元类

最近在使用 peewee 来做数据库 ORM,期间遇到一些疑问便查了下源码,结果发现好多以前没有好好理解并整理的知识。 参考视频:https://www.bilibili.com/video/BV1uA411V7dW?p=1 关于 Python 中类的基本用法,参考以前写的文章 《python 小技巧与坑 - python 的类》 总结: 对象(obj)是类(class)的一个实例,而类(class)本身其实也是一个对象,它是元类(metaclass)的实例。 在 Python 中,默认情况下,所有类的元类…

Qt:QWidget 的绘制逻辑(源码分析)

一、QWidget QWidget 既是 QObject 的子类,也是 QPaintDevice 的子类! 而 QPainter 类实例,都要有一个目标 device! TLW(Top Level Widget)顶层窗口,可以看作是 “没有 parent 的 widget” 或者 “widget.window() == self 的 widget”。当调用 widget.show() 的时候,tlw 作为一个独立窗口显示在屏幕上,non top level widget 则作为一个内部控件显示在某个 tlw…

Qt: 自定义 QTreeView(2)- 显示自定义 widget 以及 GIF

本文所涉及代码:https://github.com/funway/TestQTreeView 一、自定义 Widget 由于我们的自定义 widget 是由几种内建 widget 组合而来,所以不需要在 paintEvent() 方法中进行手工绘制。parent widget 会自动调用 child widgets 的绘制方法 paintEvent()。 注意,在 QLabel 中加载要缩放的图片时,最好用 QLabel.setPixmap( QIcon().pixmap(w, h) ),而不是 QLab…