How to show a png image in Gtk3 with Python?
Asked Answered
R

1

7

First of all, it is important to mention that I'm learning Python and Gtk+ 3, so I'm not an advanced programmer in these languages.

I'm trying to make a graphical interface in Gtk3 for a Python script that creates a png image, and I'd like to display it, but the PyGobject documentation is so scarce that I haven't found a way to do that. So far, my interface looks like this:

enter image description here

The buttons and text entries are arranged in a grid, and I'd like to keep empty the big space (represented by the big button) to the right until the script finishes building the image, and then show it in that area. The code is here.

Is there a way to do that using Python in Gtk3?

Thanks in advance,

Germán.

EDIT

Taking a look at the demos pointed out by @gpoo I discovered the Frame widget, and I implemented it in my GUI. This is how it looks like:

enter image description here

Inside the window class, I add the Frame to the grid:

self.frame_rgb = Gtk.Frame(label='RGB image')
self.frame_rgb.set_label_align(0.5, 0.5)
self.frame_rgb.set_shadow_type(Gtk.ShadowType.IN)
self.grid.attach_next_to(self.frame_rgb, self.label_img_name,
                         Gtk.PositionType.RIGHT, 3, 8)

I also connect the Run button to a callback function, so that when I click on it, my script creates and then displays the png image:

self.button_run = Gtk.Button(stock=Gtk.STOCK_EXECUTE)
self.button_run.connect('clicked', self.on_button_run_clicked)
self.grid.attach_next_to(self.button_run, self.entry_b_img,
                         Gtk.PositionType.BOTTOM, 1, 1)

Finally, my callback function is (no calculations yet, only render the image to the Frame for testing purposes):

def on_button_run_clicked(self, widget):
    self.img = Gtk.Image.new_from_file('astro-tux.png')
    self.frame_rgb.add(self.img)

but I got the following error when I click the Run button:

(makeRGB.py:2613): Gtk-WARNING **: Attempting to add a widget with type GtkImage to a GtkFrame, but as a GtkBin subclass a GtkFrame can only contain one widget at a time; it already contains a widget of type GtkImage

Any help is appreciated!

Reside answered 15/3, 2013 at 18:52 Comment(2)
if you have complete this can you publish the answerCrematory
The answer is below, from @gpoo.Reside
D
13

You can use Gtk.Image. If you generate a file, you could use:

img = Gtk.Image.new_from_file('/path/to/my_file.png')

and add img to the container (GtkGrid in your case). Or, if you already have the Gtk.Image there, you can use:

img.set_from_file('/path/to/my_file.png')

Instead of ...from_file you can use from_pixbuf, and you can create a Gdk.Pixbuf from a stream.

In general, you can use the documentation for C and change the idiom to Python. Also, you can check the demos available in PyGObject, in particular, the demo for handling images.

Devol answered 15/3, 2013 at 22:17 Comment(4)
Thanks @Devol for your answer. This doesn't solve my problem, because before showing the image, the script has to create it, and reserve a free space in the GUI to render it, and this has to be done inside a callback function.Reside
I put 2 possible options. The second one does it. Just put an empty Gtk.Image. Once you generate the image, use img.set_from_file('/path/to/my_file.png').Devol
link rot on your last two links :PCelestyn
Fixed both links.Devol

© 2022 - 2024 — McMap. All rights reserved.