Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 20, 2013 07:53:27

Mariarchy
Зарегистрирован: 2013-02-06
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка кода на правильность

Создал небольшую программку python + PyQT (простая форма для выгрузки пары столбцов из базы и формирования структуры xml) , работает она вроде бы верно, но я думаю, что в ней наверняка есть куча недочетов, которые я не заметил в силу начального уровня знания в программировании. Был бы признателен, если бы кто-то посмотрел код и указал на недочеты.

Офлайн

#2 Июнь 20, 2013 08:18:24

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Проверка кода на правильность

А где код то?



Офлайн

#3 Июнь 20, 2013 08:30:44

Mariarchy
Зарегистрирован: 2013-02-06
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка кода на правильность

#!/usr/bin/python
import sys
import datetime
import re
import ceODBC

from PyQt4 import QtGui, QtCore

class MyThread(QtCore.QThread):
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
self.tt = '1'
self.pokaz = 0
self.pr = ''
self.flag_1 = 0
self.flag_2 = 0
self.flag_3 = 0

def run(self):
global flag_end
snils = str('')
self.pr = str('<?xml version="1.0" encoding="Windows-1251" ?>' +'\n'+'<ФайлЙЦУ>'+'\n')
#data=open('sketch.txt')
k = 1
flag_end = 0

self.emit(QtCore.SIGNAL("mysignal(QString)"),self.tt)
while self.flag_1 == 0:
# print("-----pause-1-----")
self.sleep(0.05)
self.flag_1 = 0
#print(str("это ")+self.tt +str(" self.tt\n"))
ll = len(self.tt)
#print (self.tt)
symbol = '' #каждый символ текста
vce_stroki =0 #сколько строк в файле
for symbol in self.tt:
if symbol=='\n':
vce_stroki=vce_stroki + 1
#kolich = ll/17
n = 1
self.pokaz = 1
try:
for each_line in self.tt:
try:

#print (each_line)
#(one, two) = each_line.split(' ',1)
snils = snils + each_line
if each_line==' ':
ss = snils

ss = re.sub(r'^\s+|\-|\"|\s+$','',ss)# убираем знаки "-" и кавычки \"
#print (ss)
self.pr = self.pr +'<первый тег>'+'\n'+ '<номер>'+ ss +'</номер>'+ '\n'+ '</первый тег>'+ '\n'
#snils = str('')
ss = str('')
if each_line=='\n':
snils = str('')
k = k + 1
#print (pokaz)
self.pokaz = int(k/vce_stroki*100) # отношение номера строки к
#количеству строк выводится строкой состояния в %
self.emit(QtCore.SIGNAL("mysignal_1(int)"), self.pokaz)
while self.flag_2 == 0:
# print("-----pause-2-----")
self.sleep(0.005)
self.flag_2 = 0
if flag_end == 1:
break
except:
pass
except:
print('missing')
self.pr = self.pr + '</ФайлЙЦУ>'
self.emit(QtCore.SIGNAL("mysignal_2(QString)"),self.pr)
while self.flag_3 == 0:
# print("-----pause-3-----")
self.sleep(0.001)
self.flag_3 = 0
#print(self.pr)
n = 1
snils = str('')
vce_stroki=0
k=0
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self,parent)
self.thread = MyThread()
self.resize(700, 600)
self.setWindowTitle('Workspace')

frame = QtGui.QFrame(self) # Фрейм
frame.setFrameShape(QtGui.QFrame.StyledPanel)
frame.setFrameShadow(QtGui.QFrame.Raised)
gridlay = QtGui.QGridLayout(frame) # Менеджер размещения элементов во фрейме
gridlay.setRowStretch(4,1) #чтобы не растягивались поля в окне
gridlay.setColumnStretch(2,1)
frame.setFrameShape(3) #рамка для центрального окна

#форма для номера района
raion_lay = QtGui.QHBoxLayout()
#raion_lay.addStretch(1)

raion_lay_v = QtGui.QVBoxLayout()
#raion_lay_v.addStretch(1)
raion_lay_v.addLayout(raion_lay)
self.setLayout(raion_lay_v)

