4

我发现了一个似乎是tkinter. 如果您运行以下(重现错误最少)代码:

import tkinter, tkinter.simpledialog, tkinter.scrolledtext
root = tkinter.Tk('test')
text = tkinter.scrolledtext.ScrolledText(master=root, wrap='none')
text.pack(side="top", fill="both", expand=True, padx=0, pady=0)
text.insert(tkinter.END, 'abc\ndef\nghi\nijk')
root.mainloop()

然后:

  • 在小部件中选择一行scrolledtext,例如“ghi”行,
  • 复制它CTRL+C
  • 什么也不做,关闭应用程序

然后将它 ( CTRL+V) 粘贴到任何其他 Windows 应用程序中:它不起作用,不会粘贴任何内容。为什么?

如何解决这个问题?


注意:预期的行为是即使应用程序关闭,使用 CTRL+C 复制的文本也应保留在剪贴板中。这是许多 Windows 软件的默认行为。此处的示例notepad.exe:链接到动画屏幕截图:https ://i.imgur.com/li7UvYw.mp4

在此处输入图像描述

注意:这是链接到

4

3 回答 3

4

您还可以使用pyperclip支持 Windows、Linux 和 Mac 的

import tkinter as tk
import pyperclip

def copy(event:tk.Event=None) -> str:
    try:
        text = text_widget.selection_get()
        pyperclip.copy(text)
    except tk.TclError:
        pass
    return "break"

root = tk.Tk()

text_widget = tk.Text(root)
text_widget.pack()
text_widget.bind("<Control-c>", copy)

root.mainloop()
于 2021-08-30T16:00:10.883 回答
1

对于仅限 Windows 的解决方案,请尝试以下操作:

import tkinter as tk
import os

def copy(event:tk.Event=None) -> str:
    try:
        # Get the selected text
        # Taken from: https://stackoverflow.com/a/4073612/11106801
        text = text_widget.selection_get()
        # Copy the text
        # Inspired from: https://codegolf.stackexchange.com/a/111405
        os.system("echo.%s|clip" % text)
        print(f"{text!r} is in the clipboard")
    # No selection was made:
    except tk.TclError:
        pass
    # Stop tkinter's built in copy:
    return "break"

root = tk.Tk()

text_widget = tk.Text(root)
text_widget.pack()
text_widget.bind("<Control-c>", copy)

root.mainloop()

copy基本上,每当用户按下时,我都会调用自己的函数Control-C。在该功能中,我使用作为clip.exe操作系统一部分的程序来复制文本。

注意:我使用 , 将数据复制到剪贴板的方法os.system不是很好,因为您无法复制|字符。我建议在这里寻找更好的方法。您只需要替换那 1 行代码。

于 2021-08-30T15:06:37.990 回答
1

使用pypercliproot.bind_all()我们可以解决问题。

import tkinter, tkinter.simpledialog, tkinter.scrolledtext 
import pyperclip as clip

root = tkinter.Tk('test')

text = tkinter.scrolledtext.ScrolledText(master=root, wrap='none')
def _copy(event):
   try:
      string = text.selection_get()
      clip.copy(string)
   except:pass

root.bind_all("<Control-c>",_copy)

text.pack(side="top", fill="both", expand=True, padx=0, pady=0)
text.insert(tkinter.END,'abc\ndef\nghi\njkl')
root.mainloop()

于 2021-08-30T18:44:45.980 回答