Skip to content

Commit b00de74

Browse files
Using f string, instead of %. Improved top frame in GUI.
1 parent 2a578da commit b00de74

File tree

5 files changed

+86
-79
lines changed

5 files changed

+86
-79
lines changed

demo_A_GUI_full.py

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,12 @@ def __init__(self, parent=None, **kwargs):
179179
self.qlbl_update_counter = QtWid.QLabel("0")
180180
self.qlbl_DAQ_rate = QtWid.QLabel("DAQ: nan Hz")
181181
self.qlbl_DAQ_rate.setStyleSheet("QLabel {min-width: 7em}")
182+
self.qlbl_recording_time = QtWid.QLabel()
182183

183184
vbox_left = QtWid.QVBoxLayout()
184185
vbox_left.addWidget(self.qlbl_update_counter, stretch=0)
185186
vbox_left.addStretch(1)
187+
vbox_left.addWidget(self.qlbl_recording_time, stretch=0)
186188
vbox_left.addWidget(self.qlbl_DAQ_rate, stretch=0)
187189

188190
# Middle box
@@ -210,17 +212,28 @@ def __init__(self, parent=None, **kwargs):
210212
vbox_middle.addWidget(self.qpbt_record)
211213

212214
# Right box
215+
p = {
216+
"alignment": QtCore.Qt.AlignmentFlag.AlignRight
217+
| QtCore.Qt.AlignmentFlag.AlignVCenter
218+
}
213219
self.qpbt_exit = QtWid.QPushButton("Exit")
214220
self.qpbt_exit.clicked.connect(self.close)
215221
self.qpbt_exit.setMinimumHeight(30)
216-
self.qlbl_recording_time = QtWid.QLabel(
217-
alignment=QtCore.Qt.AlignmentFlag.AlignRight
222+
self.qlbl_GitHub = QtWid.QLabel(
223+
f'<a href="{__url__}">GitHub source</a>', **p
218224
)
225+
self.qlbl_GitHub.setTextFormat(QtCore.Qt.TextFormat.RichText)
226+
self.qlbl_GitHub.setTextInteractionFlags(
227+
QtCore.Qt.TextInteractionFlag.TextBrowserInteraction
228+
)
229+
self.qlbl_GitHub.setOpenExternalLinks(True)
219230

220-
vbox_right = QtWid.QVBoxLayout()
231+
vbox_right = QtWid.QVBoxLayout(spacing=4)
221232
vbox_right.addWidget(self.qpbt_exit, stretch=0)
222233
vbox_right.addStretch(1)
223-
vbox_right.addWidget(self.qlbl_recording_time, stretch=0)
234+
vbox_right.addWidget(QtWid.QLabel(__author__, **p))
235+
vbox_right.addWidget(self.qlbl_GitHub)
236+
vbox_right.addWidget(QtWid.QLabel(f"v{__version__}", **p))
224237

225238
# Round up top frame
226239
hbox_top = QtWid.QHBoxLayout()
@@ -386,17 +399,16 @@ def process_qpbt_wave_sawtooth(self):
386399
@Slot()
387400
def update_GUI(self):
388401
str_cur_date, str_cur_time, _ = get_current_date_time()
389-
self.qlbl_cur_date_time.setText(
390-
"%s %s" % (str_cur_date, str_cur_time)
391-
)
392-
self.qlbl_update_counter.setText("%i" % qdev_ard.update_counter_DAQ)
402+
self.qlbl_cur_date_time.setText(f"{str_cur_date} {str_cur_time}")
403+
self.qlbl_update_counter.setText(f"{qdev_ard.update_counter_DAQ}")
393404
self.qlbl_DAQ_rate.setText(
394-
"DAQ: %.1f Hz" % qdev_ard.obtained_DAQ_rate_Hz
405+
f"DAQ: {qdev_ard.obtained_DAQ_rate_Hz:.1f} Hz"
395406
)
396-
if log.is_recording():
397-
self.qlbl_recording_time.setText(log.pretty_elapsed())
398-
self.qlin_reading_t.setText("%.3f" % state.time)
399-
self.qlin_reading_1.setText("%.4f" % state.reading_1)
407+
self.qlbl_recording_time.setText(
408+
f"REC: {log.pretty_elapsed()}" if log.is_recording() else ""
409+
)
410+
self.qlin_reading_t.setText(f"{state.time:.3f}")
411+
self.qlin_reading_1.setText(f"{state.reading_1:.4f}")
400412

401413
@Slot()
402414
def update_chart(self):
@@ -431,7 +443,7 @@ def notify_connection_lost():
431443
str_cur_date,
432444
str_cur_time,
433445
)
434-
print("\nCRITICAL ERROR @ %s" % str_msg)
446+
print(f"\nCRITICAL ERROR @ {str_msg}")
435447
reply = QtWid.QMessageBox.warning(
436448
window, "CRITICAL ERROR", str_msg, QtWid.QMessageBox.Ok
437449
)
@@ -459,10 +471,7 @@ def DAQ_function():
459471
# Query the Arduino for its state
460472
success, tmp_state = ard.query_ascii_values("?", delimiter="\t")
461473
if not (success):
462-
dprint(
463-
"'%s' reports IOError @ %s %s"
464-
% (ard.name, str_cur_date, str_cur_time)
465-
)
474+
dprint(f"'{ard.name}' reports IOError @ {str_cur_date} {str_cur_time}")
466475
return False
467476

