Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0a212b7

Browse files
committed
Moved to a tabbed GUI to save screen estate. Added About window.
1 parent 90096e2 commit 0a212b7

File tree

1 file changed

+101
-128
lines changed

1 file changed

+101
-128
lines changed

rtcqs_gui.py

Lines changed: 101 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -2,148 +2,121 @@
22

33
import PySimpleGUIQt as sg
44
import rtcqs
5+
import resources as res
56

67
rtcqs.gui_status = True
7-
transparent_img = b'''iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9
8-
kT1Iw0AcxV9Ti6JVByuIKGSoThZERRy1CkWoEGqFVh1MLv2CJg1Jiouj4Fpw8GOx6uDirKuDqyAI
9-
foC4uTkpukiJ/0sKLWI9OO7Hu3uPu3eAUC0yzWobBzTdNhOxqJhKr4rtr+jCMPoRQI/MLGNOkuJo
10-
Ob7u4ePrXYRntT735+hWMxYDfCLxLDNMm3iDeHrTNjjvE4dYXlaJz4nHTLog8SPXFY/fOOdcFnhm
11-
yEwm5olDxGKuiZUmZnlTI54iDquaTvlCymOV8xZnrVhm9XvyFwYz+soy12kOIYZFLEGCCAVlFFCE
12-
jQitOikWErQfbeEfdP0SuRRyFcDIsYASNMiuH/wPfndrZScnvKRgFAi8OM7HCNC+C9QqjvN97Di1
13-
E8D/DFzpDX+pCsx8kl5paOEjoHcbuLhuaMoecLkDDDwZsim7kp+mkM0C72f0TWmg7xboXPN6q+/j
14-
9AFIUlfxG+DgEBjNUfZ6i3d3NPf275l6fz81GnKOR9SOXAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlw
15-
SFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+ULHRUGGu4roaUAAAAZdEVYdENvbW1lbnQAQ3JlYXRl
16-
ZCB3aXRoIEdJTVBXgQ4XAAAALElEQVRYw+3OMQEAAAgDoGn/zjOGDyRg2ubT5pmAgICAgICAgICA
17-
gICAgMABQLQDPYU9GZMAAAAASUVORK5CYII='''
18-
ok_img = b'''iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAC60lEQVR4AayVA5MkWRSFK2IDa/yE
19-
Nkpj29aObW+htWPbtu2Z4NhOldq2bd/JM0ZWd2Z0nYiTfPd+z0+lRFputq83Z5ipZs3X1IwxQcOa
20-
ymE84xv+oYzKldLdnfSb+q1pnI4z3dHx5nydNZD0QgBp+QDScWaC8Yxv+IcyKIsYxDYJ7sMY+mk4
21-
82u9RUxsC/oG6swog7KIQSxyKAa3fzXqFzVr3KQRAquQTAIky4hFDuRCTlnwf+7P/kvLmq7qbMGy
22-
WiyvR4IJOZG7QXhLbvavasDtwQh2qZETucFwPstZ0+ZmdrldrtzIDYYkXMP910fPm6uVd7uy4QAD
23-
rG/pYrfoONMbTBpXwTScyenEBAvMz3w1axiLZeMquB9rpNZ8MPlzRsn/YKnfGMZ+oF8Z9ZM4Lndd
24-
1Xov9j8aYF1F1qJY2pZwFZWR7AUwwVa5v13gLXZXod4FY+/DGqiHZRk5ihMIshTFUAs+iDTflQML
25-
TPc3Bi+VWty/ddYgl8C7CItJKIwhKKY0lQbZ1kj2AAwm2Co/xnhdLwQ2eczbCSH0tiCcoKTyTBpu
26-
X08e7H9OY8AEW4WTTMs3Dd5K7OZneXaC0ityaYxjM7kzzuEwmGCLFTBXNAbwYP6TXFaY5c25AHqQ
27-
KxCUU1VIk8N2iPCFsioPdgMVANxAox2baG/SrY9A0zdw3O/lch/hRTQ9bKdsOAy20yHAzMUMthXH
28-
EXQl4yn5s0YCGBWBb2W9JKiguoTmhO8V4Qtkw8EEu8FJCODKuLNUVltJ0LWMZ4QhwVq/lP6YoOKa
29-
MjJGHpTZcolJqGGNM3RW56sAiZfFnqLy2iqCroo9cTrtHkH4Fhx9TDEcBhNsFTaDxjYidO3K2DNU
30-
IQIhqKqumtbEnVcIl9iI5G7FAK0ShwPguvo62hx/mfBNIx8svRUrOYw8ROC6uAu0M/EGNhm0Qj5U
31-
+jBSfBxjy4XlgOQfx+82wA0S+jfJBmmjlP7Ncvp3TIZC14z+ndMB754DANf99mSzjcE0AAAAAElF
32-
TkSuQmCC'''
33-
warning_img = b'''iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACY0lEQVR4Ac2XNfDUQBjFM0OD0/dY
34-
g16DcyS7SQ53d6fBrUEa3F36BuuhL6Av/u2fCne7ZHOXj/sxuGYXy868mTdvd7+3Lp5NelGt9q37
35-
0fJUhVcTrdtTpd8AOBp5lPH+ZLoX9u/yxtdzEqWvmyh8ksexNFowYSjpe8DRyKMMZalD3d8yT6pB
36-
bJS+2WwFllpNsjDG8KegDGWpQ11iWBvL0KGdUq32N6IwlbhGYCdQlxjEImYh8yeVSo9E6ytCDz71
37-
2BnEIBYxif1Tc5lQ6fzOvDb2izn+XRCLmMTG44cNeKOjA1KLbc0tGhELHt9fcL4fZlFkCptH8Zco
38-
2Ag88PrCXCqVzkbrW4UX3KiRkp04JfnduwCOVnhh4oXnp6EPwtnN2GLBjWw14NxF+ZDgaEXr44Wn
39-
R7rszeiQaH3DarsxAkePf/CHo1ltz3rLE2/vxYigt1H6mYksRmD0KMn2HvjgD0crXB8vPJNRupdX
40-
9/3lue1hUx0t2c7dH/zhaFYx8MTbS5S6xjlu14CqZFu3izSbAI5mFQNPvL261u3W+36ML2bdBpGs
41-
AeBo1ucC3l6qVB3BCoEvZuUakTQFcDSxjYO3YwOUmAWLJTcpgKO5NcBpCpQSM32m5PfvAzia0xS4
42-
LcIPmDARwIHbIjRBsCx3aUAQiJk2A8Ct6+OJt8dhYH0Q+b40Dh+V/NFjAEdzOojsj2KtJZ0woTX3
43-
D+RDgqORZ3sU219GmIwdJ3n77Q/+cDTyrC4j9+vYD8Rs3ip5WxuAo7lfx04PEuZcawC3fpCU4ElW
44-
gkdpCZ7lZfyYlOJrVprP6b/4nr8Fda5BEkkNcp8AAAAASUVORK5CYII='''
8+
version = rtcqs.version
9+
element_vars = {}
10+
11+
12+
def run_analysis():
13+
try:
14+
rtcqs.main()
15+
except BaseException as err:
16+
print(f'rtcqs exited with error {err=}, {type(err)=}')
17+
18+
for check in rtcqs.output:
19+
img_key = f'{check}_img'
20+
output_key = f'{check}_output'
21+
tab_status = f'{check}_status'
22+
23+
if rtcqs.status[check]:
24+
element_vars[img_key] = res.ok_img
25+
element_vars[tab_status] = '✔'
26+
else:
27+
element_vars[img_key] = res.warning_img
28+
element_vars[tab_status] = '✘'
29+
30+
element_vars[output_key] = rtcqs.output[check]
31+
32+
33+
def create_tab(tab_name, check):
34+
tab_layout = [sg.Tab(f"{element_vars[f'{check}_status']}{tab_name}", [[
35+
sg.Image(data_base64=element_vars[f'{check}_img'],
36+
key=f'{check}_img'),
37+
sg.Multiline(default_text=element_vars[f'{check}_output'],
38+
size=(80, 3.5),
39+
key=f'{check}_output',
40+
disabled=True,
41+
background_color='white',
42+
text_color='black')]],
43+
background_color='#FBFBFB', key=f'{check}_tab')]
44+
45+
return tab_layout
4546