#self.raion_label_1 = QtGui.QLabel("Для выгрузки данных введите номер \n района, например, 1 (г. Крыжополь)\n и нажмите \"Выгрузить\" ")
#self.raion_label_1.setAlignment(QtCore.Qt.AlignCenter)
self.raion=QtGui.QLineEdit("00",self)
self.raion.setMaxLength(2)
self.raion.setInputMask("99")
#raion_lay.addWidget(self.raion_label_1)

#Календарь(
#self.calendar_start=QtGui.QCalendarWidget()
#self.calendar_end=QtGui.QCalendarWidget()
self.raion_label=QtGui.QLabel(" Район №")
self.label_date_start=QtGui.QLabel("Начало периода")
self.label_date_end=QtGui.QLabel(" Конец периода")

self.date_start=QtGui.QDateEdit() #Даты
self.date_start.setCalendarPopup(1)
self.date_end=QtGui.QDateEdit()
self.date_end.setCalendarPopup(1)

# raion_lay.addWidget(self.calendar_start) #Календарь (
# raion_lay.addWidget(self.calendar_end)
raion_lay.addWidget(self.label_date_start)
raion_lay.addWidget(self.date_start) #Дата начала
default = datetime.date.today() #сегодняшняя дата
self.date_start.setDate(default) #
self.date_end.setDate(default) #
#self.date_start.QDate(default.year, default.month, default.day)
raion_lay.addWidget(self.label_date_end)
raion_lay.addWidget(self.date_end) #Конец периода
# )

raion_lay.addWidget(self.raion_label) # описание
raion_lay.addWidget(self.raion) # №района

self.button3=QtGui.QPushButton("Выгрузить", self)
raion_lay.addWidget(self.button3)
#self.button3.resize(100, 15)
#вывод количества строк в запросе
self.select_label=QtGui.QLabel("0000")
gridlay.addWidget(self.select_label,8,0)


#горизонтальный слой для checkbox
raion_lay_check= QtGui.QHBoxLayout()
#raion_lay.addStretch(1)
#raion_lay_v.addLayout(raion_lay_check)

self.label_check=QtGui.QLabel("обработать список и сохранить в .xml")

self.check_auto=QtGui.QCheckBox()
self.check_auto.setCheckState(0)


raion_lay_check.addWidget(self.label_check)
raion_lay_check.addWidget(self.check_auto)


#поля для данных
gridlay.addLayout(raion_lay_v,0,0,1,2)
gridlay.addLayout(raion_lay_check,1,0,1,1)
#gridlay.addLayout(self.button3,0,1,1,1)

btn_lay = QtGui.QHBoxLayout() # Менеджер размещения двух кнопок.
self.button1 = QtGui.QPushButton("Ок", frame)
self.button2 = QtGui.QPushButton("Отмена", frame)
btn_lay.addWidget(self.button1)
btn_lay.addWidget(self.button2)
gridlay.addLayout(btn_lay,5,0,1,2)

self.lev = QtGui.QTextEdit()
gridlay.addWidget(self.lev,4,0)


self.label = QtGui.QLabel("")
self.label.setAlignment(QtCore.Qt.AlignCenter)

self.prav = QtGui.QTextEdit()
gridlay.addWidget(self.prav,4,1)

self.pbar = QtGui.QProgressBar()
self.pbar.setGeometry(10, 40, 10, 25)

gridlay.addWidget(self.pbar,7,0)

gridlay.addWidget(self.label,7,1)

self.setCentralWidget(frame)

exit = QtGui.QAction(QtGui.QIcon('exit.png'), 'Exit', self)
exit.setShortcut('Ctrl+Q')
exit.setStatusTip('Exit application')
self.connect(exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))

open = QtGui.QAction(QtGui.QIcon('open.png'), 'Open', self)
open.setShortcut('Ctrl+O')
open.setStatusTip('Open new File')
self.connect(open, QtCore.SIGNAL('triggered()'), self.showDialog)

save = QtGui.QAction(QtGui.QIcon('save.png'), 'Save', self)
#save.setShortcut('Ctrl+O')
save.setStatusTip('Save new File')
self.connect(save, QtCore.SIGNAL('triggered()'), self.showDialog_save)

