如何使用Python / Tkinter进行菜单栏切割/复制/粘贴

时间:2011-12-09 17:04:46

标签: python tkinter

我想制作菜单项(在菜单栏中,而不是在右键单击弹出窗口中),可以剪切/复制/粘贴所选的任何文本。

等效的键盘命令已经工作,我没有做任何事情来启用它们。例如,我可以在输入框中输入文本,使用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 个答案:

答案 0 :(得分:11)

试试这个:source

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()

答案 1 :(得分:6)

使用focus_get()方法获取当前具有键盘焦点的窗口小部件,然后将事件发送到该窗口小部件。 E.g。

editmenu = Menu(menubar, tearoff=0)
editmenu.add_command(label="Cut", \
                     accelerator="Ctrl+X", \
                     command=lambda: \
                             mywindow.focus_get().event_generate('<<Cut>>'))

答案 2 :(得分:2)

玩得开心

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()

答案 3 :(得分:0)

我刚刚九个月来问你的问题太晚了(这是否会让这个怀孕暂停?)。这段代码适合我:

    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)