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 ★
() автор топика
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.