-
Notifications
You must be signed in to change notification settings - Fork 0
/
base_moves_tkinter
205 lines (158 loc) · 9.05 KB
/
base_moves_tkinter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# -*- coding: utf-8 -*-
import sys
import yaml
from time import strftime,sleep
from datetime import datetime
import matplotlib.pyplot as plt
from tkinter import *
from tkinter.ttk import Combobox
import numpy as np
# import bitstring
from bitstring import *
import random
#------------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------#
#--------- ---------#
#--- Работа с виджетом Button ---#
#---------
#------------------------------------- -------------------------------------#
#-----------------------------------------------------------------------------------------#
b_update_table['state'] = 'disabled'
sensor_info['sensor_shift_spin']['state'] = 'normal'
sensor_info['norm_range_widget']['state'] = 'readonly' # для виджета Combobox() например
#------------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------#
#--------- ---------#
#--- Работа с виджетом Checkbutton ---#
#---------
#------------------------------------- -------------------------------------#
#-----------------------------------------------------------------------------------------#
# для Spinbox нужно - get() -для виджета, set() использовать для переменной
type_and_shift = {} # словарь
# sensor_type_val - значение типа сенсора: BooleanVar(value=False) - аналоговые датчики - серый цвет, мВ
# value = True - параметрические датчики - голубой цвет, Ом
# sensor_type_check - виджет Checkbutton, который хранит состояние типа сенсора - sensor_type_val
type_and_shift[index]['sensor_type_val'] = BooleanVar(value=False) # переменная нужна для снятия знаечния с виджета
type_and_shift[index]['sensor_type_check'] = Checkbutton(fig, text=index, width=2, variable=type_and_shift[index]['sensor_type_val'], onvalue=1, offvalue=0, padx=4, pady=2)
type_and_shift[index]['sensor_type_check'].grid(row=row, column=column, sticky=E)
# чтобы снять занчение с виджета Checkbutton
var = type_and_shift[5]['sensor_type_val'].get()
#------------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------#
#--------- ---------#
#--- Работа с виджетом Spinbox ---#
#--------- ввод числа и использование format
#------------------------------------- -------------------------------------#
#-----------------------------------------------------------------------------------------#
sensor_increment_analog = "0.16"
sensor_increment_param = "0.08"
sensor_shift_max_analog = "5242.72"
sensor_shift_max_param = "2621.36"
for j in range(1, 65):
index = j
type_and_shift[index]['sensor_shift_val'] = IntVar()
type_and_shift[index]['sensor_shift_spin'] = Spinbox(fig, width=7, from_=sensor_increment_analog, to=sensor_shift_max_analog, increment=sensor_increment_analog,\
format = "%.2f",textvariable=type_and_shift[index]['sensor_shift_val'], validate='all', validatecommand=validate_input) # 32767*0.16 = 5242.72
type_and_shift[index]['sensor_shift_spin'].grid(row=row, column=column+1, sticky=W+N+S)
# type_and_shift[index]['sensor_shift_val'].set(sensor_increment_param)
'''
Работа с строками
'''
# что-то не верное - надо првоерять
# Проверка введено ли что-то в поле e_analog (из виджета Entry библиотек tkinter)
if e_analog.get() in '<string>':
# And when looking for subsrings
any(i in '<string>' for i in ('11','22','33'))
#-----------------------------------------------------------------------------------------#
#--------- ---------#
# --- ФУНКЦИЯ преобразования строки чисел через , - и пробелы в список --#
#--- (ввод строки осуществляется например пользовтелем через виджет Entry) ---#
#---------
#------------------------------------- -------------------------------------#
# парсинг введеной строк - номеров в список
string = "1, 4 -5, 7, 8, 10 - 22, 18"
def conv_to_list(date):
conv_list = []
date = date.replace(' ', '') # Можно добавить спец символы,которые следует удалять
date = date.split(',')
for x in date:
print(x)
if("-" in x):
date_ = x.split('-')
date_list_ = [num for num in range(int(date_[0]), int(date_[-1])+1)]
conv_list = conv_list + date_list_
else:
conv_list.append(int(x))
conv_list = list(set(conv_list)) # set -создает множество; list(set(conv_list)) - убирет повторы в списке
return(conv_list)
print(conv_to_list(string))
# проверка не введена ли строка, если нет - запуск ф-ции перобразвоание ввода
if len(e_analog.get()) == 0: # e_analog.get() - введенная строка
l_exit_analog['text'] = "Пустой ввод" + e_analog.get() + "\nПовторите ввод!!!"
l_exit_analog['bg'] = bg_title_blue
else:
exit_list = conv_to_list(e_analog.get())
print("exit-list", exit_list)
#-----------------------------------------------------------------------------------------#
#--------- ---------#
# --- поле с валидацией кода в виде сласса --#
#---------
#-----------------------------------------------------------------------------------------#
class DoubleSpinBox_validate(QtWidgets.QDoubleSpinBox):
def __init__(self, minValue, maxValue, step, parent=None):
super(DoubleSpinBox_validate, self).__init__(parent)
self.minValue = minValue
self.maxValue = maxValue
self.step = step
self.spinBox = QtWidgets.QDoubleSpinBox(parent)
self.spinBox.setRange(self.minValue, self.maxValue)
self.spinBox.setSingleStep(self.step)
self.spinBox.textChanged.connect(functools.partial(self._validate, step=self.step, spinBox=self.spinBox))
def _convert(self, value: float) -> int:
value = round(value, 2)
value = value * 100
value = int(value)
return value
def _validate(self,
text: str,
step: float,
spinBox: QtWidgets.QDoubleSpinBox,
) -> None:
step = self._convert(value=step)
value = text.replace(',', '.')
try:
value = float(value)
except ValueError:
# FIXME: хз что делать в такой ситуации
# такой ситуации быть не должно, т.к. это QDoubleSpinBox
return
value = self._convert(value=value)
if value % step == 0:
return # все норм, ничего не делаем
value = step * (value // step)
value /= 100
self.spinBox.setValue(value)
# ----------------------------------------------------------------------------------------
# ф-ция возвращает лейаут, в котором находится слайдер
def _convert(value: float) -> int:
value = round(value, 2)
value = value * 100
value = int(value)
return value
def getSliderLayout( # ф-ция возвращает лейаут, в котором находится слайдер
minValue: float,
maxValue: float,
step: float,
) -> QtWidgets.QLayout:
step: int = _convert(value=step)
slider = QtWidgets.QSlider()
slider.setOrientation(QtCore.Qt.Orientation.Horizontal)
slider.setRange(_convert(value=minValue), _convert(value=maxValue))
slider.setSingleStep(step)
slider.setPageStep(step * 10)
label = QtWidgets.QLabel()
slider.valueChanged.connect(lambda value, _label=label: _label.setText('{:6.2f}'.format(value / 100)))
layout = QtWidgets.QHBoxLayout()
layout.addWidget(slider)
layout.addWidget(label)
return layout