0

我正在尝试创建一个弹出菜单,该菜单仅在某些小部件(在本例中为文本和条目)内右键单击时打开在根窗口内的其他任何地方都没有。当用户在其中一个小部件内右键单击并选择“复制”时,该小部件内的文本选择应复制到剪贴板。

照原样,下面的代码仅在明确引用某个小部件时才有效,但我想概括该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()
4

1 回答 1

0

我在下面添加了一个解决方案。根据 acw 的建议,存储event.widget为全局变量似乎有所帮助。我摆脱了 pyperclip,因为它在将 click-to-copy 与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()
于 2020-07-31T00:53:48.677 回答