5 Commits

Author SHA1 Message Date
github-actions[bot]
8ba4c15f08 chore(main): release 0.12.0 (#109)
🤖 I have created a release *beep* *boop*
---


##
[0.12.0](https://github.com/shizand/statapp/compare/v0.11.0...v0.12.0)
(2024-02-11)


### Новые функции

* Добавлена дополнительная литература
([#117](https://github.com/shizand/statapp/issues/117))
([ded55cb](ded55cb5d7)),
closes [#114](https://github.com/shizand/statapp/issues/114)
* добавлены "Распределения"
([#116](https://github.com/shizand/statapp/issues/116))
([981580f](981580f46d)),
closes [#111](https://github.com/shizand/statapp/issues/111)
[#112](https://github.com/shizand/statapp/issues/112)


### Исправления

* Дополнил README
([9766ecb](9766ecb7f5))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-02-11 21:30:32 +03:00
db4e791823 chore: try fix 2024-02-11 21:22:08 +03:00
981580f46d feat: добавлены "Распределения" (#116)
Closes #110 
Closes #111
Closes #112
2024-02-11 21:09:52 +03:00
ded55cb5d7 feat: Добавлена дополнительная литература (#117)
Closes #114
2024-02-11 21:08:52 +03:00
9766ecb7f5 fix: Дополнил README 2024-02-05 11:38:09 +03:00
25 changed files with 180833 additions and 203 deletions

View File

@@ -3,7 +3,7 @@ ignored-modules=PySide2
extension-pkg-whitelist=PySide2 extension-pkg-whitelist=PySide2
[MASTER] [MASTER]
init-hook="import sys; sys.path.append('./statapp')" init-hook="import sys; sys.path.append('.')"
ignore-patterns=ui_.+\.py ignore-patterns=ui_.+\.py
[BASIC] [BASIC]

View File

@@ -1,5 +1,18 @@
# Changelog # Changelog
## [0.12.0](https://github.com/shizand/statapp/compare/v0.11.0...v0.12.0) (2024-02-11)
### Новые функции
* Добавлена дополнительная литература ([#117](https://github.com/shizand/statapp/issues/117)) ([ded55cb](https://github.com/shizand/statapp/commit/ded55cb5d73e5b1d118c8f2ceaaf107a563f0e5e)), closes [#114](https://github.com/shizand/statapp/issues/114)
* добавлены "Распределения" ([#116](https://github.com/shizand/statapp/issues/116)) ([981580f](https://github.com/shizand/statapp/commit/981580f46d55b949af440973660a5b9b946827bd)), closes [#111](https://github.com/shizand/statapp/issues/111) [#112](https://github.com/shizand/statapp/issues/112)
### Исправления
* Дополнил README ([9766ecb](https://github.com/shizand/statapp/commit/9766ecb7f5f4bb4b960ad9519bbe28919ecda41d))
## [0.11.0](https://github.com/shizand/statapp/compare/v0.10.2...v0.11.0) (2024-02-03) ## [0.11.0](https://github.com/shizand/statapp/compare/v0.10.2...v0.11.0) (2024-02-03)

View File

@@ -42,7 +42,7 @@ pyinstaller statapp.spec # или pyinstaller statapp.spec -- --one-file
Документация собирается с помощью [grip](https://github.com/joeyespo/grip) Документация собирается с помощью [grip](https://github.com/joeyespo/grip)
```bash ```bash
echo "STYLE_URLS = [\"https://cdn.jsdelivr.net/gh/shizand/statapp@main/docs/grip.css\"]" > ~/.grip/settings.py echo "STYLE_URLS = [\"https://cdn.jsdelivr.net/gh/shizand/statapp@main/statapp/docs/grip.css\"]" > ~/.grip/settings.py
cd docs cd docs
grip . grip .
``` ```

View File

@@ -144,7 +144,6 @@ dependencies:
- pyyaml==6.0.1 - pyyaml==6.0.1
- setuptools-scm==8.0.4 - setuptools-scm==8.0.4
- six==1.16.0 - six==1.16.0
- statapp==0.10.2
- sympy==1.12 - sympy==1.12
- tomli==2.0.1 - tomli==2.0.1
- tomlkit==0.12.1 - tomlkit==0.12.1

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "statapp" name = "statapp"
version = "0.11.0" version = "0.12.0"
description = "" description = ""
authors = [ authors = [
"Maxim Slipenko <statapp@maks1ms.addy.io>" "Maxim Slipenko <statapp@maks1ms.addy.io>"

View File

@@ -0,0 +1,105 @@
#
# Copyright (c) 2024 Maxim Slipenko, Eugene Lazurenko.
#
# This file is part of Statapp
# (see https://github.com/shizand/statapp).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import numpy as np
from PySide2.QtWidgets import QDialog, QVBoxLayout, QComboBox
from statapp.polynoms.polynom_window import MplCanvas
from statapp.utils import addIcon
from statapp.models.utils import yxHeader
class DistributionWindow(QDialog):
def __init__(self, title: str, data: np.ndarray):
super().__init__()
self.setWindowTitle(title)
addIcon(self)
self.layout = QVBoxLayout()
self.setLayout(self.layout)
self.data = data
self.values = yxHeader(data.shape[1])
self.comboBox = QComboBox()
self.comboBox.addItems(self.values)
self.comboBox.currentIndexChanged.connect(self.onChange)
self.sc = self.getSc(data[:, 0])
self.layout.addWidget(self.comboBox)
self.l = QVBoxLayout()
self.l.addWidget(self.sc)
self.layout.addLayout(self.l)
def onChange(self):
while ((child := self.l.takeAt(0)) is not None):
child.widget().deleteLater()
self.sc = self.getSc(self.data[:, self.comboBox.currentIndex()])
self.l.addWidget(self.sc)
class UniformDistributionWindow(DistributionWindow):
def __init__(self, data: np.array):
super().__init__("Равномерное распределение", data)
def getSc(self, points):
sc = MplCanvas(self, width=5, height=4, dpi=100)
points = np.sort(points)
points = np.array(
[points[0]] +
[pt for pt, next_pt in zip(points[:-1], points[1:]) if pt != next_pt]
)
differences = np.diff(points)
inverseDifferences = 1 / differences
for i, (start, end) in enumerate(zip(points[:-1], points[1:])):
sc.axes.hlines(inverseDifferences[i], start, end, colors='r', linestyles='solid')
return sc
def normalDensity(x, mu, sigmaSquared):
return 1 / np.sqrt(2 * np.pi * sigmaSquared) * np.exp(-(x - mu) ** 2 / (2 * sigmaSquared))
class NormalDistributionWindow(DistributionWindow):
def __init__(self, data: np.array):
super().__init__("Нормальное распределение", data)
def getSc(self, points):
sc = MplCanvas(self, width=5, height=4, dpi=100)
points = np.sort(points)
mu = np.mean(points)
sigmaSquared = np.var(points)
yValues = normalDensity(points, mu, sigmaSquared)
sc.axes.plot(points, yValues)
return sc
class ExponentialDistributionWindow(DistributionWindow):
def __init__(self, data: np.array):
super().__init__("Экспоненциальное распределение", data)
def getSc(self, points):
sc = MplCanvas(self, width=5, height=4, dpi=100)
points = np.sort(points)
mu = np.mean(points)
lambdaParam = 1 / mu
yValues = lambdaParam * np.exp(-lambdaParam * points)
sc.axes.plot(points, yValues)
return sc

File diff suppressed because one or more lines are too long

View File

@@ -28,10 +28,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
***Параметр*** - так отображаются параметры, которые пользователь может получить в результате вычислений в приложении. ***Параметр*** - так отображаются параметры, которые пользователь может получить в результате вычислений в приложении.
## Введение ## Введение
"Statapp" — это программное решение для статистического анализа и регрессионного моделирования, позволяющее специалистам в области данных проводить глубокий анализ и создавать точные прогностические модели. "Statapp" — это программное решение для статистического анализа и регрессионного моделирования, позволяющее специалистам в области данных проводить глубокий анализ и создавать точные прогностические модели.
## Теоретические сведения ## Дополнительная литература
- [Гмурман В. Е. Теория вероятностей и математическая статистика. Учеб. пособие для вузов.pdf](https://raw.githubusercontent.com/shizand/statapp/v0.12.0/literature/%D0%93%D0%BE%D1%80%D1%8F%D0%B8%D0%BD%D0%BE%D0%B2%20%D0%92.%20%D0%A2.%2C%20%D0%96%D1%83%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%B2%20%D0%90.%20%D0%93.%2C%20%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%20%D0%92.%20%D0%98.%20%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D1%80%D0%B0%D0%B4%D0%B8%D0%BE%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0%3A%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%B8%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8.pdf)
- [Гмурман В.Е. Руководство к решению задач по теории вероятностей и математической статистике](https://raw.githubusercontent.com/shizand/statapp/v0.12.0/literature/%D0%93%D0%BC%D1%83%D1%80%D0%BC%D0%B0%D0%BD%20%D0%92.%D0%95.%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%BA%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%20%D0%BF%D0%BE%20%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8%20%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B5%D0%B9%20%D0%B8%20%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9%20%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B5.pdf)
- [Горяинов В. Т., Журавлев А. Г., Тихонов В. И. Статистическая радиотехника: Примеры и задачи](https://raw.githubusercontent.com/shizand/statapp/v0.12.0/literature/https%3A%2F%2Fraw.githubusercontent.com%2Fshizand%2Fstatapp%2Fv0.12.0%2Fliterature%2F%D0%93%D0%BE%D1%80%D1%8F%D0%B8%D0%BD%D0%BE%D0%B2%20%D0%92.%20%D0%A2.%2C%20%D0%96%D1%83%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%B2%20%D0%90.%20%D0%93.%2C%20%D0%A2%D0%B8%D1%85%D0%BE%D0%BD%D0%BE%D0%B2%20%D0%92.%20%D0%98.%20%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D1%80%D0%B0%D0%B4%D0%B8%D0%BE%D1%82%D0%B5%D1%85%D0%BD%D0%B8%D0%BA%D0%B0%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%B8%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8.pdf)
- [Григорьев-Голубев, В. В. Теория вероятностей и математическая статистика. Руководство по решению задач](https://raw.githubusercontent.com/shizand/statapp/v0.12.0/literature/%D0%93%D1%80%D0%B8%D0%B3%D0%BE%D1%80%D1%8C%D0%B5%D0%B2-%D0%93%D0%BE%D0%BB%D1%83%D0%B1%D0%B5%D0%B2%2C%20%D0%92.%20%D0%92.%20%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F%20%D0%B2%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D0%B5%D0%B9%20%D0%B8%20%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0.%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%BF%D0%BE%20%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%B7%D0%B0%D0%B4%D0%B0%D1%87.pdf)
- [Кадочникова Е. И. Эконометрика. Конспект лекций](https://raw.githubusercontent.com/shizand/statapp/v0.12.0/literature/%D0%9A%D0%B0%D0%B4%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0%20%D0%95.%20%D0%98.%20%D0%AD%D0%BA%D0%BE%D0%BD%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D0%BA%D0%B0.%20%D0%9A%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82%20%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D0%B9.pdf)
- [Касьянов В. А. Эконометрика](https://raw.githubusercontent.com/shizand/statapp/v0.12.0/literature/%D0%9A%D0%B0%D1%81%D1%8C%D1%8F%D0%BD%D0%BE%D0%B2%20%D0%92.%20%D0%90.%20%D0%AD%D0%BA%D0%BE%D0%BD%D0%BE%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D0%BA%D0%B0.pdf)
- [Садовникова Н.А., Шмойлова Р.А. Анализ временных рядов и прогнозирование. Вып. 3](https://raw.githubusercontent.com/shizand/statapp/v0.12.0/literature/%D0%A1%D0%B0%D0%B4%D0%BE%D0%B2%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2%D0%B0%20%D0%9D.%D0%90.%2C%20%D0%A8%D0%BC%D0%BE%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0%20%D0%A0.%D0%90.%20%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%20%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20%D1%80%D1%8F%D0%B4%D0%BE%D0%B2%20%D0%B8%20%D0%BF%D1%80%D0%BE%D0%B3%D0%BD%D0%BE%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5.%20%D0%92%D1%8B%D0%BF.%203.pdf)
## Краткие теоретические сведения
*-- В разработке --* *-- В разработке --*
@@ -43,7 +52,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
### Генерация отклика ### Генерация отклика
Перед тем как начать анализ, необходимо сгенерировать отклики, которые будут использоваться как зависимые переменные в моделях: Перед тем как начать анализ, необходимо сгенерировать ***отклики***, которые будут использоваться как зависимые переменные в моделях:
1. Перейдите в меню `Генерация показателей`. 1. Перейдите в меню `Генерация показателей`.
2. Выберите `Генерация отклика`. 2. Выберите `Генерация отклика`.
@@ -66,7 +75,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
### Генерация фактора ### Генерация фактора
После генерации откликов следует сгенерировать факторы, которые будут служить независимыми переменными. Для генерации факторов необходимо выполнить следующие шаги: После генерации ***откликов*** следует сгенерировать ***факторы***, которые будут служить независимыми переменными. Для генерации ***факторов*** необходимо выполнить следующие шаги:
1. Перейдите в меню `Генерация показателей`. 1. Перейдите в меню `Генерация показателей`.
2. Выберите `Генерация фактора`. 2. Выберите `Генерация фактора`.
@@ -77,7 +86,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*Пример пункта меню* `Генерация фактора` *Пример пункта меню* `Генерация фактора`
3. Выберите нужный тип связи к отклику (прямая или обратная). 3. Выберите нужный тип связи к ***отклику*** (прямая или обратная).
4. Укажите оставшиеся параметры для генерации данных и нажмите кнопку `Сгенерировать`. 4. Укажите оставшиеся параметры для генерации данных и нажмите кнопку `Сгенерировать`.
<image src="files/Окно - Генерация фактора.PNG" width=400> <image src="files/Окно - Генерация фактора.PNG" width=400>
@@ -88,9 +97,26 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<hr> <hr>
### Удаление факторов
Так как программа `Statapp` генерирует показатели ***Факторов*** случайным образом в границах заданого ***Среднеквадратического отклонения*** то при генерации нескольких ***Факторов*** может возникнуть необходимость удаления некоторых из них. Для этого необходимо выполнить следующие шаги:
1. Выберите необходимый ***Фактор*** для удаления и кликните по `Заголовку` с обозначением `Xn` правой кнопкой мыши.
2. Нажмите на появившуюся кнопку `Удалить` для удаления выбранного ***Фактора***.
*Внимание после удаления ***Фактора*** действие уже нельзя будет отменить*
<image src="files/Окно - Удаление.PNG">
*Пример появившейся кнопки* `Удалить`
Удаленный ***Фактор*** пропадет из таблицы и более не будет учитываться в `Анализе` и `Моделировании`.
<hr>
### Анализ данных ### Анализ данных
После генерации отклика и факторов можно приступать к анализу данных. После генерации ***отклика*** и ***факторов*** можно приступать к анализу данных.
<hr> <hr>
@@ -181,7 +207,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
### Сохранение и открытие файла ### Сохранение и открытие файла
Сгенерированные значения ***Отклика*** и ***Фактора*** из таблицы в `Главном окне` можно сохранить или зугрузить из файла ***.txt*** и ***.csv***. Сгенерированные значения ***отклика*** и ***фактора*** из таблицы в `Главном окне` можно сохранить или зугрузить из файла ***.txt*** и ***.csv***.
### Сохранение файла ### Сохранение файла

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -24,6 +24,8 @@ from PySide2.QtWidgets import QMainWindow, QMessageBox, QAction, QMenu
from statapp.calculations import generateXValues, generateYValues from statapp.calculations import generateXValues, generateYValues
from statapp.constants import NUMBERS_PRECISION from statapp.constants import NUMBERS_PRECISION
from statapp.distribution_window import NormalDistributionWindow, UniformDistributionWindow, \
ExponentialDistributionWindow
from statapp.generate_factor_window import GenerateFactorWindow from statapp.generate_factor_window import GenerateFactorWindow
from statapp.polynoms.linear_polynom_window import LinearPolynomWindow from statapp.polynoms.linear_polynom_window import LinearPolynomWindow
from statapp.mathtex_header_view import MathTexHeaderView from statapp.mathtex_header_view import MathTexHeaderView
@@ -257,6 +259,30 @@ class MainWindow(QMainWindow):
except Exception as error: except Exception as error:
onError(error) onError(error)
@Slot()
def on_uniformDistributionAction_triggered(self):
try:
dw = UniformDistributionWindow(self.model.getData())
dw.exec()
except Exception as error:
onError(error)
@Slot()
def on_normalDistributionAction_triggered(self):
try:
dw = NormalDistributionWindow(self.model.getData())
dw.exec()
except Exception as error:
onError(error)
@Slot()
def on_exponentialDistributionAction_triggered(self):
try:
dw = ExponentialDistributionWindow(self.model.getData())
dw.exec()
except Exception as error:
onError(error)
def closeEvent(self, event): def closeEvent(self, event):
if self.isDataChanged: if self.isDataChanged:
file = '' file = ''

View File

@@ -74,10 +74,6 @@ class PolynomWindow(QDialog):
realY = predictionResult[:, 0] realY = predictionResult[:, 0]
calculatedY = predictionResult[:, 1] calculatedY = predictionResult[:, 1]
print(xAxes)
print(realY)
print(calculatedY)
sc.axes.scatter(xAxes, realY) sc.axes.scatter(xAxes, realY)
# xnew = np.linspace(xAxes.min(), xAxes.max(), 300) # xnew = np.linspace(xAxes.min(), xAxes.max(), 300)

View File

@@ -87,7 +87,6 @@ class TransformPolynomWindow(QDialog):
def on_data_changed(self): def on_data_changed(self):
data = np.copy(self.data) data = np.copy(self.data)
print(len(data[0:]))
for i in range(len(data[0:])): for i in range(len(data[0:])):
for j in range(1, len(data[i])): for j in range(1, len(data[i])):
tr = self.model.data(self.model.createIndex(j, 0), Qt.DisplayRole) tr = self.model.data(self.model.createIndex(j, 0), Qt.DisplayRole)

View File

@@ -101,15 +101,6 @@
<pointsize>12</pointsize> <pointsize>12</pointsize>
</font> </font>
</property> </property>
<property name="editable">
<bool>false</bool>
</property>
<property name="currentText">
<string/>
</property>
<property name="placeholderText">
<string/>
</property>
</widget> </widget>
</item> </item>
</layout> </layout>

View File

@@ -40,7 +40,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>800</width> <width>800</width>
<height>22</height> <height>29</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="filemenu"> <widget class="QMenu" name="filemenu">
@@ -80,10 +80,19 @@
<addaction name="usageaction"/> <addaction name="usageaction"/>
<addaction name="aboutmenuaction"/> <addaction name="aboutmenuaction"/>
</widget> </widget>
<widget class="QMenu" name="menu">
<property name="title">
<string>Распределения</string>
</property>
<addaction name="uniformDistributionAction"/>
<addaction name="normalDistributionAction"/>
<addaction name="exponentialDistributionAction"/>
</widget>
<addaction name="filemenu"/> <addaction name="filemenu"/>
<addaction name="generatemenu"/> <addaction name="generatemenu"/>
<addaction name="analyzemenu"/> <addaction name="analyzemenu"/>
<addaction name="modelmenu"/> <addaction name="modelmenu"/>
<addaction name="menu"/>
<addaction name="helpmenu"/> <addaction name="helpmenu"/>
</widget> </widget>
<widget class="QStatusBar" name="statusbar"/> <widget class="QStatusBar" name="statusbar"/>
@@ -147,6 +156,21 @@
<string>Использование</string> <string>Использование</string>
</property> </property>
</action> </action>
<action name="uniformDistributionAction">
<property name="text">
<string>Равномерное</string>
</property>
</action>
<action name="normalDistributionAction">
<property name="text">
<string>Нормальное</string>
</property>
</action>
<action name="exponentialDistributionAction">
<property name="text">
<string>Экспоненциальное</string>
</property>
</action>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>

View File

@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
# Copyright (c) 2024 Maxim Slipenko, Eugene Lazurenko. # Copyright (c) 2024 Maxim Slipenko, Eugene Lazurenko.
# #
@@ -19,93 +20,70 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
from PySide2 import QtCore, QtGui, QtWidgets
################################################################################
## Form generated from reading UI file 'generate_factor_window.ui'
##
## Created by: Qt User Interface Compiler version 5.15.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class Ui_GenerateFactorWindow(object): class Ui_GenerateFactorWindow(object):
def setupUi(self, GenerateFactorWindow): def setupUi(self, GenerateFactorWindow):
if not GenerateFactorWindow.objectName(): GenerateFactorWindow.setObjectName("GenerateFactorWindow")
GenerateFactorWindow.setObjectName(u"GenerateFactorWindow")
GenerateFactorWindow.resize(503, 193) GenerateFactorWindow.resize(503, 193)
self.gridLayout_2 = QGridLayout(GenerateFactorWindow) self.gridLayout_2 = QtWidgets.QGridLayout(GenerateFactorWindow)
self.gridLayout_2.setObjectName(u"gridLayout_2") self.gridLayout_2.setObjectName("gridLayout_2")
self.gridLayout = QGridLayout() self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName(u"gridLayout") self.gridLayout.setObjectName("gridLayout")
self.label = QLabel(GenerateFactorWindow) self.label = QtWidgets.QLabel(GenerateFactorWindow)
self.label.setObjectName(u"label") font = QtGui.QFont()
font = QFont()
font.setPointSize(12) font.setPointSize(12)
self.label.setFont(font) self.label.setFont(font)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1) self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.label_3 = QtWidgets.QLabel(GenerateFactorWindow)
self.label_3 = QLabel(GenerateFactorWindow) font = QtGui.QFont()
self.label_3.setObjectName(u"label_3") font.setPointSize(12)
self.label_3.setFont(font) self.label_3.setFont(font)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1) self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1)
self.generatePushButton = QtWidgets.QPushButton(GenerateFactorWindow)
self.generatePushButton = QPushButton(GenerateFactorWindow) font = QtGui.QFont()
self.generatePushButton.setObjectName(u"generatePushButton") font.setPointSize(12)
self.generatePushButton.setFont(font) self.generatePushButton.setFont(font)
self.generatePushButton.setObjectName("generatePushButton")
self.gridLayout.addWidget(self.generatePushButton, 3, 0, 1, 2) self.gridLayout.addWidget(self.generatePushButton, 3, 0, 1, 2)
self.label_2 = QtWidgets.QLabel(GenerateFactorWindow)
self.label_2 = QLabel(GenerateFactorWindow) font = QtGui.QFont()
self.label_2.setObjectName(u"label_2") font.setPointSize(12)
self.label_2.setFont(font) self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1) self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
self.matSpinBox = QtWidgets.QDoubleSpinBox(GenerateFactorWindow)
self.matSpinBox = QDoubleSpinBox(GenerateFactorWindow) font = QtGui.QFont()
self.matSpinBox.setObjectName(u"matSpinBox") font.setPointSize(12)
self.matSpinBox.setFont(font) self.matSpinBox.setFont(font)
self.matSpinBox.setDecimals(5) self.matSpinBox.setDecimals(5)
self.matSpinBox.setMaximum(1000000.000000000000000) self.matSpinBox.setMaximum(1000000.0)
self.matSpinBox.setObjectName("matSpinBox")
self.gridLayout.addWidget(self.matSpinBox, 1, 1, 1, 1) self.gridLayout.addWidget(self.matSpinBox, 1, 1, 1, 1)
self.deviationSpinBox = QtWidgets.QDoubleSpinBox(GenerateFactorWindow)
self.deviationSpinBox = QDoubleSpinBox(GenerateFactorWindow) font = QtGui.QFont()
self.deviationSpinBox.setObjectName(u"deviationSpinBox") font.setPointSize(12)
self.deviationSpinBox.setFont(font) self.deviationSpinBox.setFont(font)
self.deviationSpinBox.setDecimals(5) self.deviationSpinBox.setDecimals(5)
self.deviationSpinBox.setMaximum(1000000.000000000000000) self.deviationSpinBox.setMaximum(1000000.0)
self.deviationSpinBox.setObjectName("deviationSpinBox")
self.gridLayout.addWidget(self.deviationSpinBox, 2, 1, 1, 1) self.gridLayout.addWidget(self.deviationSpinBox, 2, 1, 1, 1)
self.typeComboBox = QtWidgets.QComboBox(GenerateFactorWindow)
self.typeComboBox = QComboBox(GenerateFactorWindow) font = QtGui.QFont()
self.typeComboBox.setObjectName(u"typeComboBox") font.setPointSize(12)
self.typeComboBox.setFont(font) self.typeComboBox.setFont(font)
self.typeComboBox.setEditable(False) self.typeComboBox.setObjectName("typeComboBox")
self.gridLayout.addWidget(self.typeComboBox, 0, 1, 1, 1) self.gridLayout.addWidget(self.typeComboBox, 0, 1, 1, 1)
self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1) self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
self.retranslateUi(GenerateFactorWindow) self.retranslateUi(GenerateFactorWindow)
QtCore.QMetaObject.connectSlotsByName(GenerateFactorWindow)
QMetaObject.connectSlotsByName(GenerateFactorWindow)
# setupUi
def retranslateUi(self, GenerateFactorWindow): def retranslateUi(self, GenerateFactorWindow):
GenerateFactorWindow.setWindowTitle(QCoreApplication.translate("GenerateFactorWindow", u"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432", None)) GenerateFactorWindow.setWindowTitle(QtWidgets.QApplication.translate("GenerateFactorWindow", "Генерация факторов", None, -1))
self.label.setText(QCoreApplication.translate("GenerateFactorWindow", u"\u0422\u0438\u043f \u0441\u0432\u044f\u0437\u0438", None)) self.label.setText(QtWidgets.QApplication.translate("GenerateFactorWindow", "Тип связи", None, -1))
self.label_3.setText(QCoreApplication.translate("GenerateFactorWindow", u"\u0421\u0440\u0435\u0434\u043d\u0435\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435", None)) self.label_3.setText(QtWidgets.QApplication.translate("GenerateFactorWindow", "Среднеквадратичное отклонение", None, -1))
self.generatePushButton.setText(QCoreApplication.translate("GenerateFactorWindow", u"\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c", None)) self.generatePushButton.setText(QtWidgets.QApplication.translate("GenerateFactorWindow", "Сгенерировать", None, -1))
self.label_2.setText(QCoreApplication.translate("GenerateFactorWindow", u"\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435", None)) self.label_2.setText(QtWidgets.QApplication.translate("GenerateFactorWindow", "Математическое ожидание", None, -1))
self.typeComboBox.setCurrentText("")
self.typeComboBox.setPlaceholderText("")
# retranslateUi

View File

@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
# Copyright (c) 2024 Maxim Slipenko, Eugene Lazurenko. # Copyright (c) 2024 Maxim Slipenko, Eugene Lazurenko.
# #
@@ -19,89 +20,74 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
from PySide2 import QtCore, QtGui, QtWidgets
################################################################################
## Form generated from reading UI file 'main_window.ui'
##
## Created by: Qt User Interface Compiler version 5.15.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class Ui_MainWindow(object): class Ui_MainWindow(object):
def setupUi(self, MainWindow): def setupUi(self, MainWindow):
if not MainWindow.objectName(): MainWindow.setObjectName("MainWindow")
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(800, 600) MainWindow.resize(800, 600)
self.aboutmenuaction = QAction(MainWindow) self.centralwidget = QtWidgets.QWidget(MainWindow)
self.aboutmenuaction.setObjectName(u"aboutmenuaction") self.centralwidget.setObjectName("centralwidget")
self.generateYaction = QAction(MainWindow) self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.generateYaction.setObjectName(u"generateYaction") self.gridLayout.setObjectName("gridLayout")
self.generateXaction = QAction(MainWindow) self.label = QtWidgets.QLabel(self.centralwidget)
self.generateXaction.setObjectName(u"generateXaction") self.label.setAlignment(QtCore.Qt.AlignCenter)
self.openfileaction = QAction(MainWindow) self.label.setObjectName("label")
self.openfileaction.setObjectName(u"openfileaction")
self.savefileaction = QAction(MainWindow)
self.savefileaction.setObjectName(u"savefileaction")
self.closefileaction = QAction(MainWindow)
self.closefileaction.setObjectName(u"closefileaction")
self.varianceAnalysisAction = QAction(MainWindow)
self.varianceAnalysisAction.setObjectName(u"varianceAnalysisAction")
self.correlationAnalisisAction = QAction(MainWindow)
self.correlationAnalisisAction.setObjectName(u"correlationAnalisisAction")
self.linearPolynomAction = QAction(MainWindow)
self.linearPolynomAction.setObjectName(u"linearPolynomAction")
self.squaredPolynomAction = QAction(MainWindow)
self.squaredPolynomAction.setObjectName(u"squaredPolynomAction")
self.transformPolynomAction = QAction(MainWindow)
self.transformPolynomAction.setObjectName(u"transformPolynomAction")
self.usageaction = QAction(MainWindow)
self.usageaction.setObjectName(u"usageaction")
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.gridLayout = QGridLayout(self.centralwidget)
self.gridLayout.setObjectName(u"gridLayout")
self.label = QLabel(self.centralwidget)
self.label.setObjectName(u"label")
self.label.setAlignment(Qt.AlignCenter)
self.gridLayout.addWidget(self.label, 0, 0, 1, 1) self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.tableView = QtWidgets.QTableView(self.centralwidget)
self.tableView = QTableView(self.centralwidget) self.tableView.setObjectName("tableView")
self.tableView.setObjectName(u"tableView")
self.tableView.verticalHeader().setVisible(False) self.tableView.verticalHeader().setVisible(False)
self.gridLayout.addWidget(self.tableView, 1, 0, 1, 1) self.gridLayout.addWidget(self.tableView, 1, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget) MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow) self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setObjectName(u"menubar") self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 29))
self.menubar.setGeometry(QRect(0, 0, 800, 22)) self.menubar.setObjectName("menubar")
self.filemenu = QMenu(self.menubar) self.filemenu = QtWidgets.QMenu(self.menubar)
self.filemenu.setObjectName(u"filemenu") self.filemenu.setObjectName("filemenu")
self.generatemenu = QMenu(self.menubar) self.generatemenu = QtWidgets.QMenu(self.menubar)
self.generatemenu.setObjectName(u"generatemenu") self.generatemenu.setObjectName("generatemenu")
self.analyzemenu = QMenu(self.menubar) self.analyzemenu = QtWidgets.QMenu(self.menubar)
self.analyzemenu.setObjectName(u"analyzemenu") self.analyzemenu.setObjectName("analyzemenu")
self.modelmenu = QMenu(self.menubar) self.modelmenu = QtWidgets.QMenu(self.menubar)
self.modelmenu.setObjectName(u"modelmenu") self.modelmenu.setObjectName("modelmenu")
self.helpmenu = QMenu(self.menubar) self.helpmenu = QtWidgets.QMenu(self.menubar)
self.helpmenu.setObjectName(u"helpmenu") self.helpmenu.setObjectName("helpmenu")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
MainWindow.setMenuBar(self.menubar) MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow) self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar") self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar) MainWindow.setStatusBar(self.statusbar)
self.aboutmenuaction = QtWidgets.QAction(MainWindow)
self.menubar.addAction(self.filemenu.menuAction()) self.aboutmenuaction.setObjectName("aboutmenuaction")
self.menubar.addAction(self.generatemenu.menuAction()) self.generateYaction = QtWidgets.QAction(MainWindow)
self.menubar.addAction(self.analyzemenu.menuAction()) self.generateYaction.setObjectName("generateYaction")
self.menubar.addAction(self.modelmenu.menuAction()) self.generateXaction = QtWidgets.QAction(MainWindow)
self.menubar.addAction(self.helpmenu.menuAction()) self.generateXaction.setObjectName("generateXaction")
self.openfileaction = QtWidgets.QAction(MainWindow)
self.openfileaction.setObjectName("openfileaction")
self.savefileaction = QtWidgets.QAction(MainWindow)
self.savefileaction.setObjectName("savefileaction")
self.closefileaction = QtWidgets.QAction(MainWindow)
self.closefileaction.setObjectName("closefileaction")
self.varianceAnalysisAction = QtWidgets.QAction(MainWindow)
self.varianceAnalysisAction.setObjectName("varianceAnalysisAction")
self.correlationAnalisisAction = QtWidgets.QAction(MainWindow)
self.correlationAnalisisAction.setObjectName("correlationAnalisisAction")
self.linearPolynomAction = QtWidgets.QAction(MainWindow)
self.linearPolynomAction.setObjectName("linearPolynomAction")
self.squaredPolynomAction = QtWidgets.QAction(MainWindow)
self.squaredPolynomAction.setObjectName("squaredPolynomAction")
self.transformPolynomAction = QtWidgets.QAction(MainWindow)
self.transformPolynomAction.setObjectName("transformPolynomAction")
self.usageaction = QtWidgets.QAction(MainWindow)
self.usageaction.setObjectName("usageaction")
self.uniformDistributionAction = QtWidgets.QAction(MainWindow)
self.uniformDistributionAction.setObjectName("uniformDistributionAction")
self.normalDistributionAction = QtWidgets.QAction(MainWindow)
self.normalDistributionAction.setObjectName("normalDistributionAction")
self.exponentialDistributionAction = QtWidgets.QAction(MainWindow)
self.exponentialDistributionAction.setObjectName("exponentialDistributionAction")
self.filemenu.addAction(self.openfileaction) self.filemenu.addAction(self.openfileaction)
self.filemenu.addAction(self.savefileaction) self.filemenu.addAction(self.savefileaction)
self.filemenu.addAction(self.closefileaction) self.filemenu.addAction(self.closefileaction)
@@ -114,30 +100,40 @@ class Ui_MainWindow(object):
self.modelmenu.addAction(self.transformPolynomAction) self.modelmenu.addAction(self.transformPolynomAction)
self.helpmenu.addAction(self.usageaction) self.helpmenu.addAction(self.usageaction)
self.helpmenu.addAction(self.aboutmenuaction) self.helpmenu.addAction(self.aboutmenuaction)
self.menu.addAction(self.uniformDistributionAction)
self.menu.addAction(self.normalDistributionAction)
self.menu.addAction(self.exponentialDistributionAction)
self.menubar.addAction(self.filemenu.menuAction())
self.menubar.addAction(self.generatemenu.menuAction())
self.menubar.addAction(self.analyzemenu.menuAction())
self.menubar.addAction(self.modelmenu.menuAction())
self.menubar.addAction(self.menu.menuAction())
self.menubar.addAction(self.helpmenu.menuAction())
self.retranslateUi(MainWindow) self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow): def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435", None)) MainWindow.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", "Статистическое моделирование", None, -1))
self.aboutmenuaction.setText(QCoreApplication.translate("MainWindow", u"\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435", None)) self.label.setText(QtWidgets.QApplication.translate("MainWindow", "СТАТИСТИЧЕСКИЕ ДАННЫЕ", None, -1))
self.generateYaction.setText(QCoreApplication.translate("MainWindow", u"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u043a\u043b\u0438\u043a\u0430", None)) self.filemenu.setTitle(QtWidgets.QApplication.translate("MainWindow", "Файл", None, -1))
self.generateXaction.setText(QCoreApplication.translate("MainWindow", u"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0430\u043a\u0442\u043e\u0440\u0430", None)) self.generatemenu.setTitle(QtWidgets.QApplication.translate("MainWindow", "Генерация показателей", None, -1))
self.openfileaction.setText(QCoreApplication.translate("MainWindow", u"\u041e\u0442\u043a\u0440\u044b\u0442\u044c", None)) self.analyzemenu.setTitle(QtWidgets.QApplication.translate("MainWindow", "Анализ данных", None, -1))
self.savefileaction.setText(QCoreApplication.translate("MainWindow", u"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", None)) self.modelmenu.setTitle(QtWidgets.QApplication.translate("MainWindow", "Моделирование", None, -1))
self.closefileaction.setText(QCoreApplication.translate("MainWindow", u"\u0417\u0430\u043a\u0440\u044b\u0442\u044c", None)) self.helpmenu.setTitle(QtWidgets.QApplication.translate("MainWindow", "Справка", None, -1))
self.varianceAnalysisAction.setText(QCoreApplication.translate("MainWindow", u"\u0414\u0438\u0441\u043f\u0435\u0440\u0441\u0438\u043e\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437", None)) self.menu.setTitle(QtWidgets.QApplication.translate("MainWindow", "Распределения", None, -1))
self.correlationAnalisisAction.setText(QCoreApplication.translate("MainWindow", u"\u041a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437", None)) self.aboutmenuaction.setText(QtWidgets.QApplication.translate("MainWindow", "О программе", None, -1))
self.linearPolynomAction.setText(QCoreApplication.translate("MainWindow", u"\u041b\u0438\u043d\u0435\u0439\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u043d\u043e\u043c", None)) self.generateYaction.setText(QtWidgets.QApplication.translate("MainWindow", "Генерация отклика", None, -1))
self.squaredPolynomAction.setText(QCoreApplication.translate("MainWindow", u"\u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u0438\u043d\u043e\u043c", None)) self.generateXaction.setText(QtWidgets.QApplication.translate("MainWindow", "Генерация фактора", None, -1))
self.transformPolynomAction.setText(QCoreApplication.translate("MainWindow", u"\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f", None)) self.openfileaction.setText(QtWidgets.QApplication.translate("MainWindow", "Открыть", None, -1))
self.usageaction.setText(QCoreApplication.translate("MainWindow", u"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435", None)) self.savefileaction.setText(QtWidgets.QApplication.translate("MainWindow", "Сохранить", None, -1))
self.label.setText(QCoreApplication.translate("MainWindow", u"\u0421\u0422\u0410\u0422\u0418\u0421\u0422\u0418\u0427\u0415\u0421\u041a\u0418\u0415 \u0414\u0410\u041d\u041d\u042b\u0415", None)) self.closefileaction.setText(QtWidgets.QApplication.translate("MainWindow", "Закрыть", None, -1))
self.filemenu.setTitle(QCoreApplication.translate("MainWindow", u"\u0424\u0430\u0439\u043b", None)) self.varianceAnalysisAction.setText(QtWidgets.QApplication.translate("MainWindow", "Дисперсионный анализ", None, -1))
self.generatemenu.setTitle(QCoreApplication.translate("MainWindow", u"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439", None)) self.correlationAnalisisAction.setText(QtWidgets.QApplication.translate("MainWindow", "Корреляционный анализ", None, -1))
self.analyzemenu.setTitle(QCoreApplication.translate("MainWindow", u"\u0410\u043d\u0430\u043b\u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445", None)) self.linearPolynomAction.setText(QtWidgets.QApplication.translate("MainWindow", "Линейный полином", None, -1))
self.modelmenu.setTitle(QCoreApplication.translate("MainWindow", u"\u041c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435", None)) self.squaredPolynomAction.setText(QtWidgets.QApplication.translate("MainWindow", "Квадратичный полином", None, -1))
self.helpmenu.setTitle(QCoreApplication.translate("MainWindow", u"\u0421\u043f\u0440\u0430\u0432\u043a\u0430", None)) self.transformPolynomAction.setText(QtWidgets.QApplication.translate("MainWindow", "Преобразования", None, -1))
# retranslateUi self.usageaction.setText(QtWidgets.QApplication.translate("MainWindow", "Использование", None, -1))
self.uniformDistributionAction.setText(QtWidgets.QApplication.translate("MainWindow", "Равномерное", None, -1))
self.normalDistributionAction.setText(QtWidgets.QApplication.translate("MainWindow", "Нормальное", None, -1))
self.exponentialDistributionAction.setText(QtWidgets.QApplication.translate("MainWindow", "Экспоненциальное", None, -1))

View File

@@ -18,11 +18,19 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
from PySide2.QtCore import QUrl from PySide2.QtCore import QUrl
from PySide2.QtWebEngineWidgets import QWebEngineView from PySide2.QtGui import QDesktopServices
from PySide2.QtWebEngineWidgets import QWebEngineView, QWebEnginePage
from PySide2.QtWidgets import QMainWindow, QVBoxLayout, QWidget from PySide2.QtWidgets import QMainWindow, QVBoxLayout, QWidget
from statapp.utils import addIcon, resourcePath from statapp.utils import addIcon, resourcePath
class ExternalLinksWebEnginePage(QWebEnginePage):
def acceptNavigationRequest(self, url, _type, isMainFrame):
if _type == QWebEnginePage.NavigationTypeLinkClicked:
QDesktopServices.openUrl(url)
return False # Prevent the internal view from navigating to the URL
return True # Handle all other navigation requests normally
class UsageWindow(QMainWindow): class UsageWindow(QMainWindow):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@@ -32,9 +40,17 @@ class UsageWindow(QMainWindow):
layout = QVBoxLayout() layout = QVBoxLayout()
self.browser = QWebEngineView() self.browser = QWebEngineView()
customPage = ExternalLinksWebEnginePage(self.browser)
self.browser.setPage(customPage)
layout.addWidget(self.browser) layout.addWidget(self.browser)
self.browser.load(QUrl.fromLocalFile(resourcePath("docs/README.html"))) self.browser.load(QUrl.fromLocalFile(resourcePath("docs/README.html")))
widget = QWidget() widget = QWidget()
widget.setLayout(layout) widget.setLayout(layout)
self.setCentralWidget(widget) self.setCentralWidget(widget)
def onLinkClicked(self, url):
# Open the URL in the default web browser instead of the QWebEngineView
QDesktopServices.openUrl(url)