Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 17, 2016 01:15:41

MrDwayne
Зарегистрирован: 2016-10-17
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с проверкой текстового документа

У меня есть 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('')

Офлайн

#2 Окт. 17, 2016 01:46:40

wi34rd
Зарегистрирован: 2016-10-08
Сообщения: 89
Репутация: +  2  -
Профиль   Отправить e-mail  

Проблема с проверкой текстового документа

В таких скриптах нужно использовать функцию sleep модуля time.

Офлайн

#3 Окт. 17, 2016 02:41:38

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Проблема с проверкой текстового документа

Судя по текстовому описанию задачи, должно быть как-то так:

 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

Для Py3 нужно адаптировать printы

Отредактировано scidam (Окт. 17, 2016 02:48:08)

Офлайн

#4 Окт. 17, 2016 16:41:57

MrDwayne
Зарегистрирован: 2016-10-17
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с проверкой текстового документа

scidam
Судя по текстовому описанию задачи, должно быть как-то так:
По-сути, этот код работает, но у меня еще есть другая часть кода и графическое оформление. Проблема в том, что при работе этого цикла другая часть кода не работает, а мне надо чтобы работал весь код, а проверка происходила в фоне.

Офлайн

#5 Окт. 18, 2016 02:39:45

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Проблема с проверкой текстового документа

…. а мне надо чтобы работал весь код, а проверка происходила в фоне.

Нужно использовать потоки, чтобы сделать то, что Вы хотите.
Самый простой вариант, следующий:

 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)

Офлайн

#6 Окт. 18, 2016 07:28:33

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Проблема с проверкой текстового документа

MrDwayne
есть другая часть кода и графическое оформление
scidam
Нужно использовать потоки
Я бы не сказал что нужно. Наверное даже вредно. GUI приложение постоянно крутит цикл обработки событий. Когда вы виснете в постоянной проверке файла то оно не может проверить что там пользователь нажимал. В любом GUI можно поставить в очередь обрабатываемых событий события проверки содержимого файла. Например проверять его по событиям GUI таймера. При использовании тредов вам надо заботиться о синхронизации этих процессов, об останове тредов и много еще о чем. А при использовании средств GUI это не нужно.

Но как это сделать не напишу потому что это зависит от того какое у вас GUI А вы этого не написали.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version