4647

4748
def create_gui():
4849
sg.theme('SystemDefaultForReal')
4950

50-
layout = [
51-
[sg.Text('Root User', size=(15, 1)),
52-
sg.Image(data_base64=transparent_img, key='root_img'),
53-
sg.Multiline(size=(75, 3.2), pad=((0, 15), (0, 0)),
54-
key='root_output')],
55-
[sg.Text('Audio Group', size=(15, 1)),
56-
sg.Image(data_base64=transparent_img, key='audio_group_img'),
57-
sg.Multiline(size=(75, 3.2), pad=((0, 15), (0, 0)),
58-
key='audio_group_output')],
59-
[sg.Text('Background Processes', size=(15, 1)),
60-
sg.Image(data_base64=transparent_img, key='background_process_img'),
61-
sg.Multiline(size=(75, 3.2), pad=((0, 15), (0, 0)),
62-
key='background_process_output')],
63-
[sg.Text('CPU Frequency Scaling', size=(15, 1)),
64-
sg.Image(data_base64=transparent_img, key='governor_img'),
65-
sg.Multiline(size=(75, 3.2), pad=((0, 15), (0, 0)),
66-
key='governor_output')],
67-
[sg.Text('Kernel Configuration', size=(15, 1)),
68-
sg.Image(data_base64=transparent_img, key='kernel_config_img'),
69-
sg.Multiline(size=(75, 3.2), pad=((0, 15), (0, 0)),
70-
key='kernel_config_output')],
71-
[sg.Text('High Resolution Timers', size=(15, 1)),
72-
sg.Image(data_base64=transparent_img, key='high_res_timers_img'),
73-
sg.Multiline(size=(75, 3.2), pad=((0, 15), (0, 0)),
74-
key='high_res_timers_output')],
75-
[sg.Text('System Timer', size=(15, 1)),
76-
sg.Image(data_base64=transparent_img, key='system_timer_img'),
77-
sg.Multiline(size=(75, 3.2), pad=((0, 15), (0, 0)),
78-
key='system_timer_output')],
79-
[sg.Text('Tickless Kernel', size=(15, 1)),
80-
sg.Image(data_base64=transparent_img, key='tickless_img'),
81-
sg.Multiline(size=(75, 3.2), pad=((0, 15), (0, 0)),
82-
key='tickless_output')],
83-
[sg.Text('Real-Time Kernel', size=(15, 1)),
84-
sg.Image(data_base64=transparent_img, key='preempt_rt_img'),
85-
sg.Multiline(size=(75, 3.2), pad=((0, 15), (0, 0)),
86-
key='preempt_rt_output')],
87-
[sg.Text('Mitigations', size=(15, 1)),
88-
sg.Image(data_base64=transparent_img, key='mitigations_img'),
89-
sg.Multiline(size=(75, 3.2), pad=((0, 15), (0, 0)),
90-
key='mitigations_output')],
91-
[sg.Text('Real-Time Priorities', size=(15, 1)),
92-
sg.Image(data_base64=transparent_img, key='rt_prio_img'),
93-
sg.Multiline(size=(75, 3.2), pad=((0, 15), (0, 0)),
94-
key='rt_prio_output')],
95-
[sg.Text('Swappiness', size=(15, 1)),
96-
sg.Image(data_base64=transparent_img, key='swappiness_img'),
97-
sg.Multiline(size=(75, 3.2), pad=((0, 15), (0, 0)),
98-
key='swappiness_output')],
99-
[sg.Text('Max User Watches', size=(15, 1)),
100-
sg.Image(data_base64=transparent_img, key='max_user_watches_img'),
101-
sg.Multiline(size=(75, 3.2), pad=((0, 15), (0, 0)),
102-
key='max_user_watches_output')],
103-
[sg.Text('Filesystems', size=(15, 1)),
104-
sg.Image(data_base64=transparent_img, key='filesystems_img'),
105-
sg.Multiline(size=(75, 3.2), pad=((0, 15), (0, 0)),
106-
key='filesystems_output')],
107-
[sg.OK(size=(32, 1), pad=((0, 0), (0, 0))),
108-
sg.Button(size=(32, 1), pad=((0, 0), (0, 0)),
109-
button_text='Clear'),
110-
sg.Cancel(size=(32, 1), pad=((0, 5), (0, 0)))]]
111-
112-
icon_data = b''''''
113-
114-
window = sg.Window(
115-
'rtcqs', layout, icon=icon_data)
51+
about_window = False
52+
53+
layout_analysis = [
54+
[sg.TabGroup([
55+
create_tab(' Root User', 'root'),
56+
create_tab(' Audio Group', 'audio_group'),
57+
create_tab(' Background Processes', 'background_process'),
58+
create_tab(' CPU Frequency Scaling', 'governor'),
59+
create_tab(' Kernel Configuration', 'kernel_config'),
60+
], key='tab_group1')],
61+
[sg.TabGroup([
62+
create_tab(' High Resolution Timers', 'high_res_timers'),
63+
create_tab(' System Timer', 'system_timer'),
64+
create_tab(' Tickless Kernel', 'tickless'),
65+
create_tab(' Real-Time Kernel', 'preempt_rt'),
66+
create_tab(' Mitigations', 'mitigations'),
67+
], key='tab_group2')],
68+
[sg.TabGroup([
69+
create_tab(' Real-Time Priorities', 'rt_prio'),
70+
create_tab(' Swappiness', 'swappiness'),
71+
create_tab(' Max User Watches', 'max_user_watches'),
72+
create_tab(' Filesystems', 'filesystems'),
73+
create_tab(' IRQs', 'irqs'),
74+
], key='tab_group3')],
75+
[sg.Button(button_text='About', size=(25, 1), pad=((0, 0), (0, 0))),
76+
sg.Stretch(), sg.Cancel(size=(25, 1), pad=((0, 0), (0, 0)))]]
77+
78+
layout_about = [
79+
[sg.Column([
80+
[sg.Stretch(), sg.Image(data_base64=res.logo),
81+
sg.Stretch()],
82+
[sg.Stretch(),
83+
sg.Text(f'rtcqs - version {version}',
84+
font=('DejaVu Sans', '12', 'normal')),
85+
sg.Stretch()],
86+
[sg.Stretch(),
87+
sg.Text('rtcqs, pronounced arteeseeks, is a Python '
88+
'port of the realtimeconfigquickscan project.'),
89+
sg.Stretch()]], background_color='white')],
90+
[sg.Stretch(), sg.OK(size=(13, 1), pad=((0, 0), (3, 0))),
91+
sg.Stretch()]]
92+
93+
window_analysis = sg.Window(
94+
'rtcqs', layout_analysis, icon=res.icon_data)
95+
96+
window_about = sg.Window(
97+
'rtcqs', layout_about, icon=res.icon_data, disable_close=True)
11698