468477
# Parse readings into separate state variables
@@ -471,10 +480,7 @@ def DAQ_function():
471480
state.time /= 1000
472481
except Exception as err:
473482
pft(err, 3)
474-
dprint(
475-
"'%s' reports IOError @ %s %s"
476-
% (ard.name, str_cur_date, str_cur_time)
477-
)
483+
dprint(f"'{ard.name}' reports IOError @ {str_cur_date} {str_cur_time}")
478484
return False
479485

480486
if USE_PC_TIME:
@@ -500,7 +506,7 @@ def write_data_to_log():
500506
else:
501507
timestamp = state.time
502508

503-
log.write("%.3f\t%.4f\n" % (timestamp, state.reading_1))
509+
log.write(f"{timestamp:.3f}\t{state.reading_1:.4f}\n")
504510

505511

506512
# ------------------------------------------------------------------------------
@@ -509,7 +515,7 @@ def write_data_to_log():
509515

510516
if __name__ == "__main__":
511517
# Set priority of this process to maximum in the operating system
512-
print("PID: %s\n" % os.getpid())
518+
print(f"PID: {os.getpid()}\n")
513519
try:
514520
proc = psutil.Process(os.getpid())
515521
if os.name == "nt":
@@ -559,7 +565,7 @@ def write_data_to_log():
559565
)
560566
log.signal_recording_started.connect(
561567
lambda filepath: window.qpbt_record.setText(
562-
"Recording to file: %s" % filepath
568+
f"Recording to file: {filepath}"
563569
)
564570
)
565571
log.signal_recording_stopped.connect(
@@ -577,6 +583,7 @@ def write_data_to_log():
577583
qdev_ard.create_worker_DAQ(
578584
DAQ_function=DAQ_function,
579585
DAQ_interval_ms=DAQ_INTERVAL_MS,
586+
DAQ_timer_type=QtCore.Qt.TimerType.PreciseTimer,
580587
critical_not_alive_count=1,
581588
debug=DEBUG,
582589
)

demo_B_GUI_minimal.py

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,7 @@ def DAQ_function():
213213
# Query the Arduino for its state
214214
success, tmp_state = ard.query_ascii_values("?", delimiter="\t")
215215
if not (success):
216-
dprint(
217-
"'%s' reports IOError @ %s %s"
218-
% (ard.name, str_cur_date, str_cur_time)
219-
)
216+
dprint(f"'{ard.name}' reports IOError @ {str_cur_date} {str_cur_time}")
220217
return False
221218

222219
# Parse readings into separate state variables
@@ -225,10 +222,7 @@ def DAQ_function():
225222
state.time /= 1000
226223
except Exception as err:
227224
pft(err, 3)
228-
dprint(
229-
"'%s' reports IOError @ %s %s"
230-
% (ard.name, str_cur_date, str_cur_time)
231-
)
225+
dprint(f"'{ard.name}' reports IOError @ {str_cur_date} {str_cur_time}")
232226
return False
233227

234228
# Use Arduino time or PC time?
@@ -248,7 +242,7 @@ def DAQ_function():
248242

249243
if __name__ == "__main__":
250244
# Set priority of this process to maximum in the operating system
251-
print("PID: %s\n" % os.getpid())
245+
print(f"PID: {os.getpid()}\n")
252246
try:
253247
proc = psutil.Process(os.getpid())
254248
if os.name == "nt":
@@ -293,14 +287,13 @@ def DAQ_function():
293287
qdev_ard = QDeviceIO(ard)
294288

295289
# Create workers
296-
# fmt: off
297290
qdev_ard.create_worker_DAQ(
298-
DAQ_function = DAQ_function,
299-
DAQ_interval_ms = DAQ_INTERVAL_MS,
300-
critical_not_alive_count = 1,
301-
debug = DEBUG,
291+
DAQ_function=DAQ_function,
292+
DAQ_interval_ms=DAQ_INTERVAL_MS,
293+
DAQ_timer_type=QtCore.Qt.TimerType.PreciseTimer,
294+
critical_not_alive_count=1,
295+
debug=DEBUG,
302296
)
303-
# fmt: on
304297

305298
# Start workers
306299
qdev_ard.start(DAQ_priority=QtCore.QThread.Priority.TimeCriticalPriority)

demo_C_singlethread_for_comparison.py

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,12 @@ def __init__(self, parent=None, **kwargs):
179179
self.qlbl_update_counter = QtWid.QLabel("0")
180180
self.qlbl_DAQ_rate = QtWid.QLabel("DAQ: nan Hz")
181181
self.qlbl_DAQ_rate.setStyleSheet("QLabel {min-width: 7em}")
182+
self.qlbl_recording_time = QtWid.QLabel()
182183

183184
vbox_left = QtWid.QVBoxLayout()
184185
vbox_left.addWidget(self.qlbl_update_counter, stretch=0)
185186
vbox_left.addStretch(1)
187+
vbox_left.addWidget(self.qlbl_recording_time, stretch=0)
186188
vbox_left.addWidget(self.qlbl_DAQ_rate, stretch=0)
187189

188190
# Middle box
@@ -206,17 +208,28 @@ def __init__(self, parent=None, **kwargs):
206208
vbox_middle.addWidget(self.qpbt_record)
207209

208210
# Right box
211+
p = {
212+
"alignment": QtCore.Qt.AlignmentFlag.AlignRight
213+
| QtCore.Qt.AlignmentFlag.AlignVCenter
214+
}
209215
self.qpbt_exit = QtWid.QPushButton("Exit")
210216
self.qpbt_exit.clicked.connect(self.close)
211217
self.qpbt_exit.setMinimumHeight(30)
212-
self.qlbl_recording_time = QtWid.QLabel(
213-
alignment=QtCore.Qt.AlignmentFlag.AlignRight
218+
self.qlbl_GitHub = QtWid.QLabel(
219+
f'<a href="{__url__}">GitHub source</a>', **p
214220
)
221+
self.qlbl_GitHub.setTextFormat(QtCore.Qt.TextFormat.RichText)
222+
self.qlbl_GitHub.setTextInteractionFlags(
223+
QtCore.Qt.TextInteractionFlag.TextBrowserInteraction
224+
)
225+
self.qlbl_GitHub.setOpenExternalLinks(True)
215226

216-
vbox_right = QtWid.QVBoxLayout()
227+
vbox_right = QtWid.QVBoxLayout(spacing=4)
217228
vbox_right.addWidget(self.qpbt_exit, stretch=0)
218229
vbox_right.addStretch(1)
219-
vbox_right.addWidget(self.qlbl_recording_time, stretch=0)
230+
vbox_right.addWidget(QtWid.QLabel(__author__, **p))
231+
vbox_right.addWidget(self.qlbl_GitHub)
232+
vbox_right.addWidget(QtWid.QLabel(f"v{__version__}", **p))
220233

221234
# Round up top frame
222235
hbox_top = QtWid.QHBoxLayout()
@@ -369,15 +382,14 @@ def process_qpbt_wave_sawtooth(self):
369382
@Slot()
370383
def update_GUI(self):
371384
str_cur_date, str_cur_time, _ = get_current_date_time()
372-
self.qlbl_cur_date_time.setText(
373-
"%s %s" % (str_cur_date, str_cur_time)
385+
self.qlbl_cur_date_time.setText(f"{str_cur_date} {str_cur_time}")
386+
self.qlbl_update_counter.setText(f"{state.update_counter_DAQ}")
387+
self.qlbl_DAQ_rate.setText(f"DAQ: {state.obtained_DAQ_rate_Hz:.1f} Hz")
388+
self.qlbl_recording_time.setText(
389+
f"REC: {log.pretty_elapsed()}" if log.is_recording() else ""
374390
)
375-
self.qlbl_update_counter.setText("%i" % state.update_counter_DAQ)
376-
self.qlbl_DAQ_rate.setText("DAQ: %.1f Hz" % state.obtained_DAQ_rate_Hz)
377-
if log.is_recording():
378-
self.qlbl_recording_time.setText(log.pretty_elapsed())
379-
self.qlin_reading_t.setText("%.3f" % state.time)
380-
self.qlin_reading_1.setText("%.4f" % state.reading_1)
391+
self.qlin_reading_t.setText(f"{state.time:.3f}")
392+
self.qlin_reading_1.setText(f"{state.reading_1:.4f}")
381393

382394
@Slot()
383395
def update_chart(self):
@@ -437,10 +449,7 @@ def DAQ_function():
437449
# Query the Arduino for its state
438450
success, tmp_state = ard.query_ascii_values("?", delimiter="\t")
439451
if not (success):
440-
dprint(
441-
"'%s' reports IOError @ %s %s"
442-
% (ard.name, str_cur_date, str_cur_time)
443-
)
452+
dprint(f"'{ard.name}' reports IOError @ {str_cur_date} {str_cur_time}")
444453
sys.exit(0)
445454

446455
# Parse readings into separate state variables
@@ -449,10 +458,7 @@ def DAQ_function():
449458
state.time /= 1000
450459
except Exception as err:
451460
pft(err, 3)
452-
dprint(
453-
"'%s' reports IOError @ %s %s"
454-
% (ard.name, str_cur_date, str_cur_time)
455-
)
461+
dprint(f"'{ard.name}' reports IOError @ {str_cur_date} {str_cur_time}")
456462
sys.exit(0)
457463

458464
if USE_PC_TIME:
@@ -478,7 +484,7 @@ def write_data_to_log():
478484
else:
479485
timestamp = state.time
480486

481-
log.write("%.3f\t%.4f\n" % (timestamp, state.reading_1))
487+
log.write(f"{timestamp:.3f}\t{state.reading_1:.4f}\n")
482488

483489

484490
# ------------------------------------------------------------------------------
@@ -487,7 +493,7 @@ def write_data_to_log():
487493

488494
if __name__ == "__main__":
489495
# Set priority of this process to maximum in the operating system
490-
print("PID: %s\n" % os.getpid())
496+
print(f"PID: {os.getpid()}\n")
491497
try:
492498
proc = psutil.Process(os.getpid())
493499
if os.name == "nt":
@@ -533,7 +539,7 @@ def write_data_to_log():
533539
)
534540
log.signal_recording_started.connect(
535541
lambda filepath: window.qpbt_record.setText(
536-
"Recording to file: %s" % filepath
542+
f"Recording to file: {filepath}"
537543
)
538544
)
539545
log.signal_recording_stopped.connect(

demo_D_no_GUI.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,9 @@ def about_to_quit():
142142
@Slot()
143143
def update_terminal():
144144
print(
145-
"%i\t%.3f\t%.4f"
146-
% (qdev_ard.update_counter_DAQ - 1, state.time, state.reading_1),
145+
f"{qdev_ard.update_counter_DAQ - 1}\t"
146+
f"{state.time:.3f}\t"
147+
f"{state.reading_1:.4f}",
147148
# end="\r",
148149
# flush=True,
149150
)
@@ -158,7 +159,7 @@ def DAQ_function():
158159
# Query the Arduino for its state
159160
success, tmp_state = ard.query_ascii_values("?", delimiter="\t")
160161
if not (success):
161-
dprint("'%s' reports IOError" % ard.name)
162+
dprint(f"'{ard.name}' reports IOError")
162163
return False
163164

164165
# Parse readings into separate state variables
@@ -167,7 +168,7 @@ def DAQ_function():
167168
state.time /= 1000
168169
except Exception as err:
169170
pft(err, 3)
170-
dprint("'%s' reports IOError" % ard.name)
171+
dprint(f"'{ard.name}' reports IOError")
171172
return False
172173

173174
# Use Arduino time or PC time?
@@ -192,7 +193,7 @@ def DAQ_function():
192193

193194
if __name__ == "__main__":
194195
# Set priority of this process to maximum in the operating system
195-
print("PID: %s\n" % os.getpid())
196+
print(f"PID: {os.getpid()}\n")
196197
try:
197198
proc = psutil.Process(os.getpid())
198199
if os.name == "nt":
@@ -233,14 +234,13 @@ def DAQ_function():
233234
qdev_ard = QDeviceIO(ard)
234235

235236
# Create workers
236-
# fmt: off
237237
qdev_ard.create_worker_DAQ(
238-
DAQ_function = DAQ_function,
239-
DAQ_interval_ms = DAQ_INTERVAL_MS,
240-
critical_not_alive_count = 1,
241-
debug = DEBUG,
238+
DAQ_function=DAQ_function,
239+
DAQ_interval_ms=DAQ_INTERVAL_MS,
240+
DAQ_timer_type=QtCore.Qt.TimerType.PreciseTimer,
241+
critical_not_alive_count=1,
242+
debug=DEBUG,
242243
)
243-
# fmt: on
244244

245245
# Connect signals to slots
246246
qdev_ard.signal_DAQ_updated.connect(update_terminal)

0 commit comments

Comments
 (0)