Tests from two days ago with conversion from PNG format to SVG format with the python potrace package ...


Python tutorials with source code, examples, guides, and tips and tricks for Windows and Linux development.


pip install potracer[cli]
Collecting potracer[cli]
...
Successfully installed potrace-cli-0.0.4 potracer-0.0.4dir(potrace)
['BezierSegment', 'Bitmap', 'COS179', 'CornerSegment', 'Curve', 'INFTY', 'Optional', 'POTRACE_CORNER',
'POTRACE_CURVETO', 'POTRACE_TURNPOLICY_BLACK', 'POTRACE_TURNPOLICY_LEFT', 'POTRACE_TURNPOLICY_MAJORITY',
'POTRACE_TURNPOLICY_MINORITY', 'POTRACE_TURNPOLICY_RANDOM', 'POTRACE_TURNPOLICY_RIGHT', 'POTRACE_TURNPOLICY_WHITE',
'Path', 'Tuple', 'Union', '_Curve', '_Path', '_Point', '_Segment', '_Sums', '__builtins__', '__cached__', '__doc__',
'__file__', '__loader__', '__name__', '__package__', '__spec__', '_adjust_vertices', '_bestpolygon', '_calc_lon',
'_calc_sums', '_opticurve', '_smooth', 'bezier', 'bm_to_pathlist', 'cprod', 'cyclic', 'ddenom', 'ddist', 'detrand',
'detrand_t', 'dorth_infty', 'dpara', 'findnext', 'findpath', 'floordiv', 'interval', 'iprod', 'iprod1', 'majority',
'math', 'mod', 'np', 'opti_penalty', 'opti_t', 'pathlist_to_tree', 'penalty3', 'pointslope', 'process_path', 'quadform',
'reverse', 'setbbox_path', 'sign', 'sq', 'tangent', 'xor_path', 'xor_to_ref', 'xprod']from PyQt6.QtWidgets import QStyleFactory
print(QStyleFactory.keys())
['windows11', 'windowsvista', 'Windows', 'Fusion']import sys
from PyQt6.QtWidgets import (
QApplication, QLabel, QLineEdit, QComboBox, QPushButton,
QCheckBox, QSlider, QVBoxLayout, QWidget
)
from PyQt6.QtCore import Qt
app = QApplication(sys.argv)
app.setStyle('windows11')
window = QWidget()
layout = QVBoxLayout(window)
# 1. QLabel
layout.addWidget(QLabel("Acesta este un QLabel"))
# 2. QLineEdit
layout.addWidget(QLineEdit("Text editabil"))
# 3. QComboBox
combo = QComboBox()
combo.addItems(["Optiunea 1", "Optiunea 2", "Optiunea 3"])
layout.addWidget(combo)
# 4. QCheckBox
layout.addWidget(QCheckBox("Bifează această opțiune"))
# 5. QSlider
slider = QSlider(Qt.Orientation.Horizontal)
layout.addWidget(slider)
# 5. QPushButton
button = QPushButton('Simple button !')
layout.addWidget(button)
# show the main windows
window.show()
sys.exit(app.exec())import sys
import ssl
import socket
from datetime import datetime
from cryptography import x509
from cryptography.hazmat.backends import default_backend
from PyQt6.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QLabel,
QLineEdit, QPushButton, QTextEdit
)
def fetch_certificate_raw(hostname):
"""
Connects to the server and retrieves the certificate in DER format.
Also returns a validation status message.
"""
# Create a default SSL context (validates certificates)
context = ssl.create_default_context()
try:
# First attempt: strict validation
with socket.create_connection((hostname, 443), timeout=5) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
der_cert = ssock.getpeercert(binary_form=True)
return der_cert, "Certificate is VALID"
except ssl.SSLError as e:
# Certificate is invalid → try to retrieve it anyway
try:
unverified_context = ssl._create_unverified_context()
with socket.create_connection((hostname, 443), timeout=5) as sock:
with unverified_context.wrap_socket(sock, server_hostname=hostname) as ssock:
der_cert = ssock.getpeercert(binary_form=True)
return der_cert, f"Certificate is INVALID: {str(e)}"
except Exception:
return None, f"Could not retrieve certificate: {str(e)}"
except Exception as e:
return None, f"Connection error: {str(e)}"
def parse_certificate(der_cert):
"""
Converts a DER-encoded certificate into a cryptography.x509 object.
"""
return x509.load_der_x509_certificate(der_cert, default_backend())
class CertViewer(QWidget):
"""
Main GUI window for the HTTPS certificate viewer.
"""
def __init__(self):
super().__init__()
self.setWindowTitle("HTTPS Certificate Checker")
self.setGeometry(200, 200, 700, 600)
layout = QVBoxLayout()
# Input label + text field
layout.addWidget(QLabel("Enter URL (example: example.com):"))
self.input = QLineEdit()
layout.addWidget(self.input)
# Button to trigger certificate check
self.button = QPushButton("Check Certificate")
self.button.clicked.connect(self.check_certificate)
layout.addWidget(self.button)
# Output text box
self.output = QTextEdit()
self.output.setReadOnly(True)
layout.addWidget(self.output)
self.setLayout(layout)
def check_certificate(self):
"""
Triggered when the user presses the button.
Retrieves and displays certificate information.
"""
hostname = self.input.text().strip()
# Clean URL (remove http://, https://, and paths)
for prefix in ("https://", "http://"):
if hostname.startswith(prefix):
hostname = hostname[len(prefix):]
hostname = hostname.split("/")[0]
# Fetch certificate
der_cert, status = fetch_certificate_raw(hostname)
if der_cert is None:
self.output.setText(status)
return
# Parse certificate
cert = parse_certificate(der_cert)
# Build output text
text = f"=== CERTIFICATE STATUS ===\n{status}\n\n"
text += "=== CERTIFICATE DETAILS ===\n\n"
text += f"Subject:\n{cert.subject}\n\n"
text += f"Issuer:\n{cert.issuer}\n\n"
text += f"Serial Number: {cert.serial_number}\n\n"
text += f"Version: {cert.version}\n\n"
text += f"Valid From: {cert.not_valid_before}\n"
text += f"Valid To: {cert.not_valid_after}\n\n"
# Check expiration
if cert.not_valid_after < datetime.utcnow():
text += f"⚠ Certificate EXPIRED on: {cert.not_valid_after}\n\n"
# Subject Alternative Names (SAN)
try:
san = cert.extensions.get_extension_for_class(x509.SubjectAlternativeName)
text += f"Subject Alternative Names:\n{san.value}\n\n"
except Exception:
text += "Subject Alternative Names: (none)\n\n"
self.output.setText(text)
if __name__ == "__main__":
app = QApplication(sys.argv)
viewer = CertViewer()
viewer.show()
sys.exit(app.exec())
import win32serviceutil
import win32service
import win32event
import servicemanagerpython service_test_001.py install
Installing service MyPythonService
Service installedimport win32serviceutil
import win32service
import win32event
import servicemanager
import time
class MyService(win32serviceutil.ServiceFramework):
_svc_name_ = "MyPythonService"
_svc_display_name_ = "My Python Windows Service"
_svc_description_ = "A minimal Windows service example written in Python."
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.stop_event = win32event.CreateEvent(None, 0, 0, None)
self.running = True
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.stop_event)
self.running = False
def SvcDoRun(self):
servicemanager.LogInfoMsg("MyPythonService is starting.")
self.main()
def main(self):
while self.running:
# Your service logic goes here
time.sleep(5)
servicemanager.LogInfoMsg("MyPythonService heartbeat.")
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(MyService)
pip install pywin32python C:\Python313\Scripts\pywin32_postinstall.py -install
Parsed arguments are: Namespace(install=True, remove=False, wait=None, silent=False, quiet=False, destination= ...D:\Python313_64bit>python
Python 3.13.0 (tags/v3.13.0:60403a5, Oct 7 2024, 09:38:07) [MSC v.1941 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import win32api
>>> print(win32api.GetVersion())
import sys
import csv
import os
import subprocess
from datetime import datetime
from PyQt6.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QCalendarWidget,
QInputDialog, QMessageBox
)
from PyQt6.QtCore import QDate
CSV_FILE = "note.csv"
class CalendarApp(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Calendar cu notițe")
self.resize(400, 300)
self.layout = QVBoxLayout()
self.setLayout(self.layout)
self.calendar = QCalendarWidget()
self.calendar.clicked.connect(self.adauga_nota)
self.layout.addWidget(self.calendar)
# Dicționar pentru notițe
self.note = {}
# La pornire, citește CSV și deschide în Notepad
self.incarca_note()
def adauga_nota(self, date: QDate):
zi = date.toString("yyyy-MM-dd")
text, ok = QInputDialog.getText(self, "Adaugă notiță",
f"Introdu text pentru {zi}:")
if ok and text.strip():
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M")
self.note[timestamp] = text.strip()
QMessageBox.information(self, "Salvat",
"Notița a fost adăugată.")
def incarca_note(self):
if os.path.exists(CSV_FILE):
try:
with open(CSV_FILE, "r", newline="", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
if len(row) == 2:
self.note[row[0]] = row[1]
# Deschide în Notepad
subprocess.Popen(["notepad.exe", CSV_FILE])
except Exception as e:
QMessageBox.warning(self, "Eroare",
f"Nu pot citi fișierul CSV:\n{e}")
def closeEvent(self, event):
try:
with open(CSV_FILE, "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
for timestamp, text in self.note.items():
writer.writerow([timestamp, text])
except Exception as e:
QMessageBox.warning(self, "Eroare",
f"Nu pot salva fișierul CSV:\n{e}")
event.accept()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = CalendarApp()
window.show()
sys.exit(app.exec())



import os
import sqlite3
import datetime
import requests
from bs4 import BeautifulSoup
import shutil
# Locația tipică pentru istoricul Edge (Windows)
edge_history_path = os.path.expanduser(
r"~\\AppData\\Local\\Microsoft\\Edge\\User Data\\Default\\History"
)
# Copiem fișierul History în folderul curent
def copy_history_file(src_path, dst_name="edge_history_copy.db"):
if not os.path.exists(src_path):
print("Nu am găsit istoricul Edge.")
return None
dst_path = os.path.join(os.getcwd(), dst_name)
try:
shutil.copy(src_path, dst_path)
print(f"Am copiat baza de date în {dst_path}")
return dst_path
except Exception as e:
print(f"Eroare la copiere: {e}")
return None
def extract_copilot_links(db_path):
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute("""
SELECT url, title, last_visit_time
FROM urls
WHERE url LIKE '%copilot%'
""")
results = []
for url, title, last_visit_time in cursor.fetchall():
ts = datetime.datetime(1601, 1, 1) + datetime.timedelta(microseconds=last_visit_time)
results.append({
"url": url,
"title": title,
"last_visit": ts.strftime("%Y-%m-%d %H:%M:%S")
})
conn.close()
return results
def fetch_conversation(url):
try:
resp = requests.get(url)
if resp.status_code == 200:
soup = BeautifulSoup(resp.text, "html.parser")
texts = soup.get_text(separator="\n", strip=True)
return texts
else:
return f"Eroare acces {url}: {resp.status_code}"
except Exception as e:
return f"Eroare acces {url}: {e}"
if __name__ == "__main__":
copy_path = copy_history_file(edge_history_path)
if copy_path:
chats = extract_copilot_links(copy_path)
if chats:
with open("copilot_conversations.txt", "w", encoding="utf-8") as f:
for chat in chats:
content = fetch_conversation(chat["url"])
f.write(f"=== Conversație: {chat['title']} ({chat['last_visit']}) ===\n")
f.write(content)
f.write("\n\n")
print("Am salvat conversațiile în copilot_conversations.txt")
else:
print("Nu am găsit conversații Copilot în istoricul Edge.")

class RangeSlider(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self._min, self._max = 0, 1000
self._start, self._end = 0, 1000
self._dragging = None
self.setMinimumHeight(24)
def setRange(self, minimum, maximum):
self._min, self._max = minimum, maximum
self._start, self._end = minimum, maximum
self.update()
def setStart(self, val):
self._start = max(self._min, min(val, self._end))
self.update()
def setEnd(self, val):
self._end = min(self._max, max(val, self._start))
self.update()
def start(self): return self._start
def end(self): return self._end
def _pos_to_val(self, x):
w = self.width()
ratio = max(0, min(x, w)) / w if w else 0
return int(self._min + ratio*(self._max-self._min))
def _val_to_pos(self, val):
w = self.width()
return int((val-self._min)/(self._max-self._min)*w) if self._max>self._min else 0
def mousePressEvent(self, e):
x = e.position().x()
sx, ex = self._val_to_pos(self._start), self._val_to_pos(self._end)
self._dragging = "start" if abs(x-sx)<abs(x-ex) else "end"
self.mouseMoveEvent(e)
def mouseMoveEvent(self, e):
if self._dragging:
val = self._pos_to_val(int(e.position().x()))
if self._dragging=="start": self.setStart(val)
else: self.setEnd(val)
def mouseReleaseEvent(self,e): self._dragging=None
def paintEvent(self,e):
p=QPainter(self); rect=self.rect()
sx,ex=self._val_to_pos(self._start),self._val_to_pos(self._end)
p.fillRect(rect,QColor(220,220,220))
p.fillRect(QRect(QPoint(sx,0),QPoint(ex,rect.height())),QColor(100,200,100,120))
p.setBrush(QColor(50,120,200)); p.setPen(Qt.PenStyle.NoPen)
p.drawEllipse(QPoint(sx,rect.center().y()),6,6)
p.drawEllipse(QPoint(ex,rect.center().y()),6,6)
pip install playwright
playwright installimport asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.firefox.launch(headless=False)
context = await browser.new_context()
page = await context.new_page()
await page.goto("https://www.google.com")
queries = [
"python automation",
"playwright tutorial",
"google search automation"
]
with open("results.txt", "w", encoding="utf-8") as f:
for q in queries:
# Fill search box
await page.fill("textarea[name='q']", q)
await page.press("textarea[name='q']", "Enter")
await page.wait_for_load_state("domcontentloaded")
# Scroll + pause
await page.evaluate("window.scrollBy(0, document.body.scrollHeight)")
await page.wait_for_timeout(3000)
# Extract search results (titles + links)
results = await page.query_selector_all("h3")
f.write(f"\nResults for: {q}\n")
for r in results[:5]: # primele 5 rezultate
title = await r.inner_text()
link_el = await r.evaluate_handle("node => node.parentElement")
link = await link_el.get_attribute("href")
f.write(f"- {title} ({link})\n")
print(f"Saved results for: {q}")
await browser.close()
asyncio.run(main())
python google_search_test_001.py
Saved results for: python automation
Saved results for: playwright tutorial
Saved results for: google search automation
Results for: python automation
Results for: playwright tutorial
- Playwright: Fast and reliable end-to-end testing for modern ... python -m pip install 'xonsh[full]'
pip install mitmproxy# addon.py
from mitmproxy import http
from mitmproxy import ctx
import re
BLOCKED_HOSTS = {
"hyte.com",
"ads.example.org",
}
REWRITE_RULES = [
# Each rule: (pattern, replacement, content_type_substring)
(re.compile(rb"Hello World"), b"Salut lume", "text/html"),
(re.compile(rb"tracking", re.IGNORECASE), b"observare", "text"),
]
ADD_HEADERS = {
"X-Debug-Proxy": "mitm",
"X-George-Tool": "true",
}
class GeorgeProxy:
def __init__(self):
self.rewrite_count = 0
def load(self, loader):
ctx.log.info("GeorgeProxy addon loaded.")
def request(self, flow: http.HTTPFlow):
# Block specific hosts early
host = flow.request.host
if host in BLOCKED_HOSTS:
flow.response = http.Response.make(
403,
b"Blocked by GeorgeProxy",
{"Content-Type": "text/plain"}
)
ctx.log.warn(f"Blocked request to {host}")
return
# Add custom headers to outgoing requests
for k, v in ADD_HEADERS.items():
flow.request.headers[k] = v
ctx.log.info(f"REQ {flow.request.method} {flow.request.url}")
def response(self, flow: http.HTTPFlow):
# Only process text-like contents
ctype = flow.response.headers.get("Content-Type", "").lower()
raw = flow.response.raw_content
if raw and any(t in ctype for t in ["text", "html", "json"]):
new_content = raw
for pattern, repl, t in REWRITE_RULES:
if t in ctype:
new_content, n = pattern.subn(repl, new_content)
self.rewrite_count += n
if new_content != raw:
flow.response.raw_content = new_content
# Update Content-Length only if present
if "Content-Length" in flow.response.headers:
flow.response.headers["Content-Length"] = str(len(new_content))
ctx.log.info(f"Rewrote content ({ctype}); total matches: {self.rewrite_count}")
ctx.log.info(f"RESP {flow.response.status_code} {flow.request.url}")
addons = [GeorgeProxy()]mitmdump -s addon.py
[21:46:04.435] Loading script addon.py
[21:46:04.504] GeorgeProxy addon loaded.
[21:46:04.506] HTTP(S) proxy listening at *:8080.
[21:46:18.547][127.0.0.1:52128] client connect
[21:46:18.593] REQ GET http://httpbin.org/get
[21:46:18.768][127.0.0.1:52128] server connect httpbin.org:80 (52.44.182.178:80)
[21:46:18.910] RESP 200 http://httpbin.org/get
127.0.0.1:52128: GET http://httpbin.org/get
<< 200 OK 353b
[21:46:19.019][127.0.0.1:52128] client disconnect
[21:46:19.021][127.0.0.1:52128] server disconnect httpbin.org:80 (52.44.182.178:80)curl -x http://127.0.0.1:8080 http://httpbin.org/get
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"Proxy-Connection": "Keep-Alive",
"User-Agent": "curl/8.13.0",
"X-Amzn-Trace-Id": "Root=1-692c9f0b-7eaf43e61f276ee62b089933",
"X-Debug-Proxy": "mitm",
"X-George-Tool": "true"
},
"origin": "84.117.220.94",
"url": "http://httpbin.org/get"
}Python Tornado – Key Capabilities
import tornado.ioloop
import tornado.web
import os
class FormHandler(tornado.web.RequestHandler):
def get(self):
self.render("form.html") # Render an HTML form
def post(self):
name = self.get_argument("name")
self.write(f"Hello, {name}!")
def make_app():
return tornado.web.Application([
(r"/form", FormHandler),
],
template_path=os.path.join(os.path.dirname(__file__), "templates") # <-- aici
)
if __name__ == "__main__":
app = make_app()
app.listen(8888)
print("Server pornit pe http://localhost:8888/form")
tornado.ioloop.IOLoop.current().start()
import os
from xai_sdk import Client
from xai_sdk.chat import user
client = Client(
api_key=os.getenv("XAI_API_KEY"),
api_host="us-east-1.api.x.ai" # Without the https://
)
chat = client.chat.create(model="grok-4")
chat.append(user("What is the meaning of life?"))
completion = chat.sample()