Как добавить пользовательские цвета в ColorChooserWidget в Gtk3? - PullRequest
0 голосов
/ 27 апреля 2020

Итак, я создаю приложение Paint как в Python, используя gtk3. Я хочу добавить собственный цвет в ColorChooserWidget, но как только я нажимаю +, он не позволяет мне добавить цвет, который я выбрал обратно на палитру. Как переключиться обратно из редактора в исходное меню?

Вот мой код, который не позволяет мне добавлять пользовательские цвета.

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk

import cairo


surface = None

def clear_surface():
    global surface
    cr = cairo.Context(surface)
    cr.set_source_rgb(1,1,1)
    cr.paint()
    del cr

def configure_event_cb(wid,evt):
    global surface

    if surface is not None:
        del surface
        surface = None

    win = wid.get_window()
    width = wid.get_allocated_width()
    height = wid.get_allocated_height()

    surface = win.create_similar_surface(
        cairo.CONTENT_COLOR,
        width,
        height)

    clear_surface()
    return True


def draw_cb(wid,cr):
    global surface

    cr.set_source_surface(surface,0,0)
    cr.paint()
    return False


def draw_brush(wid,x,y):
    global surface
    clr= col.get_rgba()

    cr = cairo.Context(surface)
    cr.set_source_rgb(clr.red,clr.green,clr.blue)
    cr.rectangle(x-3,y-3,6,6)
    cr.fill()
    del cr

    wid.queue_draw_area(x-3,y-3,6,6)


def button_press_event_cb(wid,evt):
    global surface

    if surface is None:
        return False

    if evt.button == Gdk.BUTTON_PRIMARY:
        draw_brush(wid,evt.x,evt.y)
    elif evt.button == Gdk.BUTTON_SECONDARY:
        clear_surface()
        wid.queue_draw()

    return True


def motion_notify_event_cb(wid,evt):
    global surface

    if surface is None:
        return False

    if evt.state & Gdk.EventMask.BUTTON_PRESS_MASK:
        draw_brush(wid,evt.x,evt.y)

    return True


def close_window(wid):
    global surface
    if surface is not None:
        del surface
        surface = None
    Gtk.main_quit()


if __name__ == '__main__':
    win = Gtk.Window()
    win.set_title('Drawing Area')
    win.connect('destroy',close_window)
    win.set_border_width(8)

    col = Gtk.ColorChooserWidget(show_editor=False)
    grid = Gtk.Grid()
    win.add(grid)
    da = Gtk.DrawingArea()
    da.set_size_request(3000,2500)
    grid.add(col)
    grid.add(da)


    da.connect('draw',draw_cb)
    da.connect('configure-event',configure_event_cb)

    da.connect('motion-notify-event',motion_notify_event_cb)
    da.connect('button-press-event',button_press_event_cb)
    da.set_events(da.get_events() | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK)

    win.show_all()
    Gtk.main()
...