How to get transparent background in window with PyGTK and PyCairo?

2024/9/19 9:44:13

I've been trying really hard to create a window with no decoration and a transparent background using PyGTK. I would then draw the content of the window with Cairo. But I can't get it to work.

I've tried a lot of different ways, they all failed, this is one of them

#!/usr/bin/env pythonimport pygtk
pygtk.require('2.0')
import gtk, sys, cairowin = Nonedef expose (widget, event):cr = widget.window.cairo_create()#Start drawingcr.set_operator(cairo.OPERATOR_CLEAR)cr.set_source_rgba(0.5,1.0,0.0,0.5)cr.rectangle(0, 0, 0.9, 0.8)cr.fill()def main (argc):global winwin = gtk.Window()win.set_decorated(False)win.connect('delete_event', gtk.main_quit)win.connect('expose-event', expose)win.set_app_paintable(True)win.show()gtk.main()if __name__ == '__main__':sys.exit(main(sys.argv))

So, what is the simplest way to do this?

Answer

So, I actually figured this out myself.

This is a working example. I've commented the relevant parts just in case somebody else is interested in how to do this.

#!/usr/bin/env pythonimport pygtk
pygtk.require('2.0')
import gtk, sys, cairo
from math import pidef expose (widget, event):cr = widget.window.cairo_create()# Sets the operator to clear which deletes everything below where an object is drawncr.set_operator(cairo.OPERATOR_CLEAR)# Makes the mask fill the entire windowcr.rectangle(0.0, 0.0, *widget.get_size())# Deletes everything in the window (since the compositing operator is clear and mask fills the entire windowcr.fill()# Set the compositing operator back to the defaultcr.set_operator(cairo.OPERATOR_OVER)# Draw a fancy little circle for demonstration purposecr.set_source_rgba(0.5,1.0,0.0,1)cr.arc(widget.get_size()[0]/2,widget.get_size()[1]/2,widget.get_size()[0]/2,0,pi*2)cr.fill()def main (argc):win = gtk.Window()win.set_decorated(False)# Makes the window paintable, so we can draw directly on itwin.set_app_paintable(True)win.set_size_request(100, 100)# This sets the windows colormap, so it supports transparency.# This will only work if the wm support alpha channelscreen = win.get_screen()rgba = screen.get_rgba_colormap()win.set_colormap(rgba)win.connect('expose-event', expose)win.show()
https://en.xdnf.cn/q/72403.html

Related Q&A

concurrent.futures.ThreadPoolExecutor doesnt print errors

I am trying to use concurrent.futures.ThreadPoolExecutor module to run a class method in parallel, the simplified version of my code is pretty much the following: class TestClass:def __init__(self, sec…

How to write a Dictionary to Excel in Python

I have the following dictionary in python that represents a From - To Distance Matrix.graph = {A:{A:0,B:6,C:INF,D:6,E:7},B:{A:INF,B:0,C:5,D:INF,E:INF},C:{A:INF,B:INF,C:0,D:9,E:3},D:{A:INF,B:INF,C:9,D:0…

How can I check pooled connections in SQLAlchemy before handing them off to my application code?

We have a slightly unreliable database server, for various reasons, and as a consequence sometimes the database connections used by my application vanish out from under it. The connections are SQLAlch…

pandas list of dictionary to separate columns

I have a data set like below:name status number message matt active 12345 [job: , money: none, wife: none] james active 23456 [group: band, wife: yes, money: 10000] adam in…

Where is console input history stored on Python for Windows?

Good afternoon,The QuestionIs there a particular spot that the entries are stored, or is it just a local set of stored variables, for the windows version of Python?The ContextI am curious about where …

Matplotlib Animation: how to dynamically extend x limits?

I have a simple animation plot like so: import numpy as np from matplotlib import pyplot as plt from matplotlib import animation# First set up the figure, the axis, and the plot element we want to anim…

How to get round the HTTP Error 403: Forbidden with urllib.request using Python 3

Hi not every time but sometimes when trying to gain access to the LSE code I am thrown the every annoying HTTP Error 403: Forbidden message.Anyone know how I can overcome this issue only using standard…

Installing lxml in virtualenv for windows

Ive recently started using virtualenv, and would like to install lxml in this isolated environment.Normally I would use the windows binary installer, but I want to use lxml in this virtualenv (not glob…

Saving a model in Django gives me Warning: Field id doesnt have a default value

I have a very basic model in Django:class Case(models.Model):name = models.CharField(max_length=255)created_at = models.DateTimeField(default=datetime.now)updated_at = models.DateTimeField(default=date…

Authorization architecture in microservice cluster

I have a project with microservice architecture (on Docker and Kubernetes), and 2 main apps are written in Python using AIOHTTP and Django (also there are and Ingress proxy, static files server, a coup…