Форум сайта python.su
У меня есть checkbutton и когда он включен должна происходить проверка текстового документа. Т.е. если в документе имеется “get”, то будет происходить какое-то действие и после этого действия документ очиститься.“get” в текстовый документ может записываться в любой момент, поэтому мне надо чтобы проверка проводилась все время, а не только один раз, я попробовал использовать бесконечный цикл, но из-за этого скрипт крашиться. Много чего перепробовал, но не могу сделать работоспособную проверку, поэтому прошу помощи. Как мне сделать чтобы проверка происходила все время?
P.S. checkbutton не обязателен, можно и простую проверку в фоне.
Код:
def check(): if check_var.get() == True: while True: with open('get.txt', 'r') as file: data = file.read() if data == 'get': print('Something') with open('get.txt', 'w') as file: file.write('')
Офлайн
В таких скриптах нужно использовать функцию sleep модуля time.
Офлайн
Судя по текстовому описанию задачи, должно быть как-то так:
exitflag = False # a small hole, that will be used below while True: with open('get.txt', 'r') as myfile: while True: myfile.seek(0) data = myfile.read() if 'get' in data: # Do some stuff here... print 'I have found get... etc' print 'The file will be cleared now!' break # If data includes `exitnow` all nested loops are terminated # (just a hole to quit all loops) if 'exitnow' in data: exitflag = True break try: with open('get.txt', 'w') as myfile: myfile.write('') except IOError: # Do exception stuff here print "Couldn't open the file for writing/clearing..." if exitflag: print "I've got exit-flag. Exiting immediately!" break
Отредактировано scidam (Окт. 17, 2016 02:48:08)
Офлайн
scidamПо-сути, этот код работает, но у меня еще есть другая часть кода и графическое оформление. Проблема в том, что при работе этого цикла другая часть кода не работает, а мне надо чтобы работал весь код, а проверка происходила в фоне.
Судя по текстовому описанию задачи, должно быть как-то так:
Офлайн
…. а мне надо чтобы работал весь код, а проверка происходила в фоне.
import threading, time def file_checking(): exitflag = False # a small hole, that will be used below while True: with open('get.txt', 'r') as myfile: while True: time.sleep(1) # This is optional, i.e. the file checkd every 1 s. myfile.seek(0) data = myfile.read() if 'get' in data: # Do some stuff here... print 'I have found get... etc' print 'The file will be cleared now!' break # If data includes `exitnow` all nested loops are terminated # (just a hole to quit all loops) if 'exitnow' in data: exitflag = True break try: with open('get.txt', 'w') as myfile: myfile.write('') except IOError: # Do exception stuff here print "Couldn't open the file for writing/clearing..." if exitflag: print "I've got exit-flag. Exiting immediately!" break checker = threading.Thread(target=file_checking) checker.daemon = True checker.start() # This emulates main gui loop ind = 0 for x in range(500): time.sleep(1) ind += 1 print "I am executing... but the file is still checked, time={}".format(ind)
Офлайн
MrDwayne
есть другая часть кода и графическое оформление
scidamЯ бы не сказал что нужно. Наверное даже вредно. GUI приложение постоянно крутит цикл обработки событий. Когда вы виснете в постоянной проверке файла то оно не может проверить что там пользователь нажимал. В любом GUI можно поставить в очередь обрабатываемых событий события проверки содержимого файла. Например проверять его по событиям GUI таймера. При использовании тредов вам надо заботиться о синхронизации этих процессов, об останове тредов и много еще о чем. А при использовании средств GUI это не нужно.
Нужно использовать потоки
Офлайн