Tkinter剪贴板错误

时间:2017-01-16 22:14:30

标签: python tkinter

基本上我正在尝试做的是改变我复制到我复制的内容,但它都是大写的。每当我尝试运行以下程序时,它都会崩溃。

from tkinter import *

root = Tk()

prev_clip = root.clipboard_get()

while True:
    prev_clip = root.clipboard_get()
    root.clipboard_append(prev_clip.upper())

root.mainloop()

如果以这种方式做我想做的事是不可能的,那就告诉我如何做到这一点。不过,如果我能这样做,那将是首选。

编辑:这是错误:

Traceback (most recent call last):
  File "[file location of the program]",     line 5, in <module>
    prev_clip = root.clipboard_get()
  File     "[file location of program]",     line 652, in clipboard_get
    return self.tk.call(('clipboard', 'get') + self._options(kw))
_tkinter.TclError: CLIPBOARD selection doesn't exist or form "STRING" not defined

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,但找到了解决问题的方法。看看这个是否可以帮助您

from Tkinter import Tk  

r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append(yourText)
r.destroy()

答案 1 :(得分:0)

在做了超过我的初步实验后被编辑: 我不确定你要做什么,但错误正是消息所说的:剪贴板中没有任何内容,甚至没有空字符串。要防止这种情况,请使用try-except块或使用root.clipboard_append('')附加空字符串(请参阅第二个代码示例)。

如果修复了这个问题,你的无限循环(while True:)会使每个循环中剪贴板文本的长度加倍,直到你遇到不同的崩溃。

from tkinter import *
r = Tk()
r.clipboard_clear()
r.clipboard_append('abc ')
for i in range(5):
    clip = r.clipboard_get()
    print(clip)
    r.clipboard_append(clip.upper())

打印

abc 
abc ABC 
abc ABC ABC ABC 
abc ABC ABC ABC ABC ABC ABC ABC 
abc ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC 

这肯定不是你想要的。

也许您想要的是由用户在剪贴板中输入新选择而触发的功能。该函数将在附加新版本之前清除剪贴板(如T. Kropalis所建议的那样)。不幸的是,据我所知,还没有通过tkiter访问CLIPBOARD-CHANGED事件。

我想到的是将函数绑定到^ X和^ C,以便在剪切或复制操作之后调用该函数。我尝试过但失败了,我不确定是否可能。

另一种方法是选择其他键来表示“复制和大写”和“剪切和大写”。然后,该函数必须触发剪切或复制操作以在更换剪贴板之前更改剪贴板,或者直接剪切或复制当前选择。我相信后者可以完成。

第三个选项是修改剪贴板的后台循环。

from tkinter import *
root = Tk()

delay = 30  # milliseconds

def upper():
    clip = root.clipboard_get()
    root.clipboard_clear()
    root.clipboard_append(clip.upper())
    root.after(delay, upper)

tex = Text(root)
tex.pack()
tex.insert('insert', 'Some starting text\n')

root.clipboard_append('')  # Avoid "CLIPBOARD selection doesn't exist" error.
root.after(delay, upper)
root.mainloop()

upper的改进版本可能会将当前内容与之前内容的保存副本(大写之后)进行比较,并且只有在内容发生变化时才更改剪贴板。