self.statusBar()

menubar = self.menuBar()
file = menubar.addMenu('&File')
file.addAction(exit)

toolbar = self.addToolBar('Exit')
toolbar.addAction(exit)
toolbar.addAction(open)
toolbar.addAction(save)

self.connect(self.button1,QtCore.SIGNAL("clicked()"),self.on_clicked_button1)
self.connect(self.button2,QtCore.SIGNAL("clicked()"),self.on_clicked_button_2)
self.connect(self.thread,QtCore.SIGNAL("mysignal(QString)"), self.on_change, QtCore.Qt.QueuedConnection)
self.connect(self.thread,QtCore.SIGNAL("mysignal_1(int)"), self.on_change1, QtCore.Qt.QueuedConnection)
self.connect(self.thread,QtCore.SIGNAL("mysignal_2(QString)"), self.on_change2, QtCore.Qt.QueuedConnection)
self.connect(self.thread,QtCore.SIGNAL("finished()"), self.on_finished)
self.connect(self.thread,QtCore.SIGNAL("started()"), self.on_started)

self.connect(self.button3,QtCore.SIGNAL("clicked()"),self.on_clicked_button3)


@QtCore.pyqtSlot()

def on_clicked_button1(self):
self.thread.start()

def on_change(self,ttt):
self.thread.tt = ttt
self.thread.tt = str(self.lev.toPlainText())
#print(str("это ") + ttt + str(" ttt\n")+ str("это ")+self.thread.tt + str(" self.thread.tt "))
#print(self.thread.tt)
self.thread.flag_1 = 1


def on_change1(self,pokazz):
self.thread.pokaz = pokazz
self.pbar.setValue(pokazz)
#print(str(pokazz))
self.thread.flag_2 = 1


def on_change2(self, prr):
self.thread.pr = prr
self.prav.setText(prr)
self.thread.flag_3 = 1
#print(prr)

def on_started(self):
self.label.setText("started processing")

def on_finished(self):
self.label.setText("finished")
#self.button.setDisabled(False)

def on_clicked_button_2(self):
global flag_end
if flag_end == 0:
self.label.setText("stopping")
flag_end = 1
else:
self.label.setText("stopped")

def on_clicked_button3(self):

# берем переменные из формы

self.n_raion = int(self.raion.text())
# даты
year_start = self.date_start.date().year()
month_start = self.date_start.date().month()
day_start = self.date_start.date().day()
date_start= str(day_start)+'.'+str(month_start)+'.'+str(year_start)

year_end = self.date_end.date().year()
month_end = self.date_end.date().month()
day_end = self.date_end.date().day()
date_end= str(day_end)+'.'+str(month_end)+'.'+str(year_end)

print ('Дата начала:'+date_start)
print ('Дата кончания:'+date_end)
#date_end
i=0

connection = ceODBC.Connection("SERVER=x.x.x.x;DSN=XXXXX;DRIVER={SQL SERVER};UID=XXXXX;PWD=XXXXX")
cursor = connection.cursor()

cursor.execute("select STRAXNO, CODREGION from A0812.ZL where CODREGION='%s' and ID_REJECTRESON='0' and PENSDATE>='%s' and PENSDATE<='%s'" % (self.n_raion, date_start, date_end))
qwe = cursor.fetchall()
res=''
a=('','')

try:

while qwe[i] != False:
a=qwe[i]
i=i+1
print (str(a)+'продолжаю поиск')
res=res+str(a[0])+ '_r№'+str(a[1])+'\n'

self.lev.setText(res)
self.select_label.setText(str(i) +" строк(и)")
except:
if self.check_auto.checkState()==2:
print ("Checked")
self.on_clicked_button1()
filename=QtGui.QFileDialog.getSaveFileName(self, 'Save file', 'C:\ZP\\'+str(self.n_raion)+'.xml')

try:
with open(filename, "w") as data:
data.write(self.prav.toPlainText())
#print(self.prav.toPlainText())

except IOError as err:
print('File error: ' +str(err))
finally:
if 'data' in locals():
data.close()

else:
print ("Not Checked")

