如何使用多个小部件的 1 个函数从 Tkinter/Python 中的弹出菜单复制文本?

How to copy text from popup menu in Tkinter/Python using 1 function for multiple widgets?

我正在尝试创建一个弹出菜单,当在某些小部件(文本和条目,在这种情况)但别处 在根 window 内。 当用户在其中一个小部件内右键单击并选择“复制”时,该小部件内的文本选择 应复制到剪贴板。

照原样,下面的代码仅在明确引用某个小部件时才有效,但我想概括 copyToClipboard 函数 从用户在内部右键单击的小部件复制文本选择。

相反,运行 下面代码中注释掉的行会出现以下错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\...\...\lib\tkinter\__init__.py", line 1702, in __call__
    return self.func(*args)
TypeError: <lambda>() missing 1 required positional argument: 'e'

如何在 copyToClipboard 函数中访问适当的(右键单击)小部件?

def copyToClipboard():
#def copyToClipboard(event):
    #value = event.widget.get(SEL_FIRST,SEL_LAST)
    value = inputText.get(SEL_FIRST,SEL_LAST)
    pyperclip.copy(value)
    print(value)

def showMenu(event):
    popup.post(event.x_root, event.y_root)

inputEntry = ttk.Entry(root)
inputText = Text(root)
popup = Menu(root)
popup.add_command(label="Copy", command=copyToClipboard)
#popup.add_command(label="Copy", command=lambda e: copyToClipboard(e))
inputText.bind("<Button-3>", showMenu)
inputEntry.bind("<Button-3>", showMenu)

inputText.pack()
inputEntry.pack()
mainloop()

我在下面添加了一个解决方案。根据 acw 的建议,将 event.widget 存储为全局变量似乎有所帮助。我摆脱了 pyperclip,因为在将点击复制与 Ctrl-V.

混合时,它一直给我中文字符和其他随机字符

编辑:值得注意的是,当使用 Ctrl-V 将条目小部件粘贴到条目小部件中时,条目小部件似乎无法很好地处理换行符。不幸的是,我还没有找到一种有效的方法来覆盖热键的默认粘贴命令以在粘贴之前删除换行符。

from tkinter import *
from tkinter import ttk

root = Tk()

def copyToClipboard():
    val = clickedWidget.selection_get()
    root.clipboard_clear()
    root.clipboard_append(val)

def showMenu(event):
    global clickedWidget
    clickedWidget = event.widget
    popup.post(event.x_root, event.y_root)

inputEntry = ttk.Entry(root)
inputText = Text(root)
popup = Menu(root)
popup.add_command(label="Copy", command=copyToClipboard)

inputText.bind("<Button-3>", showMenu)
inputEntry.bind("<Button-3>", showMenu)

inputText.pack()
inputEntry.pack()
mainloop()