Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Tkinter копирование и вставка при использовании разных раскладок [RSS Feed]

#1 Ноя. 7, 2017 19:49:42

Guljaca
От:
Зарегистрирован: 2011-07-11
Сообщения: 93
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter копирование и вставка при использовании разных раскладок

Проблема в том, что copy paste в Tk работает только под английской раскладкой.
Код ниже позволяет получать нажатие аналогичных кнопок на русской раскладке.
Теперь нужно как-то передать команду на копирование/вставку.
Работаю с текстом в TextWidget, выделенным курсором.

 import tkinter as tk
def copy(event):
    print('copy')
def paste(event):
    print('paste')
def test(event):    
    print('event.char:', event.char)
    print('event.keycode:', event.keycode)
    print('event.keysym:', event.keysym)
    print('---')
root = tk.Tk()
root.bind('<Key>', test)
root.bind('<ntilde>',            copy)
root.bind('<igrave>',           paste)
root.bind('<Control-Cyrillic_em>', paste)
root.mainloop(
)



Отредактировано Guljaca (Ноя. 7, 2017 19:59:38)

Офлайн

#2 Ноя. 8, 2017 14:22:22

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Tkinter копирование и вставка при использовании разных раскладок

ну както так:

 import tkinter as tk
def copy(event):
    widget = event.widget
    try:
        start = widget.index("sel.first")
        end = widget.index("sel.last")
    except tk.TclError:
        pass
    else:
        widget.clipboard_clear()
        widget.clipboard_append(widget.get(start, end))
def paste(event):
    widget = event.widget
    try:
        start = widget.index("sel.first")
        end = widget.index("sel.last")
        widget.delete(start, end)
    except tk.TclError:
        pass
    clipboard = widget.clipboard_get()
    widget.insert("insert", clipboard)
root = tk.Tk()
text = tk.Text(root)
text.pack(side="bottom", fill="both", expand=True)
root.bind('<ntilde>', copy)
root.bind('<igrave>', paste)
root.bind('<Control-Cyrillic_em>', paste)
root.mainloop()
хотя такая реализация конечно выглядит некрасиво, лучше создать класс наследник виджета и там как методы класса описать копи\паст
 import tkinter as tk
class TextWidget(tk.Text):
    def __init__(self, *args, **kwargs):
        tk.Text.__init__(self, *args, **kwargs)
    def copy(self, event):
        try:
            start = self.index("sel.first")
            end = self.index("sel.last")
        except tk.TclError:
            pass
        else:
            self.clipboard_clear()
            self.clipboard_append(self.get(start, end))
    def paste(self, event):
        try:
            start = self.index("sel.first")
            end = self.index("sel.last")
            self.delete(start, end)
        except tk.TclError:
            pass
        clipboard = self.clipboard_get()
        self.insert("insert", clipboard)
root = tk.Tk()
text = TextWidget(root)
text.pack(side="bottom", fill="both", expand=True)
root.bind('<ntilde>', text.copy)
root.bind('<igrave>', text.paste)
root.bind('<Control-Cyrillic_em>', text.paste)
root.mainloop()



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Ноя. 8, 2017 14:31:48)

Офлайн

  • Начало
  • » GUI
  • » Tkinter копирование и вставка при использовании разных раскладок[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version