def showDialog(self):
filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file', 'C:\ZP')
file=open(filename)
self.data = file.read()
self.lev.setText(self.data)

def showDialog_save(self):
filename = QtGui.QFileDialog.getSaveFileName(self, 'Save file', 'C:\ZP')
try:
with open(filename, "w") as data:
print(self.prav.toPlainText(),file=data)
except IOError as err:
print('File error: ' +str(err))
finally:
if 'data' in locals():
data.close()

app = QtGui.QApplication(sys.argv)
flag_end = 0
main = MainWindow()
main.show()
sys.exit(app.exec_())

#self.toolbar = self.addToolBar('Exit')
#self.toolbar.addAction(self.exit)

Если сюда можно выкладывать скрины, могу выложить, чтобы нагляднее было

Офлайн

#4 Июнь 20, 2013 08:32:50

Mariarchy
Зарегистрирован: 2013-02-06
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка кода на правильность

очень интересует вопрос по многопоточности, которую я тут попытался изобразить)))

Офлайн

#5 Июнь 20, 2013 08:45:34

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Проверка кода на правильность

1. snils = str('')
self.pr = str('<?xml version=“1.0” encoding=“Windows-1251” ?>' +'\n'+'<ФайлЙЦУ>'+'\n')
в чем смысл приводить строку к строке?
2. ‘<?xml version=“1.0” encoding=“Windows-1251” ?>’ +'\n'+'<ФайлЙЦУ>'+'\n'
Зачем тут конкатенация, почему не просто одной строкой
3.

symbol = '' #каждый символ текста
for symbol in self.tt:
это что такое?


Вообще код раздутый, много лишних циклов, например (не говоря о том, что откуда взялся файл вообще непонятно, ибо self.tt='1')
vce_stroki =0 #сколько строк в файле
for symbol in self.tt:
        if symbol=='\n':
                vce_stroki=vce_stroki + 1
ну и так далее по тексту



Офлайн

#6 Июнь 20, 2013 09:04:48

Mariarchy
Зарегистрирован: 2013-02-06
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка кода на правильность

1,2 - согласен. даже и сам не знаю, скорее всего мне так было нагляднее, когда писал да и все. (надо повнимательнее мне смотреть)
3 - ну эт я так считал количество строк)))
Файл берется, когда мы его выбираем, либо, если дынные сразу загружается из базы (помнится, когда-то давно, еще в универе изучали паскаль, препод сказал лучше всегда давать значение по умолчанию… как-то так)

Офлайн

#7 Июнь 20, 2013 09:12:00

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Проверка кода на правильность

>>>надо повнимательнее мне смотреть
Ты бы для начала сам бы вылизал код, а потом только другим показывал



Офлайн

#8 Июнь 20, 2013 09:19:45

Mariarchy
Зарегистрирован: 2013-02-06
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка кода на правильность

дело в том, что кое-что я уже убрал (что заметил)
Вот сейчас думаю, как же считать количество строк

Офлайн

#9 Июнь 20, 2013 09:46:44

Mariarchy
Зарегистрирован: 2013-02-06
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка кода на правильность

а что по поводу многопоточности?

Офлайн

#10 Июнь 20, 2013 10:20:24

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Проверка кода на правильность

while self.flag_1 == 0:
# print("-----pause-1-----")
self.sleep(0.05)
Просто, но нехорошо. Если потоку нечего делать, то он должен спать и ждать ивента, который его разбудит и скажет, что пора действовать.

По коду в целом. Постарайтесь разбить код на функции и дать им понятные имена вместо использования комментариев.
ss = re.sub(r'^\s+|\-|\"|\s+$','',ss)# убираем знаки "-" и кавычки \"
def escapeCharacters(text):
return re.sub(r'^\s+|\-|\"|\s+$','',ss)
vce_stroki =0 #сколько строк в файле
for symbol in self.tt:
if symbol=='\n':
vce_stroki=vce_stroki + 1
def getLineCount(text):
line_count = 0

for symbol in text:
if symbol == '\n':
line_count = line_count + 1

return line_count
и так далее. Это сильно упростит понимание кода.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version