not1mm 24.10.24.1__py3-none-any.whl → 24.10.26__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- not1mm/__main__.py +9 -3
- not1mm/bandmap.py +6 -1
- not1mm/data/main.ui +23 -3
- not1mm/lib/version.py +1 -1
- not1mm/plugins/10_10_fall_cw.py +109 -82
- not1mm/plugins/10_10_spring_cw.py +109 -82
- not1mm/plugins/10_10_summer_phone.py +109 -82
- not1mm/plugins/10_10_winter_phone.py +109 -82
- not1mm/plugins/arrl_10m.py +109 -82
- not1mm/plugins/arrl_dx_cw.py +109 -82
- not1mm/plugins/arrl_dx_ssb.py +109 -82
- not1mm/plugins/arrl_field_day.py +109 -82
- not1mm/plugins/arrl_ss_cw.py +109 -82
- not1mm/plugins/arrl_ss_phone.py +109 -82
- not1mm/plugins/arrl_vhf_jan.py +109 -82
- not1mm/plugins/arrl_vhf_jun.py +109 -82
- not1mm/plugins/arrl_vhf_sep.py +109 -82
- not1mm/plugins/canada_day.py +109 -82
- not1mm/plugins/cq_160_cw.py +109 -74
- not1mm/plugins/cq_160_ssb.py +109 -74
- not1mm/plugins/cq_wpx_cw.py +109 -82
- not1mm/plugins/cq_wpx_rtty.py +109 -82
- not1mm/plugins/cq_wpx_ssb.py +109 -82
- not1mm/plugins/cq_ww_cw.py +115 -83
- not1mm/plugins/cq_ww_rtty.py +110 -73
- not1mm/plugins/cq_ww_ssb.py +109 -82
- not1mm/plugins/cwt.py +109 -82
- not1mm/plugins/general_logging.py +1 -1
- not1mm/plugins/helvetia.py +109 -82
- not1mm/plugins/iaru_fieldday_r1_cw.py +109 -82
- not1mm/plugins/iaru_fieldday_r1_ssb.py +109 -82
- not1mm/plugins/iaru_hf.py +109 -82
- not1mm/plugins/icwc_mst.py +109 -82
- not1mm/plugins/jidx_cw.py +74 -48
- not1mm/plugins/jidx_ph.py +74 -48
- not1mm/plugins/k1usn_sst.py +109 -82
- not1mm/plugins/naqp_cw.py +109 -82
- not1mm/plugins/naqp_rtty.py +109 -82
- not1mm/plugins/naqp_ssb.py +109 -82
- not1mm/plugins/phone_weekly_test.py +109 -82
- not1mm/plugins/ref_cw.py +109 -82
- not1mm/plugins/ref_ssb.py +109 -82
- not1mm/plugins/stew_perry_topband.py +109 -82
- not1mm/plugins/weekly_rtty.py +109 -82
- not1mm/plugins/winter_field_day.py +109 -82
- {not1mm-24.10.24.1.dist-info → not1mm-24.10.26.dist-info}/METADATA +3 -1
- {not1mm-24.10.24.1.dist-info → not1mm-24.10.26.dist-info}/RECORD +51 -51
- {not1mm-24.10.24.1.dist-info → not1mm-24.10.26.dist-info}/LICENSE +0 -0
- {not1mm-24.10.24.1.dist-info → not1mm-24.10.26.dist-info}/WHEEL +0 -0
- {not1mm-24.10.24.1.dist-info → not1mm-24.10.26.dist-info}/entry_points.txt +0 -0
- {not1mm-24.10.24.1.dist-info → not1mm-24.10.26.dist-info}/top_level.txt +0 -0
not1mm/plugins/cq_160_cw.py
CHANGED
@@ -209,7 +209,16 @@ def adif(self):
|
|
209
209
|
gen_adif(self, cabrillo_name, "CQ-160-CW")
|
210
210
|
|
211
211
|
|
212
|
-
def
|
212
|
+
def output_cabrillo_line(line_to_output, ending, file_descriptor, file_encoding):
|
213
|
+
""""""
|
214
|
+
print(
|
215
|
+
line_to_output.encode(file_encoding, errors="ignore").decode(),
|
216
|
+
end=ending,
|
217
|
+
file=file_descriptor,
|
218
|
+
)
|
219
|
+
|
220
|
+
|
221
|
+
def cabrillo(self, file_encoding):
|
213
222
|
"""Generates Cabrillo file. Maybe."""
|
214
223
|
# https://www.cw160.com/cabrillo.htm
|
215
224
|
logger.debug("******Cabrillo*****")
|
@@ -226,125 +235,150 @@ def cabrillo(self):
|
|
226
235
|
log = self.database.fetch_all_contacts_asc()
|
227
236
|
try:
|
228
237
|
with open(filename, "w", encoding="utf-8") as file_descriptor:
|
229
|
-
|
230
|
-
|
238
|
+
output_cabrillo_line(
|
239
|
+
"START-OF-LOG: 3.0",
|
240
|
+
"\r\n",
|
241
|
+
file_descriptor,
|
242
|
+
file_encoding,
|
243
|
+
)
|
244
|
+
output_cabrillo_line(
|
231
245
|
f"CREATED-BY: Not1MM v{__version__}",
|
232
|
-
|
233
|
-
|
246
|
+
"\r\n",
|
247
|
+
file_descriptor,
|
248
|
+
file_encoding,
|
234
249
|
)
|
235
|
-
|
250
|
+
output_cabrillo_line(
|
236
251
|
f"CONTEST: {cabrillo_name}",
|
237
|
-
|
238
|
-
|
252
|
+
"\r\n",
|
253
|
+
file_descriptor,
|
254
|
+
file_encoding,
|
239
255
|
)
|
240
256
|
if self.station.get("Club", ""):
|
241
|
-
|
257
|
+
output_cabrillo_line(
|
242
258
|
f"CLUB: {self.station.get('Club', '').upper()}",
|
243
|
-
|
244
|
-
|
259
|
+
"\r\n",
|
260
|
+
file_descriptor,
|
261
|
+
file_encoding,
|
245
262
|
)
|
246
|
-
|
263
|
+
output_cabrillo_line(
|
247
264
|
f"CALLSIGN: {self.station.get('Call','')}",
|
248
|
-
|
249
|
-
|
265
|
+
"\r\n",
|
266
|
+
file_descriptor,
|
267
|
+
file_encoding,
|
250
268
|
)
|
251
|
-
|
269
|
+
output_cabrillo_line(
|
252
270
|
f"LOCATION: {self.station.get('ARRLSection', '')}",
|
253
|
-
|
254
|
-
|
271
|
+
"\r\n",
|
272
|
+
file_descriptor,
|
273
|
+
file_encoding,
|
255
274
|
)
|
256
|
-
|
257
|
-
print(
|
275
|
+
output_cabrillo_line(
|
258
276
|
f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
|
259
|
-
|
260
|
-
|
277
|
+
"\r\n",
|
278
|
+
file_descriptor,
|
279
|
+
file_encoding,
|
261
280
|
)
|
262
|
-
|
281
|
+
output_cabrillo_line(
|
263
282
|
f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
|
264
|
-
|
265
|
-
|
283
|
+
"\r\n",
|
284
|
+
file_descriptor,
|
285
|
+
file_encoding,
|
266
286
|
)
|
267
|
-
|
287
|
+
output_cabrillo_line(
|
268
288
|
f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
|
269
|
-
|
270
|
-
|
289
|
+
"\r\n",
|
290
|
+
file_descriptor,
|
291
|
+
file_encoding,
|
271
292
|
)
|
272
|
-
|
293
|
+
output_cabrillo_line(
|
273
294
|
f"CATEGORY-MODE: {self.contest_settings.get('ModeCategory','')}",
|
274
|
-
|
275
|
-
|
295
|
+
"\r\n",
|
296
|
+
file_descriptor,
|
297
|
+
file_encoding,
|
276
298
|
)
|
277
|
-
|
299
|
+
output_cabrillo_line(
|
278
300
|
f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
|
279
|
-
|
280
|
-
|
301
|
+
"\r\n",
|
302
|
+
file_descriptor,
|
303
|
+
file_encoding,
|
281
304
|
)
|
282
305
|
if self.contest_settings.get("OverlayCategory", "") != "N/A":
|
283
|
-
|
306
|
+
output_cabrillo_line(
|
284
307
|
f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
|
285
|
-
|
286
|
-
|
308
|
+
"\r\n",
|
309
|
+
file_descriptor,
|
310
|
+
file_encoding,
|
287
311
|
)
|
288
|
-
|
312
|
+
output_cabrillo_line(
|
289
313
|
f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
|
290
|
-
|
291
|
-
|
314
|
+
"\r\n",
|
315
|
+
file_descriptor,
|
316
|
+
file_encoding,
|
292
317
|
)
|
293
|
-
|
294
|
-
print(
|
318
|
+
output_cabrillo_line(
|
295
319
|
f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
|
296
|
-
|
297
|
-
|
320
|
+
"\r\n",
|
321
|
+
file_descriptor,
|
322
|
+
file_encoding,
|
298
323
|
)
|
299
324
|
|
300
|
-
|
325
|
+
output_cabrillo_line(
|
301
326
|
f"CLAIMED-SCORE: {calc_score(self)}",
|
302
|
-
|
303
|
-
|
327
|
+
"\r\n",
|
328
|
+
file_descriptor,
|
329
|
+
file_encoding,
|
304
330
|
)
|
305
331
|
ops = f"@{self.station.get('Call','')}"
|
306
332
|
list_of_ops = self.database.get_ops()
|
307
333
|
for op in list_of_ops:
|
308
334
|
ops += f", {op.get('Operator', '')}"
|
309
|
-
|
335
|
+
output_cabrillo_line(
|
310
336
|
f"OPERATORS: {ops}",
|
311
|
-
|
312
|
-
|
337
|
+
"\r\n",
|
338
|
+
file_descriptor,
|
339
|
+
file_encoding,
|
313
340
|
)
|
314
|
-
|
341
|
+
output_cabrillo_line(
|
315
342
|
f"NAME: {self.station.get('Name', '')}",
|
316
|
-
|
317
|
-
|
343
|
+
"\r\n",
|
344
|
+
file_descriptor,
|
345
|
+
file_encoding,
|
318
346
|
)
|
319
|
-
|
347
|
+
output_cabrillo_line(
|
320
348
|
f"ADDRESS: {self.station.get('Street1', '')}",
|
321
|
-
|
322
|
-
|
349
|
+
"\r\n",
|
350
|
+
file_descriptor,
|
351
|
+
file_encoding,
|
323
352
|
)
|
324
|
-
|
353
|
+
output_cabrillo_line(
|
325
354
|
f"ADDRESS-CITY: {self.station.get('City', '')}",
|
326
|
-
|
327
|
-
|
355
|
+
"\r\n",
|
356
|
+
file_descriptor,
|
357
|
+
file_encoding,
|
328
358
|
)
|
329
|
-
|
359
|
+
output_cabrillo_line(
|
330
360
|
f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
|
331
|
-
|
332
|
-
|
361
|
+
"\r\n",
|
362
|
+
file_descriptor,
|
363
|
+
file_encoding,
|
333
364
|
)
|
334
|
-
|
365
|
+
output_cabrillo_line(
|
335
366
|
f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
|
336
|
-
|
337
|
-
|
367
|
+
"\r\n",
|
368
|
+
file_descriptor,
|
369
|
+
file_encoding,
|
338
370
|
)
|
339
|
-
|
371
|
+
output_cabrillo_line(
|
340
372
|
f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
|
341
|
-
|
342
|
-
|
373
|
+
"\r\n",
|
374
|
+
file_descriptor,
|
375
|
+
file_encoding,
|
343
376
|
)
|
344
|
-
|
377
|
+
output_cabrillo_line(
|
345
378
|
f"EMAIL: {self.station.get('Email', '')}",
|
346
|
-
|
347
|
-
|
379
|
+
"\r\n",
|
380
|
+
file_descriptor,
|
381
|
+
file_encoding,
|
348
382
|
)
|
349
383
|
for contact in log:
|
350
384
|
the_date_and_time = contact.get("TS", "")
|
@@ -355,7 +389,7 @@ def cabrillo(self):
|
|
355
389
|
|
356
390
|
loggeddate = the_date_and_time[:10]
|
357
391
|
loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
|
358
|
-
|
392
|
+
output_cabrillo_line(
|
359
393
|
f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
|
360
394
|
f"{contact.get('StationPrefix', '').ljust(13)} "
|
361
395
|
f"{str(contact.get('SNT', '')).ljust(3)} "
|
@@ -363,10 +397,11 @@ def cabrillo(self):
|
|
363
397
|
f"{contact.get('Call', '').ljust(13)} "
|
364
398
|
f"{str(contact.get('RCV', '')).ljust(3)} "
|
365
399
|
f"{str(contact.get('Exchange1', '')).ljust(6)}",
|
366
|
-
|
367
|
-
|
400
|
+
"\r\n",
|
401
|
+
file_descriptor,
|
402
|
+
file_encoding,
|
368
403
|
)
|
369
|
-
|
404
|
+
output_cabrillo_line("END-OF-LOG:", "\r\n", file_descriptor, file_encoding)
|
370
405
|
self.show_message_box(f"Cabrillo saved to: {filename}")
|
371
406
|
except IOError as exception:
|
372
407
|
logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
|
not1mm/plugins/cq_160_ssb.py
CHANGED
@@ -209,7 +209,16 @@ def adif(self):
|
|
209
209
|
gen_adif(self, cabrillo_name, "CQ-160-SSB")
|
210
210
|
|
211
211
|
|
212
|
-
def
|
212
|
+
def output_cabrillo_line(line_to_output, ending, file_descriptor, file_encoding):
|
213
|
+
""""""
|
214
|
+
print(
|
215
|
+
line_to_output.encode(file_encoding, errors="ignore").decode(),
|
216
|
+
end=ending,
|
217
|
+
file=file_descriptor,
|
218
|
+
)
|
219
|
+
|
220
|
+
|
221
|
+
def cabrillo(self, file_encoding):
|
213
222
|
"""Generates Cabrillo file. Maybe."""
|
214
223
|
# https://www.cw160.com/cabrillo.htm
|
215
224
|
logger.debug("******Cabrillo*****")
|
@@ -226,125 +235,150 @@ def cabrillo(self):
|
|
226
235
|
log = self.database.fetch_all_contacts_asc()
|
227
236
|
try:
|
228
237
|
with open(filename, "w", encoding="utf-8") as file_descriptor:
|
229
|
-
|
230
|
-
|
238
|
+
output_cabrillo_line(
|
239
|
+
"START-OF-LOG: 3.0",
|
240
|
+
"\r\n",
|
241
|
+
file_descriptor,
|
242
|
+
file_encoding,
|
243
|
+
)
|
244
|
+
output_cabrillo_line(
|
231
245
|
f"CREATED-BY: Not1MM v{__version__}",
|
232
|
-
|
233
|
-
|
246
|
+
"\r\n",
|
247
|
+
file_descriptor,
|
248
|
+
file_encoding,
|
234
249
|
)
|
235
|
-
|
250
|
+
output_cabrillo_line(
|
236
251
|
f"CONTEST: {cabrillo_name}",
|
237
|
-
|
238
|
-
|
252
|
+
"\r\n",
|
253
|
+
file_descriptor,
|
254
|
+
file_encoding,
|
239
255
|
)
|
240
256
|
if self.station.get("Club", ""):
|
241
|
-
|
257
|
+
output_cabrillo_line(
|
242
258
|
f"CLUB: {self.station.get('Club', '').upper()}",
|
243
|
-
|
244
|
-
|
259
|
+
"\r\n",
|
260
|
+
file_descriptor,
|
261
|
+
file_encoding,
|
245
262
|
)
|
246
|
-
|
263
|
+
output_cabrillo_line(
|
247
264
|
f"CALLSIGN: {self.station.get('Call','')}",
|
248
|
-
|
249
|
-
|
265
|
+
"\r\n",
|
266
|
+
file_descriptor,
|
267
|
+
file_encoding,
|
250
268
|
)
|
251
|
-
|
269
|
+
output_cabrillo_line(
|
252
270
|
f"LOCATION: {self.station.get('ARRLSection', '')}",
|
253
|
-
|
254
|
-
|
271
|
+
"\r\n",
|
272
|
+
file_descriptor,
|
273
|
+
file_encoding,
|
255
274
|
)
|
256
|
-
|
257
|
-
print(
|
275
|
+
output_cabrillo_line(
|
258
276
|
f"CATEGORY-OPERATOR: {self.contest_settings.get('OperatorCategory','')}",
|
259
|
-
|
260
|
-
|
277
|
+
"\r\n",
|
278
|
+
file_descriptor,
|
279
|
+
file_encoding,
|
261
280
|
)
|
262
|
-
|
281
|
+
output_cabrillo_line(
|
263
282
|
f"CATEGORY-ASSISTED: {self.contest_settings.get('AssistedCategory','')}",
|
264
|
-
|
265
|
-
|
283
|
+
"\r\n",
|
284
|
+
file_descriptor,
|
285
|
+
file_encoding,
|
266
286
|
)
|
267
|
-
|
287
|
+
output_cabrillo_line(
|
268
288
|
f"CATEGORY-BAND: {self.contest_settings.get('BandCategory','')}",
|
269
|
-
|
270
|
-
|
289
|
+
"\r\n",
|
290
|
+
file_descriptor,
|
291
|
+
file_encoding,
|
271
292
|
)
|
272
|
-
|
293
|
+
output_cabrillo_line(
|
273
294
|
f"CATEGORY-MODE: {self.contest_settings.get('ModeCategory','')}",
|
274
|
-
|
275
|
-
|
295
|
+
"\r\n",
|
296
|
+
file_descriptor,
|
297
|
+
file_encoding,
|
276
298
|
)
|
277
|
-
|
299
|
+
output_cabrillo_line(
|
278
300
|
f"CATEGORY-TRANSMITTER: {self.contest_settings.get('TransmitterCategory','')}",
|
279
|
-
|
280
|
-
|
301
|
+
"\r\n",
|
302
|
+
file_descriptor,
|
303
|
+
file_encoding,
|
281
304
|
)
|
282
305
|
if self.contest_settings.get("OverlayCategory", "") != "N/A":
|
283
|
-
|
306
|
+
output_cabrillo_line(
|
284
307
|
f"CATEGORY-OVERLAY: {self.contest_settings.get('OverlayCategory','')}",
|
285
|
-
|
286
|
-
|
308
|
+
"\r\n",
|
309
|
+
file_descriptor,
|
310
|
+
file_encoding,
|
287
311
|
)
|
288
|
-
|
312
|
+
output_cabrillo_line(
|
289
313
|
f"GRID-LOCATOR: {self.station.get('GridSquare','')}",
|
290
|
-
|
291
|
-
|
314
|
+
"\r\n",
|
315
|
+
file_descriptor,
|
316
|
+
file_encoding,
|
292
317
|
)
|
293
|
-
|
294
|
-
print(
|
318
|
+
output_cabrillo_line(
|
295
319
|
f"CATEGORY-POWER: {self.contest_settings.get('PowerCategory','')}",
|
296
|
-
|
297
|
-
|
320
|
+
"\r\n",
|
321
|
+
file_descriptor,
|
322
|
+
file_encoding,
|
298
323
|
)
|
299
324
|
|
300
|
-
|
325
|
+
output_cabrillo_line(
|
301
326
|
f"CLAIMED-SCORE: {calc_score(self)}",
|
302
|
-
|
303
|
-
|
327
|
+
"\r\n",
|
328
|
+
file_descriptor,
|
329
|
+
file_encoding,
|
304
330
|
)
|
305
331
|
ops = f"@{self.station.get('Call','')}"
|
306
332
|
list_of_ops = self.database.get_ops()
|
307
333
|
for op in list_of_ops:
|
308
334
|
ops += f", {op.get('Operator', '')}"
|
309
|
-
|
335
|
+
output_cabrillo_line(
|
310
336
|
f"OPERATORS: {ops}",
|
311
|
-
|
312
|
-
|
337
|
+
"\r\n",
|
338
|
+
file_descriptor,
|
339
|
+
file_encoding,
|
313
340
|
)
|
314
|
-
|
341
|
+
output_cabrillo_line(
|
315
342
|
f"NAME: {self.station.get('Name', '')}",
|
316
|
-
|
317
|
-
|
343
|
+
"\r\n",
|
344
|
+
file_descriptor,
|
345
|
+
file_encoding,
|
318
346
|
)
|
319
|
-
|
347
|
+
output_cabrillo_line(
|
320
348
|
f"ADDRESS: {self.station.get('Street1', '')}",
|
321
|
-
|
322
|
-
|
349
|
+
"\r\n",
|
350
|
+
file_descriptor,
|
351
|
+
file_encoding,
|
323
352
|
)
|
324
|
-
|
353
|
+
output_cabrillo_line(
|
325
354
|
f"ADDRESS-CITY: {self.station.get('City', '')}",
|
326
|
-
|
327
|
-
|
355
|
+
"\r\n",
|
356
|
+
file_descriptor,
|
357
|
+
file_encoding,
|
328
358
|
)
|
329
|
-
|
359
|
+
output_cabrillo_line(
|
330
360
|
f"ADDRESS-STATE-PROVINCE: {self.station.get('State', '')}",
|
331
|
-
|
332
|
-
|
361
|
+
"\r\n",
|
362
|
+
file_descriptor,
|
363
|
+
file_encoding,
|
333
364
|
)
|
334
|
-
|
365
|
+
output_cabrillo_line(
|
335
366
|
f"ADDRESS-POSTALCODE: {self.station.get('Zip', '')}",
|
336
|
-
|
337
|
-
|
367
|
+
"\r\n",
|
368
|
+
file_descriptor,
|
369
|
+
file_encoding,
|
338
370
|
)
|
339
|
-
|
371
|
+
output_cabrillo_line(
|
340
372
|
f"ADDRESS-COUNTRY: {self.station.get('Country', '')}",
|
341
|
-
|
342
|
-
|
373
|
+
"\r\n",
|
374
|
+
file_descriptor,
|
375
|
+
file_encoding,
|
343
376
|
)
|
344
|
-
|
377
|
+
output_cabrillo_line(
|
345
378
|
f"EMAIL: {self.station.get('Email', '')}",
|
346
|
-
|
347
|
-
|
379
|
+
"\r\n",
|
380
|
+
file_descriptor,
|
381
|
+
file_encoding,
|
348
382
|
)
|
349
383
|
for contact in log:
|
350
384
|
the_date_and_time = contact.get("TS", "")
|
@@ -355,7 +389,7 @@ def cabrillo(self):
|
|
355
389
|
|
356
390
|
loggeddate = the_date_and_time[:10]
|
357
391
|
loggedtime = the_date_and_time[11:13] + the_date_and_time[14:16]
|
358
|
-
|
392
|
+
output_cabrillo_line(
|
359
393
|
f"QSO: {frequency} {themode} {loggeddate} {loggedtime} "
|
360
394
|
f"{contact.get('StationPrefix', '').ljust(13)} "
|
361
395
|
f"{str(contact.get('SNT', '')).ljust(3)} "
|
@@ -363,10 +397,11 @@ def cabrillo(self):
|
|
363
397
|
f"{contact.get('Call', '').ljust(13)} "
|
364
398
|
f"{str(contact.get('RCV', '')).ljust(3)} "
|
365
399
|
f"{str(contact.get('Exchange1', '')).ljust(6)}",
|
366
|
-
|
367
|
-
|
400
|
+
"\r\n",
|
401
|
+
file_descriptor,
|
402
|
+
file_encoding,
|
368
403
|
)
|
369
|
-
|
404
|
+
output_cabrillo_line("END-OF-LOG:", "\r\n", file_descriptor, file_encoding)
|
370
405
|
self.show_message_box(f"Cabrillo saved to: {filename}")
|
371
406
|
except IOError as exception:
|
372
407
|
logger.critical("cabrillo: IO error: %s, writing to %s", exception, filename)
|