我想制作菜单项(在菜单栏中,而不是在右键单击弹出窗口中),可以剪切/复制/粘贴所选的任何文本。
等效的键盘命令已经工作,我没有做任何事情来启用它们。例如,我可以在输入框中输入文本,使用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
尽管如此,还是有一种更清洁的方法可以做到这一点;如果您知道,请回复。
答案 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)