コードに関する説明:
- これは私のプログラムの一部であり、関連する行のみをここに配置します
- これらのコードでできることは、クリップボードを監視することです。「http:xxx」をクリップボードにコピーすると、ポップアップウィンドウが表示されます。クリップボードの内容が変更されない場合、ウィンドウは表示されません。もう一度表示する
- 実行中は、ウィンドウを1回だけ正常にポップアップできますが、「http:」で始まる別の文字列をクリップボードにコピーすると、再度ポップアップすることはありません。
- メソッドでいくつかの異なる間隔値を試しましたが
after
、同じ結果です。
コード:
from tkinter import *
import os
import tkinter.messagebox as messagebox
import threading
import re
def watch_clipboard(tk,pipeout):
content = ''
last_content = ''
while True:
try:
content = tk.clipboard_get()
except TclError:
pass
result = re.match('http:',content)
if content != last_content:
if result:
last_content = content
message = 'show'.encode()
os.write(pipeout,message)
class GUI:
def __init__(self):
self.tk = Tk()
self.tk.resizable(0, 0)
self.tk.title('watch clipboard')
pipein,pipeout = os.pipe()
threading.Thread(target=watch_clipboard,daemon=True,args=(self.tk,pipeout)).start()
self.tk.after(5000,lambda:self.clipboard_confirm(pipein))
self.tk.mainloop()
def clipboard_confirm(self,pipein):
message = os.read(pipein,16)
if message == b'show':
self.tk.clipboard_clear()
messagebox.askokcancel('', 'add this in?', default='ok')
self.tk.after(5000,clipboard_confirm(pipein)) #add this
if __name__ == '__main__':
gui = GUI()
編集:A。Rodasのコードは機能します。マルチスレッドが問題を引き起こしているようです。深い理由は不明のままです。