LINUX.ORG.RU

[gtk][python] unicode + drag-n-drop = \uxxx

 ,


0

0

Есть виджет gtk.TreeView, он объявлен как источник drag:

target = [
    ('STRING', 0, TARGET_STRING),
    ('text/plain', 0, TARGET_STRING),
    ('application/x-rootwin-drop', 0, TARGET_ROOTWIN)
]

... [skip] (тут объявлен некий класс)

    self.treeview.drag_source_set( gtk.gdk.BUTTON1_MASK | gtk.gdk.BUTTON3_MASK,
            target,
            gtk.gdk.ACTION_COPY)
    self.treeview.connect('drag-data-get', self.treeview_drag_data_get)

... [skip]

    def treeview_drag_data_get(self, widget, context, data, info, timestamp):
        s = u'ня!'
        data.set_text(s, -1)
И в результате DnD в любое (даже в своё) gtk.Entry я получаю: \u043d\u044f!

data.get_text() так же возвращает строку из 13(!) символов u'\u043d\u044f!'.

Попытка решить проблему через data.set(gtk.gdk.TARGET_STRING, 16, s) даёт результат в виде строки в utf-8 воспринятой как latin1: 'ня!'

Можно ли в pygtk перетаскивать в другие приложения кириллический текст?

Обращаю внимание на то, что подразумеваеется реализация своего DnD, а не то, что сделано в, например, gtk.Entry --- там DnD реализовано внутри библиотеки.


>>data.get_text() так же возвращает строку из 13(!) символов u'\u043d\u044f!'.

Врете:

len(u'\u043d\u044f!') == 3 != 13

imp ★★
()
Ответ на: комментарий от imp

не вру. у меня len выдаёт 13, думаете, я придумал?) и чтрока юникодная содержит именно слеш букву 'u' и цифры а не символ \u043d

world
() автор топика
Ответ на: комментарий от world

>не вру. у меня len выдаёт 13, думаете, я придумал?) и чтрока юникодная содержит именно слеш букву 'u' и цифры а не символ \u043d

>>> len(u'\u043d\u044f!')
3
>>> len('\u043d\u044f!')
13

imp ★★
()
Ответ на: комментарий от imp

> cтрока юникодная содержит именно слеш букву 'u' и цифры а не символ \u043d

читайте до полного просветления.
объект типа unicode (не str!), содержащий 13 символов (а не два, заданных кодами).

world
() автор топика

Чтобы не быть голословным, вот вам маленький пример.
Подскажите, как модифицировать чтобы кнопка DnD-ила
нормальную кириллицу а не то, что описано в топике.

#!/usr/bin/python
# -*- coding: utf-8 -*-
import gtk, gobject
class application(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self)
        self.connect('delete_event', self.delete_event)
        self.label = gtk.Button(u'ня!')
        self.label.drag_source_set(gtk.gdk.BUTTON1_MASK | gtk.gdk.BUTTON3_MASK,
                                   [('STRING', 0, 0)], gtk.gdk.ACTION_COPY)
        self.label.connect('drag_data_get', self.drag_data_get)
        self.label.show()
        self.add(self.label)
        self.show()
    def delete_event(self, widget, event):
        gtk.main_quit()
    def drag_data_get(self, widget, context, data, info, timestamp):
        data.set_text(u'ня!', -1)
app = application()
gtk.main()

world
() автор топика

x11-libs/gtk+ = 2.12.10-r1
dev-lang/python = 2.5.2-r6
dev-python/pygtk = 2.12.1-r2

world
() автор топика
Ответ на: комментарий от world

так про 'text/plain' или 'STRING' там тоже ничего нет. это иксовые заморочки, описывающие тип данных в буфере

ananas ★★★★★
()
Ответ на: комментарий от ananas

"STRING" там есть:  (копипаста)

PyGTK 2.4 has a number of pre-defined atoms that map to builtin GTK+
interned string atoms. The interned strings and the PyGTK 2.4
gtk.gdk.Atom objects are:

"PRIMARY" gtk.gdk.SELECTION_PRIMARY
"SECONDARY" gtk.gdk.SELECTION_SECONDARY
"CLIPBOARD" gtk.gdk.SELECTION_CLIPBOARD
"ATOM"	gtk.gdk.SELECTION_TYPE_ATOM
"BITMAP" gtk.gdk.TARGET_BITMAP or gtk.gdk.SELECTION_TYPE_BITMAP
"COLORMAP" gtk.gdk.TARGET_COLORMAP or gtk.gdk.SELECTION_TYPE_COLORMAP
"DRAWABLE" gtk.gdk.TARGET_DRAWABLE or gtk.gdk.SELECTION_TYPE_DRAWABLE
"PIXMAP" gtk.gdk.TARGET_PIXMAP or gtk.gdk.SELECTION_TYPE_PIXMAP
"STRING" gtk.gdk.TARGET_STRING or gtk.gdk.SELECTION_TYPE_STRING
"WINDOW" gtk.gdk.SELECTION_TYPE_WINDOW

world
() автор топика
Ответ на: комментарий от ananas

Мда, действительно

> Please note that *no* final decision has been made on the proposed revision, and that the topic is still under discussion.

:/

world
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.