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

lnm*_*rer 6 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/c08c10a7fbc4a637c1e08358fb9a859​​3dfdf116e

不过,可能还有一种更清洁的方法可以做到这一点; 如果你知道的话请回复.

Joh*_*ato 11

试试这个:来源

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()
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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


小智 3

玩得开心

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()
Run Code Online (Sandbox Code Playgroud)