Как сделать вырезку / копирование / вставку меню с помощью Python / Tkinter - PullRequest
6 голосов
/ 09 декабря 2011

Я хотел бы создать пункты меню (в строке меню, а не во всплывающем окне, вызываемом правой кнопкой мыши), которые могут вырезать / копировать / вставлять любой выбранный текст.

Эквивалентная клавиатураКоманды уже работают, и я ничего не сделал для их включения .Например, я могу ввести текст в поле ввода, вырезать его с помощью Control-X и вставить его (или в другом месте) с помощью Control-C.

Посты по теме, которые я видел, сводятся квырезать / копировать / вставить для отдельных виджетов, но это уже работает.Как мне сделать пункты меню активировать их?

Спасибо.

РЕДАКТИРОВАТЬ: Просто чтобы быть ясно, вопросы:

  • как сделать пункты менюдля вырезания / копирования действует любой текст, выбранный в любом виджете
  • как сделать так, чтобы пункт меню вставки вставлял текст везде, где находится текстовый курсор

Опять же, ключевые команды делают это(Control-x, Control-c, Control-v) уже работают, а я ничего не сделал. Я знаю, как сделать меню ;вопрос только в том, какую команду я должен прикрепить к пунктам меню, чтобы получить желаемый эффект.

РЕДАКТИРОВАТЬ 2: Хорошо, у меня есть способ, который работает.Поскольку ключевые команды уже работают, мы можем просто сгенерировать их.В моем случае все записная книжка с именем noteBook, поэтому

lambda: self.noteBook.event_generate('<Control-x>')

режет по желанию.Например:

editmenu.add_command(label="Cut", accelerator="Ctrl+X", command=lambda: self.noteBook.event_generate('<Control-x>'))

Используется: https://github.com/lnmaurer/qubit-control-interface/commit/c08c10a7fbc4a637c1e08358fb9a8593dfdf116e

Тем не менее, вероятно, есть более чистый способ сделать это;пожалуйста, ответьте, если знаете это.

Ответы [ 4 ]

11 голосов
/ 12 декабря 2011

попробуйте это: источник

import Tkinter

def make_menu(w):
    global the_menu
    the_menu = Tkinter.Menu(w, tearoff=0)
    the_menu.add_command(label="Cut")
    the_menu.add_command(label="Copy")
    the_menu.add_command(label="Paste")

def show_menu(e):
    w = e.widget
    the_menu.entryconfigure("Cut",
    command=lambda: w.event_generate("<<Cut>>"))
    the_menu.entryconfigure("Copy",
    command=lambda: w.event_generate("<<Copy>>"))
    the_menu.entryconfigure("Paste",
    command=lambda: w.event_generate("<<Paste>>"))
    the_menu.tk.call("tk_popup", the_menu, e.x_root, e.y_root)

t = Tkinter.Tk()
make_menu(t)

e1 = Tkinter.Entry(); e1.pack()
e2 = Tkinter.Entry(); e2.pack()
e1.bind_class("Entry", "<Button-3><ButtonRelease-3>", show_menu)

t.mainloop()
6 голосов
/ 31 января 2014

Используйте метод focus_get(), чтобы получить виджет с фокусом клавиатуры, а затем отправить событие этому виджету.Например,

editmenu = Menu(menubar, tearoff=0)
editmenu.add_command(label="Cut", \
                     accelerator="Ctrl+X", \
                     command=lambda: \
                             mywindow.focus_get().event_generate('<<Cut>>'))
2 голосов
/ 09 декабря 2011

Развлекайся

from Tkinter import *

class Test(Text):
    def __init__(self, master, **kw):
        Text.__init__(self, master, **kw)
        self.bind('<Control-c>', self.copy)
        self.bind('<Control-x>', self.cut)
        self.bind('<Control-v>', self.paste)

    def copy(self, event=None):
        self.clipboard_clear()
        text = self.get("sel.first", "sel.last")
        self.clipboard_append(text)

    def cut(self, event):
        self.copy()
        self.delete("sel.first", "sel.last")

    def paste(self, event):
        text = self.selection_get(selection='CLIPBOARD')
        self.insert('insert', text)

def test():
    r = Tk()
    t = Test(r)
    t.pack(fill='both', expand=1)
    r.mainloop()

if __name__ == '__main__':
    test()
0 голосов
/ 26 июля 2012

Я только что натолкнулся на ваш вопрос на девять месяцев позже (это делает это беременной паузой?).Этот код работает для меня:

    editmenu = Menu(menubar, tearoff=0)
    editmenu.add_command(label="Cut", \
                         accelerator="Ctrl+X", \
                         command=lambda: \
                                 self.editor.event_generate('<<Cut>>'))
    editmenu.add_command(label="Copy", \
                         accelerator="Ctrl+C", \
                         command=lambda: \
                                 self.editor.event_generate('<<Copy>>'))
    editmenu.add_command(label="Paste", \
                         accelerator="Ctrl+V", \
                         command=lambda: \
                                 self.editor.event_generate('<<Paste>>'))
    menubar.add_cascade(label="Edit", menu=editmenu)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...