2017-01-16 7 views
0

基本的に私が何をしようとしているのは、コピーしたものをコピーしたものに変更することですが、すべて大文字です。私は次のプログラムを実行しようとするたびにクラッシュします。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 
+0

「それがクラッシュする」とはどういう意味ですか?プログラムは予期せず終了しますか?それは何かエラーを与えるか? –

+0

はい、間違いがあります。申し訳ありませんが、私は質問でそれを指定したはずです。 – Stewie

+0

Linuxでは 'while True'は' mainloop() 'を実行せず、' tkinter'はクリップボードからテキストを取得しないため、私にとってはうまくいきません。 'after()'を使ってループを作成すると、clipboadから同じ大文字のテキストが何度も何度も何度も繰り返されるため、すでに変換された大文字に変換する時間が浪費されます。 – furas

答えて

0

をあなたを助けている場合を参照してください。クリップボード、空の文字列ではありません。これを防ぐには、try-exceptブロックを使用するか、root.clipboard_append('')という空の文字列を追加します(2番目のコード例を参照)。

これが修正された場合、無限ループ(while True:)は、異なるクラッシュが発生するまで、各ループのクリップボードテキストの長さを2倍にします。

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イベントはありません。

私が持っていた考えの1つは、関数がカットまたはコピー操作の後に呼び出されるように、関数を^ Xと^ Cにバインドすることでした。私は試して失敗し、それが可能であるかどうかわからない。

「コピーと大文字」と「切り取りと大文字」を意味する別のキーを選択することもできます。この関数は、クリップボードを大文字にする前にクリップボードを変更するか、または現在の選択を直接カットまたはコピーするために、カットまたはコピー操作をトリガする必要があります。私は後者ができると信じています。

第3のオプションは、クリップボードを変更するバックグラウンドループです。 upper

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() 

改良版は、以前の内容(大文字の後)の保存されたコピーに現在の内容を比較し、内容だけが変更された場合、クリップボードを変更する場合があります。

+0

これは助けになりました。どうもありがとうございました。 – Stewie

0

私は同じ問題を抱えていたが、それを解決する方法を見つけました。 私はあなたがやろうとしているかわからないが、エラーメッセージが言葉通りです:には何もありませんこのが私の最初の実験以上のものをDOING後に編集

from Tkinter import Tk 

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