【问题标题】:How to make menubar cut/copy/paste with Python/Tkinter如何使用 Python/Tkinter 制作菜单栏剪切/复制/粘贴
【发布时间】:2014-01-31 05:42:01
【问题描述】:

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

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

不过,可能有一种更清洁的方法可以做到这一点;知道的请回复。

【问题讨论】:

  • John,正如文本所述,所有代码所做的只是将内容打印到标准输出以进行演示。它没有解决我的问题。
  • 在哪里?我搜索了“粘贴”这个词(使用左侧的小输入区域),它出现了 4 次。他们都没有解决我的问题。 “切”也是如此。如果您指出该页面,我相信我正在寻找的信息就在那里;它肯定不在您链接的页面上。
  • pygtk.org/docs/pygtk/class-gtkclipboard.html pyGTK 有剪贴板功能,可能值得研究。
  • @JohnRiselvato:pyGTK 中的函数如何帮助使用 Tkinter 的人?还是您建议他们用另一个工具包重写整个应用程序?

标签: python tkinter


【解决方案1】:

试试这个: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()

【讨论】:

  • 谢谢,@JohnRiselvato - 很好的例子(使用它here);干杯!
【解决方案2】:

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

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

【讨论】:

  • 这与我在 EDIT 2 中发布的代码有明显不同吗?
  • 您在编辑 2 中的代码会生成一个 事件。你要求一种更清洁的方式来做到这一点。此代码生成一个 > 事件并将其发送到具有键盘焦点的任何小部件。所以是的,它是有意义的不同和更清洁的 IMO。
【解决方案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()

【讨论】:

  • 看起来您正在做的是将按键命令绑定到小部件的操作。正如我所说,这在我没有做任何事情的情况下已经有效。问题是如何使用于剪切/复制的菜单项作用于任何小部件中选择的任何文本以及如何让粘贴菜单项将文本粘贴到文本光标所在的任何位置
  • @BryanOakley - 是的,他应该为此受到惩罚(讽刺)
【解决方案4】:

我才晚了九个月才发现您的问题(这是否使这成为怀孕的停顿?)。这段代码对我有用:

    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)

【讨论】:

  • 这并没有解决所提出的问题——该问题涉及对任何小部件进行剪切/复制/粘贴工作。您所做的只是将剪切/复制/粘贴操作绑定到一个小部件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2013-05-13
  • 1970-01-01
相关资源
最近更新 更多