Форум сайта python.su
Привет всем.
Есть код, отслеживающий буфер обмена. Реализован так (образец):
#!/usr/bin/python3 import tkinter as tk import sys from time import sleep lev_crit='CRITICAL' def log(func='MAIN',lev_crit='CRITICAL',cur_mes='Сообщение'): print(func,':',lev_crit,':',cur_mes) def clipboard_copy(line='Сообщение'): root.clipboard_clear() root.clipboard_append(line) def clipboard_paste(): return root.clipboard_get() def watch_clipboard(): cur_func=sys._getframe().f_code.co_name root.withdraw() old_clipboard=clipboard_paste() while True: log(cur_func,lev_crit,'Ожидание изменения буфера...') sleep(1) new_clipboard=clipboard_paste() log(cur_func,lev_crit,'Новый буфер: "%s"' % str(new_clipboard)) if old_clipboard!=new_clipboard: root.deiconify() break root=tk.Tk() #clipboard_copy('lamer') watch_clipboard() root.mainloop()
Отредактировано vanvanov (Авг. 9, 2015 16:08:57)
Офлайн
Ожидание нужно запускать через .after().
Офлайн
4kpt_IIIКак оказывается, в процедуру получения буфера надо вставить root.update(). after() тут имхо ни при чем (см. мое замечание про sleep).
Ожидание нужно запускать через .after().
Офлайн
vanvanovОС linux ? Если да, то есть некоторая вероятность что на Windows работать не будет. Как то напарывался вот на такое поведение.
надо вставить root.update()
Офлайн
vanvanov
.update() нужно делать везде, где происходит обновление. Это даже не обсуждается.
.update_idletask() - везде, где необходимы точные размеры виджетов, которые явно не задавались.
.after() - это механизм отложенного ожидания. Его можно повесить рекурсивно на какую-то функцию и она будет вызываться с каким-то интервалом. Это правильный подход. sleep() - блокирующая функция - это неправильный подход. И я не говорил, что он “причем” к Вашей проблеме. Я не пользуюсь 3.Х поэтому повторить Ваш код не смогу, в результате сделал очевидное для меня замечание. Вот такие вот дела…
Отредактировано 4kpt_III (Авг. 10, 2015 14:30:25)
Офлайн
JOHN_16
На винде должно работать. Ну на ХР точно работает, про остальные не знаю.
Офлайн
4kpt_IIIСпасибо за разъяснение. Я просто не знал, что копирование в буфер считается обновлением.
vanvanov.update() нужно делать везде, где происходит обновление. Это даже не обсуждается.
Офлайн
JOHN_16Сегодня потестил на винде, работает. Кстати, если Вы программируете под Windows, можете объяснить, почему этот код не работает как нужно:
ОС linux ? Если да, то есть некоторая вероятность что на Windows работать не будет. Как то напарывался вот на такое поведение.
#!/usr/bin/python3 import tkinter as tk text=[] for i in range(100): text.append('Sample text here %d' % i) text='\n'.join(text) root=tk.Tk() root.geometry('640x480') frame=tk.Frame(root) frame.pack(expand=1,fill='both') scrollbar=tk.Scrollbar(frame,jump=1) scrollbar.pack(side='right',fill='y') txt=tk.Text(frame,wrap='word',yscrollcommand=scrollbar.set) txt.pack(expand=1,fill='both') scrollbar.config(command=txt.yview) txt.insert('1.0',text) txt.focus_set() root.mainloop()
Офлайн
vanvanov
Интерфейсы и реализация tcl/tk могут просто не совпадать для этих двух систем. Если присмотреться, то в tkinter существует много команд, которые выполняются на nix и никак не повторяются на windows. При этом существует также набор команд, которые аналогичным образом отрабатываю на windows и не имеют никаких аналогов на nix. Поэтому ожидать 100% повторения поведения не приходится…
Отредактировано 4kpt_III (Авг. 10, 2015 22:11:26)
Офлайн