Perl / Gtk3, добавить фоновое изображение в окно - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь добавить фоновое изображение в окно. С помощью стилей CSS это достаточно просто, но я хочу добавить изображение только в одно окно, а не во все.

Сценарий ниже создает два окна Gtk, одно с CSS, другое без. Это не работает, потому что стиль CSS добавлен в оба окна.

Я был бы рад добавить фоновое изображение в Gtk3 :: Frame, или Gtk3 :: Box, или даже вообще избежать CSS, но я не могу заставить работать ни один из этих методов.

Я думаю, что код почти правильный, потому что он работает для добавления фонового изображения только к одному Gtk3 :: TextView (но не к обоим).

#!/usr/bin/perl
package bgtest;

use strict;
use diagnostics;
use warnings;

use Gtk3 '-init';
use Glib qw(TRUE FALSE);
use Cairo;

&drawWin(FALSE);
&drawWin(TRUE);

Gtk3->main();

sub drawWin {

    my ($cssFlag) = @_;

    my $window = Gtk3::Window->new('toplevel');
    $window->set_position('center');
    $window->set_default_size(400, 300);
    $window->signal_connect('delete-event' => sub {

        Gtk3->main_quit();
        exit;
    });

    if ($cssFlag) {

        # Set up the window's background image using a CSS style
        $window->set_title('CSS ON');

        my $imagePath = "/home/YOURNAME/bg.png";

        my $provider = Gtk3::CssProvider->new();
        my $display = Gtk3::Gdk::Display::get_default();
        my $screen = Gtk3::Gdk::Display::get_default_screen($display);
        Gtk3::StyleContext::add_provider_for_screen($screen, $provider, 600);

        my $theming = "#my_win_id, window.background {\n";
        $theming .= "   background-image: url(\"$imagePath\");\n";
        $theming .= "   background-repeat: repeat;\n";
        $theming .= "   background-position: top left;\n";
        $theming .= "}";

        $provider->load_from_data ([map ord, split //, $theming]);

        my $context = $window->get_style_context();
        $context->add_provider($provider, 600);

    } else {

        # Don't use a background image
        $window->set_title('CSS OFF');
    }

    $window->show_all();

    return $window;
}

1 Ответ

0 голосов
/ 08 марта 2019

Я пытаюсь добавить фоновое изображение в окно. Используя стили CSS, это достаточно просто, но я хочу добавить изображение только к одному окно, не все из них.

Просто удалите провайдера экрана (и оставьте провайдера окна). Так закомментируйте строку:

Gtk3::StyleContext::add_provider_for_screen($screen, $provider, 600);
...