Форум сайта python.su
0
Написал программу которая в файлике берет все даты записанные разнЫми форматами и приводит к одному виду. Конечный автомат в общем то. Она вот вроде бы и работает, но проблема в слеудующем. Когда запускаю компилятор (PyCharm) то форма сначала открывается и все кнопки отображаются но если нажать кнопку Do me! (это функция but_clicked) то программа зависает и не отвечает. Пожалуйста помогите решить
from Tkinter import * from enum import Enum import os import tkFileDialog import enum ru=lambda x: x.decode('utf-8') def Quit(ev): root.quit() def LoadFile(ev): fn = tkFileDialog.Open(root, filetypes = [('*.txt files', '.txt')]).show() if fn == '': return textbox.delete('1.0', 'end') textbox.insert('1.0', open(fn, 'rt').read()) def SaveFile(ev): fn = tkFileDialog.SaveAs(root, filetypes = [('*.txt files', '.txt')]).show() if fn == '': return if not fn.endswith(".txt"): fn+=".txt" open(fn, 'wt').write(textbox.get('1.0', 'end')) def but_clicked(self): in_file1="C:\\proga_mego\\main\\in_file.txt" out_file1="C:\\proga_mego\\main\\out_file.txt" in_file = open(in_file1,'r') out_file = open(out_file1,'w') hislo = ('1','2','3','4','5','6','7','8','9','0') EDate = (' ','.') Raz = ('.','-','/') State = enum.Enum ('start', 'X', 'XX','X.', 'X.X', 'X.X.', 'X.X.X', 'XXX', 'XXXX', 'XXXX.', 'XXXX.X', 'XXXX.XX', 'XXXX.XX.', 'XXXX.XX.X', 'XXXX.XX.XX', 'X.X.XX', 'X.X.XXX', 'X.X.XXXX', 'XX.', 'XX.X', 'XX.XX', 'XX.XX.', 'XX.XX.X', 'XX.XX.XX', 'XX.XX.XXX', 'XX.XX.XXXX') state= 'start' while True: f= in_file.read(1) out_file.write(f) if f == '\n': break elif state=='start': if f in hislo: state='X' else: state= 'start' elif state=='X': if f in hislo: state='XX' elif f in Raz: state='X.' else: state= 'start' elif state=='XX': if f in hislo: state='XXX' elif f in Raz: state="XX." else: state= 'start' elif state =='X.': if f in hislo: state='X.X' else: state= 'start' elif state =='X.X': if f in Raz: state='X.X.' else: state= 'start' elif state =='X.X.': if f in hislo: state='X.X.X' else: state= 'start' elif state =='X.X.X': if f in hislo: state='X.X.XX' else: state= 'start' elif state =='XXX': if f in hislo: state='XXXX' else: state= 'start' elif state =='XXXX': if f in Raz: state='XXXX.' else: state='start' elif state =='XXXX.': if f in hislo: state='XXXX.X' else: state='start' elif state =='XXXX.X': if f in hislo: state='XXXX.XX' else: state='start' elif state =='XXXX.XX': if f in Raz: state='XXXX.XX.' else: state='start' elif state =='XXXX.XX.': if f in hislo: state='XXXX.XX.X' else: state='start' elif state =='XXXX.XX.X': if f in hislo: state='XXXX.XX.XX' else: state='start' elif state =='XXXX.XX.XX': if f in EDate: out_file.seek(-11, 1) in_file.seek(-3, 1) v= in_file.read(2) out_file.write(v) out_file.write('.') in_file.seek(-5, 1) v= in_file.read(2) out_file.write(v) out_file.write('.') in_file.seek(-7, 1) v= in_file.read(4) out_file.write(v) in_file.seek(6, 1) state='start' else: state='start' elif state =='X.X.XX': if f in EDate: out_file.seek(-7, 1) in_file.seek(-7, 1) v= in_file.read(1) out_file.write('0') out_file.write(v) out_file.write('.') in_file.seek(1, 1) v= in_file.read(1) out_file.write('0') out_file.write(v) out_file.write('.') in_file.seek(1, 1) v= in_file.read(2) out_file.write('19') out_file.write(v) state='start' elif f in hislo: state='X.X.XXX' else: state='start' elif state =='X.X.XXX': if f in hislo: state='X.X.XXXX' else: state='start' elif state =='X.X.XXXX': if f in EDate: out_file.seek(-9, 1) in_file.seek(-9, 1) v= in_file.read(1) out_file.write('0') out_file.write(v) out_file.write('.') in_file.seek(1, 1) v= in_file.read(1) out_file.write('0') out_file.write(v) out_file.write('.') in_file.seek(1, 1) v= in_file.read(4) out_file.write(v) state='start' else: state='start' elif state =='XX.': if f in hislo: state='XX.X' else: state='start' elif state =='XX.X': if f in hislo: state='XX.XX' else: state='start' elif state =='XX.XX': if f in Raz: state='XX.XX.' else: state='start' elif state =='XX.XX.': if f in hislo: state='XX.XX.X' else: state='start' elif state =='XX.XX.X': if f in hislo: state='XX.XX.XX' else: state='start' elif state =='XX.XX.XX': if f in hislo: state='XX.XX.XXX' elif f in EDate: out_file.seek(-9, 1) in_file.seek(-9, 1) v= in_file.read(2) out_file.write(v) out_file.write('.') in_file.seek(1, 1) v= in_file.read(2) out_file.write(v) out_file.write('.') in_file.seek(1, 1) out_file.write('19') v= in_file.read(2) out_file.write(v) state='start' else: state='start' elif state =='XX.XX.XXX': if f in hislo: state='XX.XX.XXXX' else: state='start' elif state =='XX.XX.XXXX': if f in EDate: out_file.seek(-11, 1) in_file.seek(-11, 1) v= in_file.read(2) out_file.write(v) out_file.write('.') in_file.seek(1, 1) v= in_file.read(2) out_file.write(v) out_file.write('.') in_file.seek(1, 1) v= in_file.read(4) out_file.write(v) state='start' else: state='start' else: pass in_file.close() out_file.close() root = Tk() panelFrame = Frame(root, height = 60, bg = 'gray') textFrame = Frame(root, height = 340, width = 600) panelFrame.pack(side = 'top', fill = 'x') textFrame.pack(side = 'bottom', fill = 'both', expand = 1) textbox = Text(textFrame, font='Arial 14', wrap='word') scrollbar = Scrollbar(textFrame) scrollbar['command'] = textbox.yview textbox['yscrollcommand'] = scrollbar.set textbox.pack(side = 'left', fill = 'both', expand = 1) scrollbar.pack(side = 'right', fill = 'y') loadBtn = Button(panelFrame, text = 'Load') saveBtn = Button(panelFrame, text = 'Save') quitBtn = Button(panelFrame, text = 'Quit') button_done = Button(panelFrame, text='Do me!') loadBtn.bind("", LoadFile) saveBtn.bind("", SaveFile) quitBtn.bind("", Quit) button_done.bind("", but_clicked) loadBtn.place(x = 10, y = 10, width = 40, height = 40) saveBtn.place(x = 60, y = 10, width = 40, height = 40) quitBtn.place(x = 170, y = 10, width = 40, height = 40) button_done.place(x = 110, y = 10, width = 50, height = 40) root.mainloop() __author__ = 'nibbler'
Офлайн
52
Интересно, как вы хотите, чтобы мы её отлаживали? Логично, если программа зависает, значит надо искать проблему в условии выхода из бесконечного цикла. Можете попробовать поменять методику считывания файла (считывать построчно, например, или сразу все в память), чтобы не возникало вопросов, когда там будет ‘\n’.
Офлайн