11799
while True:
118-
event, values = window.read()
100+
event, values = window_analysis.read()
101+
119102
if event in (sg.WIN_CLOSED, 'Cancel'):
120103
break
121-
elif event == 'Clear':
122-
for check in rtcqs.output:
123-
window_name = f"{check}_img"
124-
output_name = f"{check}_output"
125-
window[window_name].update(data_base64=transparent_img)
126-
window[output_name].update('')
127-
elif event == 'OK':
128-
try:
129-
rtcqs.main()
130-
except BaseException as err:
131-
print(f'rtcqs exited with error {err=}, {type(err)=}')
132-
133-
for check in rtcqs.output:
134-
window_name = f"{check}_img"
135-
output_name = f"{check}_output"
136-
if rtcqs.status[check]:
137-
window[window_name].update(data_base64=ok_img)
138-
else:
139-
window[window_name].update(data_base64=warning_img)
140-
141-
window[output_name].print(rtcqs.output[check], end='')
142-
143-
window.close()
104+
elif event == 'About':
105+
about_window = True
106+
window_about.un_hide()
107+
choice, _ = window_about.read(close=True)
108+
109+
if choice == 'OK':
110+
window_about.hide()
111+
112+
if about_window:
113+
window_about.close()
114+
115+
window_analysis.close()
144116

145117

146118
def main():
119+
run_analysis()
147120
create_gui()
148121

149122

0 commit comments

Comments
 (0)