...the data set includes 3,468 responses.
See this survey on the official website.
Python tutorials with source code, examples, guides, and tips and tricks for Windows and Linux development.




import tkinter as tk
from tkinter import colorchooser
def choose_color():
# Opens the color picker dialog and returns a tuple: ((R, G, B), "#HEX")
color = colorchooser.askcolor(title="Choose a Background Color")
# Check if the user selected a color (didn't click Cancel)
if color[1]:
hex_code = color[1]
root.config(bg=hex_code)
label_color.config(text=f"HEX Code: {hex_code}", bg=hex_code)
# Create the main window
root = tk.Tk()
root.title("Tkinter Colorchooser Example")
root.geometry("300x200")
# Button to trigger the color chooser dialog
btn_choose = tk.Button(root, text="Select Color", command=choose_color)
btn_choose.pack(pady=30)
# Label to display the chosen HEX code
label_color = tk.Label(root, text="No color selected", font=("Arial", 12))
label_color.pack(pady=10)
root.mainloop()
import html
import tkinter as tk
from tkinter import ttk, messagebox
def paste_from_clipboard():
try:
text_input.insert(tk.INSERT, root.clipboard_get())
except Exception:
try:
text_input.focus_set()
text_input.event_generate("<<Paste>>")
except Exception:
pass
def process_code():
raw_code = text_input.get("1.0", tk.END).strip()
if not raw_code:
return
try:
# 1. Escapam caracterele speciale HTML (<, >, &, ")
escaped_code = html.escape(raw_code)
# 2. Includem codul convertit in structura div -> pre -> code
formatted_result = f"<div><pre><code>{escaped_code}</code></pre></div>"
# 3. Afisam rezultatul
text_output.config(state=tk.NORMAL)
text_output.delete("1.0", tk.END)
text_output.insert(tk.END, formatted_result)
text_output.config(state=tk.DISABLED)
except Exception as e:
messagebox.showerror("Eroare", f"A aparut o eroare la conversie: {e}")
def copy_to_clipboard():
cleaned_text = text_output.get("1.0", tk.END).strip()
if cleaned_text:
try:
root.clipboard_clear()
root.clipboard_append(cleaned_text)
messagebox.showinfo("OK", "Copiat in clipboard!")
except Exception as e:
messagebox.showerror("Eroare", f"Nu s-a putut copia: {e}")
def clear_all():
text_input.delete("1.0", tk.END)
text_output.config(state=tk.NORMAL)
text_output.delete("1.0", tk.END)
text_output.config(state=tk.DISABLED)
# Constructie Interfata
root = tk.Tk()
root.title("Code Escaper for Blogger")
root.geometry("400x600")
# Input
lbl1 = ttk.Label(root, text="1. Cod Sursa de Convertit:")
lbl1.pack(anchor="w", padx=10, pady=(10, 0))
frame_btns = ttk.Frame(root)
frame_btns.pack(fill=tk.X, padx=10, pady=5)
btn_paste = ttk.Button(frame_btns, text="Lipeste (Paste)", command=paste_from_clipboard)
btn_paste.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=(0, 5))
btn_clear = ttk.Button(frame_btns, text="Sterge", command=clear_all)
btn_clear.pack(side=tk.RIGHT)
text_input = tk.Text(root, height=8)
text_input.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
# Procesare
btn_process = ttk.Button(root, text="Converteste pentru Blogger", command=process_code)
btn_process.pack(fill=tk.X, padx=10, pady=5)
# Output
lbl2 = ttk.Label(root, text="2. Rezultat de pus in Blogger:")
lbl2.pack(anchor="w", padx=10, pady=(5, 0))
text_output = tk.Text(root, height=8, state=tk.DISABLED)
text_output.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
btn_copy = ttk.Button(root, text="Copiaza Rezultatul", command=copy_to_clipboard)
btn_copy.pack(fill=tk.X, padx=10, pady=(5, 10))
root.mainloop()
import tkinter as tk
from tkinter import ttk, messagebox
from bs4 import BeautifulSoup
def paste_from_clipboard():
try:
text_input.insert(tk.INSERT, root.clipboard_get())
except Exception:
try:
text_input.focus_set()
text_input.event_generate("<<Paste>>")
except Exception:
pass
def process_html():
raw_html = text_input.get("1.0", tk.END).strip()
if not raw_html:
return
try:
soup = BeautifulSoup(raw_html, "html.parser")
# 1. Eliminare completă tag-uri style și script
for tag in soup.find_all(["style", "script"]):
tag.decompose()
# 2. Eliminare ancore (<a>) și păstrare conținut
for a_tag in soup.find_all("a"):
a_tag.unwrap()
# 3. Eliminare atribute 'style' și 'class' de pe TOATE elementele
attributes_to_remove = ["style", "class"]
for tag in soup.find_all(True):
for attr in attributes_to_remove:
if attr in tag.attrs:
del tag.attrs[attr]
cleaned_html = str(soup)
text_output.config(state=tk.NORMAL)
text_output.delete("1.0", tk.END)
text_output.insert(tk.END, cleaned_html)
text_output.config(state=tk.DISABLED)
except Exception as e:
messagebox.showerror("Eroare", f"A aparut o eroare la procesare: {e}")
def copy_to_clipboard():
cleaned_text = text_output.get("1.0", tk.END).strip()
if cleaned_text:
try:
root.clipboard_clear()
root.clipboard_append(cleaned_text)
messagebox.showinfo("OK", "Copiat in clipboard!")
except Exception as e:
messagebox.showerror("Eroare", f"Nu s-a putut copia: {e}")
def clear_all():
text_input.delete("1.0", tk.END)
text_output.config(state=tk.NORMAL)
text_output.delete("1.0", tk.END)
text_output.config(state=tk.DISABLED)
# Constructie Interfata
root = tk.Tk()
root.title("HTML Cleaner")
root.geometry("400x600")
# Input
lbl1 = ttk.Label(root, text="1. Sursa HTML:")
lbl1.pack(anchor="w", padx=10, pady=(10, 0))
frame_btns = ttk.Frame(root)
frame_btns.pack(fill=tk.X, padx=10, pady=5)
btn_paste = ttk.Button(frame_btns, text="Lipeste (Paste)", command=paste_from_clipboard)
btn_paste.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=(0, 5))
btn_clear = ttk.Button(frame_btns, text="Sterge", command=clear_all)
btn_clear.pack(side=tk.RIGHT)
text_input = tk.Text(root, height=8)
text_input.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
# Procesare
btn_process = ttk.Button(root, text="Proceseaza HTML", command=process_html)
btn_process.pack(fill=tk.X, padx=10, pady=5)
# Output
lbl2 = ttk.Label(root, text="2. Rezultat Curatat:")
lbl2.pack(anchor="w", padx=10, pady=(5, 0))
text_output = tk.Text(root, height=8, state=tk.DISABLED)
text_output.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
btn_copy = ttk.Button(root, text="Copiaza Rezultatul", command=copy_to_clipboard)
btn_copy.pack(fill=tk.X, padx=10, pady=(5, 10))
root.mainloop()
import tkinter as tk
from tkinter import scrolledtext, messagebox, ttk
import os
# Possible paths for Acode.log (paid + free version)
POSSIBLE_PATHS = [
"/storage/emulated/0/Android/data/com.foxdebug.acode/files/Acode.log",
"/storage/emulated/0/Android/data/com.foxdebug.acode.free/files/Acode.log",
"/storage/emulated/0/Android/data/com.foxdebug.acode/files/logs/Acode.log",
"/storage/emulated/0/Android/data/com.foxdebug.acode.free/files/logs/Acode.log",
"/sdcard/Android/data/com.foxdebug.acode/files/Acode.log",
"/sdcard/Android/data/com.foxdebug.acode.free/files/Acode.log",
]
class AcodeLogViewer:
def __init__(self, root):
self.root = root
self.root.title("Acode.log Viewer - Pydroid 3")
self.root.geometry("900x650")
self.root.minsize(600, 400)
self.found_path = None
self.file_content = ""
self.create_menu()
self.create_widgets()
self.search_and_load()
def create_menu(self):
"""Create the main application menu."""
menubar = tk.Menu(self.root)
self.root.config(menu=menubar)
# File menu
file_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label="File", menu=file_menu)
file_menu.add_command(label="Reload", command=self.search_and_load, accelerator="Ctrl+R")
file_menu.add_command(label="Copy All", command=self.copy_to_clipboard, accelerator="Ctrl+C")
file_menu.add_separator()
file_menu.add_command(label="Exit", command=self.root.quit, accelerator="Ctrl+Q")
# Keyboard shortcuts
self.root.bind("", lambda e: self.search_and_load())
self.root.bind("", lambda e: self.copy_to_clipboard())
self.root.bind("", lambda e: self.root.quit())
def create_widgets(self):
# Text area with scrollbars
text_frame = ttk.Frame(self.root, padding=8)
text_frame.pack(fill=tk.BOTH, expand=True)
self.text_area = scrolledtext.ScrolledText(
text_frame,
wrap=tk.NONE,
font=("Courier New", 10),
state=tk.DISABLED
)
self.text_area.pack(fill=tk.BOTH, expand=True)
# Horizontal scrollbar
h_scroll = ttk.Scrollbar(text_frame, orient=tk.HORIZONTAL, command=self.text_area.xview)
h_scroll.pack(fill=tk.X)
self.text_area.configure(xscrollcommand=h_scroll.set)
# Status bar – displays the found file path
self.status_var = tk.StringVar(value="Ready.")
status_bar = ttk.Label(
self.root,
textvariable=self.status_var,
relief=tk.SUNKEN,
anchor=tk.W,
padding=(6, 3)
)
status_bar.pack(fill=tk.X, side=tk.BOTTOM)
def search_and_load(self):
self.found_path = None
self.file_content = ""
for path in POSSIBLE_PATHS:
if os.path.isfile(path):
self.found_path = path
break
if self.found_path is None:
self.status_var.set("Acode.log file not found in the known locations.")
self.display_text(
"The Acode.log file could not be located.\n\n"
"Please verify that the Acode application has already generated the log "
"and that Pydroid 3 has storage access permissions."
)
return
try:
with open(self.found_path, "r", encoding="utf-8", errors="replace") as f:
self.file_content = f.read()
size_kb = len(self.file_content.encode("utf-8")) / 1024
lines = len(self.file_content.splitlines())
# Full path + additional information in the status bar
self.status_var.set(
f"{self.found_path} • {size_kb:.1f} KB • {lines} lines"
)
self.display_text(self.file_content)
except Exception as e:
self.status_var.set(f"Error reading file: {self.found_path}")
self.display_text(f"Unable to read the file:\n{str(e)}")
def display_text(self, content):
self.text_area.config(state=tk.NORMAL)
self.text_area.delete("1.0", tk.END)
self.text_area.insert(tk.END, content)
self.text_area.config(state=tk.DISABLED)
self.text_area.see("1.0")
def copy_to_clipboard(self):
if not self.file_content:
messagebox.showwarning("Clipboard", "There is no content to copy.")
return
try:
self.root.clipboard_clear()
self.root.clipboard_append(self.file_content)
self.root.update()
self.status_var.set(f"Content copied • {self.found_path or 'N/A'}")
messagebox.showinfo("Clipboard", "The entire log content has been copied to the clipboard.")
except Exception as e:
messagebox.showerror("Clipboard Error", f"Unable to copy to clipboard:\n{str(e)}")
if __name__ == "__main__":
root = tk.Tk()
app = AcodeLogViewer(root)
root.mainloop() 
import tkinter as tk
from tkinter import messagebox, ttk
import webbrowser
import feedparser
RSS_URL = "https://blog.python.org/feeds/posts/default"
article_links = []
def clean_text(text):
"""Converts text to basic ASCII to strip non-supported Android Tkinter characters."""
if not text:
return ""
# Encodes to ASCII ignoring emojis, special quotes, and unsupported byte sequences
clean = text.encode("ascii", "ignore").decode("ascii")
# Removes extra whitespace and linebreaks
return " ".join(clean.split())
def load_feed():
global article_links
listbox.delete(0, tk.END)
article_links.clear()
status_label.config(text="Fetching articles...", foreground="blue")
root.update()
try:
feed = feedparser.parse(RSS_URL)
if not feed.entries:
status_label.config(text="No articles found.", foreground="red")
return
for entry in feed.entries:
title_raw = entry.get("title", "Untitled")
title = clean_text(title_raw)
link = entry.get("link", "")
listbox.insert(tk.END, title)
article_links.append(link)
status_label.config(
text=f"Loaded {len(feed.entries)} articles!", foreground="green"
)
except Exception as e:
status_label.config(text="Connection error!", foreground="red")
messagebox.showerror("Error", f"Failed to load feed:\n{e}")
def open_link(event):
try:
index = listbox.curselection()[0]
url = article_links[index]
if url:
webbrowser.open(url)
except IndexError:
pass
# --- GUI Setup ---
root = tk.Tk()
root.title("Python Foundation RSS Reader")
root.geometry("600x800")
title_label = ttk.Label(
root, text="Python Software Foundation Blog", font=("Helvetica", 14, "bold")
)
title_label.pack(pady=10)
refresh_btn = ttk.Button(root, text="Refresh", command=load_feed)
refresh_btn.pack(pady=5)
status_label = ttk.Label(
root, text="Connecting...", font=("Helvetica", 10)
)
status_label.pack(pady=5)
frame = ttk.Frame(root)
frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
scrollbar = ttk.Scrollbar(frame, orient=tk.VERTICAL)
listbox = tk.Listbox(
frame,
font=("Helvetica", 11),
selectbackground="#007ACC",
selectforeground="white",
activestyle="none",
yscrollcommand=scrollbar.set,
bd=1,
relief="solid",
)
scrollbar.config(command=listbox.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
listbox.bind("<>", open_link)
root.after(500, load_feed)
root.mainloop()