mirror of
https://github.com/shizand/statapp.git
synced 2025-10-07 21:03:23 +03:00
Compare commits
17 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
7f01052aa5 | ||
d3cd3589a7 | |||
|
d71bd9843f | ||
c1809a0bc7 | |||
|
83d9faeb85 | ||
57dec07000 | |||
|
cca57740a2 | ||
b6e10c4209 | |||
|
67958838fc | ||
8b7fabfa46 | |||
f603a77130 | |||
|
775c0887ab | ||
2b061bed2f | |||
48ae2644e8 | |||
|
930424dfb9 | ||
|
b73a3f5d3b | ||
2cd82354a1 |
19
.github/workflows/release.yml
vendored
19
.github/workflows/release.yml
vendored
@@ -13,11 +13,16 @@ jobs:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest, windows-latest]
|
||||
os: [ubuntu-20.04, windows-latest]
|
||||
spec: [statapp-onefile, statapp]
|
||||
arch: [x86, x64]
|
||||
include:
|
||||
- os: ubuntu-20.04
|
||||
target: linux
|
||||
- os: windows-latest
|
||||
target: windows
|
||||
exclude:
|
||||
- os: ubuntu-latest
|
||||
- os: ubuntu-20.04
|
||||
arch: x86
|
||||
defaults:
|
||||
run:
|
||||
@@ -48,12 +53,12 @@ jobs:
|
||||
with:
|
||||
type: 'zip'
|
||||
directory: 'dist'
|
||||
filename: "../${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.spec }}.zip"
|
||||
filename: "../${{ matrix.target }}-${{ matrix.arch }}-${{ matrix.spec }}.zip"
|
||||
- name: Загрузка артефактов
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.spec }}
|
||||
path: '${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.spec }}.zip'
|
||||
name: ${{ matrix.target }}-${{ matrix.arch }}-${{ matrix.spec }}
|
||||
path: '${{ matrix.target }}-${{ matrix.arch }}-${{ matrix.spec }}.zip'
|
||||
|
||||
release-please:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -65,6 +70,8 @@ jobs:
|
||||
release-type: python
|
||||
package-name: statapp
|
||||
changelog-types: '[{"type":"feat","section":"Новые функции","hidden":false},{"type":"fix","section":"Исправления","hidden":false},{"type":"chore", "hidden":true}]'
|
||||
- uses: actions/checkout@v4
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
- name: Скачивание артефактов
|
||||
if: ${{ steps.release.outputs.release_created }}
|
||||
uses: actions/download-artifact@v3
|
||||
@@ -75,4 +82,4 @@ jobs:
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run:
|
||||
gh release upload ${{ steps.release.outputs.tag_name }} ./dist/*
|
||||
gh release upload ${{ steps.release.outputs.tag_name }} ./dist/**/*.zip
|
||||
|
49
CHANGELOG.md
49
CHANGELOG.md
@@ -1,5 +1,54 @@
|
||||
# Changelog
|
||||
|
||||
## [0.3.6](https://github.com/shizand/statapp/compare/v0.3.5...v0.3.6) (2023-09-29)
|
||||
|
||||
|
||||
### Исправления
|
||||
|
||||
* добавляет иконку приложения ([#39](https://github.com/shizand/statapp/issues/39)) ([d3cd358](https://github.com/shizand/statapp/commit/d3cd3589a781df47e6d0e9d669a376aefd9090fe))
|
||||
|
||||
## [0.3.5](https://github.com/shizand/statapp/compare/v0.3.4...v0.3.5) (2023-09-28)
|
||||
|
||||
|
||||
### Исправления
|
||||
|
||||
* исправлен выбор файла для загрузки (Linux) ([c1809a0](https://github.com/shizand/statapp/commit/c1809a0bc778fde52aa392fb6656b0fd2ffeabe5))
|
||||
|
||||
## [0.3.4](https://github.com/shizand/statapp/compare/v0.3.3...v0.3.4) (2023-09-28)
|
||||
|
||||
|
||||
### Исправления
|
||||
|
||||
* исправлена ошибка, при СКО = 0 для фактора ([57dec07](https://github.com/shizand/statapp/commit/57dec07000e78d694986b1b90de42b84db14c1a7))
|
||||
|
||||
## [0.3.3](https://github.com/shizand/statapp/compare/v0.3.2...v0.3.3) (2023-09-28)
|
||||
|
||||
|
||||
### Исправления
|
||||
|
||||
* удалена упаковка системных библиотек вместе с программой (Linux) ([b6e10c4](https://github.com/shizand/statapp/commit/b6e10c420958cf554c1953f30c4cfd9dcadebd1a))
|
||||
|
||||
## [0.3.2](https://github.com/shizand/statapp/compare/v0.3.1...v0.3.2) (2023-09-28)
|
||||
|
||||
|
||||
### Исправления
|
||||
|
||||
* исправлена загрузка данных из файла ([8b7fabf](https://github.com/shizand/statapp/commit/8b7fabfa46d546b1969bdf9f4800cb0e06fa186a))
|
||||
|
||||
## [0.3.1](https://github.com/shizand/statapp/compare/v0.3.0...v0.3.1) (2023-09-28)
|
||||
|
||||
|
||||
### Исправления
|
||||
|
||||
* исправлена локализация стандартных кнопок ([2b061be](https://github.com/shizand/statapp/commit/2b061bed2f6343fc2feb87472afc4c9a051b30a9))
|
||||
|
||||
## [0.3.0](https://github.com/shizand/statapp/compare/v0.2.1...v0.3.0) (2023-09-28)
|
||||
|
||||
|
||||
### Новые функции
|
||||
|
||||
* добавлено чтение и запись исходных данных в файлы .txt, .csv ([#24](https://github.com/shizand/statapp/issues/24)) ([b73a3f5](https://github.com/shizand/statapp/commit/b73a3f5d3ba5707f0bdb816452ad7f59c0da8290))
|
||||
|
||||
## [0.2.1](https://github.com/shizand/statapp/compare/v0.2.0...v0.2.1) (2023-09-28)
|
||||
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[tool.poetry]
|
||||
name = "statapp"
|
||||
version = "0.2.1"
|
||||
version = "0.3.6"
|
||||
description = ""
|
||||
authors = [
|
||||
"Maxim Slipenko <statapp@maks1ms.addy.io>"
|
||||
|
@@ -1,7 +1,18 @@
|
||||
# -*- mode: python ; coding: utf-8 -*-
|
||||
import sys
|
||||
import typing
|
||||
from pprint import pprint
|
||||
|
||||
if typing.TYPE_CHECKING:
|
||||
from PyInstaller.building.api import COLLECT, EXE, MERGE, PYZ # noqa: F401
|
||||
from PyInstaller.building.build_main import Analysis # noqa: F401
|
||||
from PyInstaller.building.datastruct import TOC, Target, Tree # noqa: F401
|
||||
from PyInstaller.building.osx import BUNDLE # noqa: F401
|
||||
from PyInstaller.building.splash import Splash # noqa: F401
|
||||
|
||||
from PyInstaller.utils.hooks import copy_metadata
|
||||
|
||||
datas = [('statapp/images/sticker.gif', 'images')]
|
||||
datas = [('statapp/ui/images/*', 'ui/images')]
|
||||
datas += copy_metadata('statapp')
|
||||
|
||||
a = Analysis(
|
||||
@@ -16,6 +27,13 @@ a = Analysis(
|
||||
excludes=[],
|
||||
noarchive=False,
|
||||
)
|
||||
|
||||
prev_binaries = set(a.binaries)
|
||||
if sys.platform in ('linux', 'darwin'):
|
||||
a.exclude_system_libraries(list_of_exceptions=[]) # glob expression
|
||||
print('\n\nSTRIPPED SYSTEM LIBS')
|
||||
pprint(sorted(set(prev_binaries) - set(a.binaries)))
|
||||
|
||||
pyz = PYZ(a.pure)
|
||||
|
||||
exe = EXE(
|
||||
@@ -37,4 +55,5 @@ exe = EXE(
|
||||
target_arch=None,
|
||||
codesign_identity=None,
|
||||
entitlements_file=None,
|
||||
icon='statapp/ui/images/logo.ico',
|
||||
)
|
||||
|
21
statapp.spec
21
statapp.spec
@@ -1,7 +1,18 @@
|
||||
# -*- mode: python ; coding: utf-8 -*-
|
||||
import sys
|
||||
import typing
|
||||
from pprint import pprint
|
||||
|
||||
if typing.TYPE_CHECKING:
|
||||
from PyInstaller.building.api import COLLECT, EXE, MERGE, PYZ # noqa: F401
|
||||
from PyInstaller.building.build_main import Analysis # noqa: F401
|
||||
from PyInstaller.building.datastruct import TOC, Target, Tree # noqa: F401
|
||||
from PyInstaller.building.osx import BUNDLE # noqa: F401
|
||||
from PyInstaller.building.splash import Splash # noqa: F401
|
||||
|
||||
from PyInstaller.utils.hooks import copy_metadata
|
||||
|
||||
datas = [('statapp/images/sticker.gif', 'images')]
|
||||
datas = [('statapp/ui/images/*', 'ui/images')]
|
||||
datas += copy_metadata('statapp')
|
||||
|
||||
|
||||
@@ -17,6 +28,13 @@ a = Analysis(
|
||||
excludes=[],
|
||||
noarchive=False,
|
||||
)
|
||||
|
||||
prev_binaries = set(a.binaries)
|
||||
if sys.platform in ('linux', 'darwin'):
|
||||
a.exclude_system_libraries(list_of_exceptions=[]) # glob expression
|
||||
print('\n\nSTRIPPED SYSTEM LIBS')
|
||||
pprint(sorted(set(prev_binaries) - set(a.binaries)))
|
||||
|
||||
pyz = PYZ(a.pure)
|
||||
|
||||
exe = EXE(
|
||||
@@ -35,6 +53,7 @@ exe = EXE(
|
||||
target_arch=None,
|
||||
codesign_identity=None,
|
||||
entitlements_file=None,
|
||||
icon='statapp/ui/images/logo.ico',
|
||||
)
|
||||
coll = COLLECT(
|
||||
exe,
|
||||
|
@@ -1,4 +1,6 @@
|
||||
import sys
|
||||
|
||||
from PySide2 import QtCore
|
||||
from PySide2.QtWidgets import QApplication
|
||||
|
||||
from statapp.main_window import MainWindow
|
||||
@@ -6,6 +8,13 @@ from statapp.main_window import MainWindow
|
||||
|
||||
def main():
|
||||
app = QApplication(sys.argv)
|
||||
|
||||
translator = QtCore.QTranslator(app)
|
||||
locale = QtCore.QLocale.system().name()
|
||||
path = QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)
|
||||
translator.load('qt_%s' % locale, path)
|
||||
app.installTranslator(translator)
|
||||
|
||||
window = MainWindow()
|
||||
window.show()
|
||||
return app.exec_()
|
||||
|
@@ -19,7 +19,7 @@ class AboutWindow(QMainWindow):
|
||||
self.ui = Ui_AboutWindow()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
image_path = resource_path('images/sticker.gif')
|
||||
image_path = resource_path('ui/images/sticker.gif')
|
||||
movie = QMovie(image_path)
|
||||
self.ui.labelgif.setMovie(movie)
|
||||
movie.start()
|
||||
|
@@ -1,29 +1,80 @@
|
||||
import numpy as np
|
||||
from PySide2.QtCore import Slot
|
||||
from PySide2.QtWidgets import QMainWindow
|
||||
from PySide2.QtCore import Slot, QLocale, QSize
|
||||
from PySide2.QtGui import QIcon
|
||||
from PySide2.QtWidgets import QMainWindow, QMessageBox, QApplication
|
||||
|
||||
from statapp.generate_factor_window import GenerateFactorWindow, INDIRECT_LINK
|
||||
from statapp.models.data_model import DataModel
|
||||
from statapp.generate_window import GenerateWindow
|
||||
from statapp.about_window import AboutWindow
|
||||
from statapp.models.fileslc_model import FileSLCModel
|
||||
from statapp.ui.ui_main_window import Ui_MainWindow
|
||||
from statapp.utils import resource_path
|
||||
|
||||
|
||||
class MainWindow(QMainWindow):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
self.ui = Ui_MainWindow()
|
||||
self.ui.setupUi(self)
|
||||
|
||||
icon = QIcon()
|
||||
icon.addFile(resource_path("ui/images/logo.ico"), QSize(), QIcon.Normal, QIcon.Off)
|
||||
self.setWindowIcon(icon)
|
||||
|
||||
self.isDataChanged = False
|
||||
self.model = DataModel()
|
||||
self.fileModel = FileSLCModel()
|
||||
self.ui.tableView.setModel(self.model)
|
||||
|
||||
@Slot()
|
||||
def on_openfileaction_triggered(self):
|
||||
current_data = self.model.getData()
|
||||
if current_data.size > 1:
|
||||
file = ''
|
||||
if self.fileModel.file_name:
|
||||
file = '\nФайл сохранения:' + self.fileModel.file_name
|
||||
|
||||
msgBox = self.createMessageBox \
|
||||
('Сохранение данных',
|
||||
"Сохранить данные?" + file,
|
||||
QMessageBox.Question,
|
||||
QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel,
|
||||
QMessageBox.Cancel)
|
||||
|
||||
reply = msgBox.exec_()
|
||||
if reply == QMessageBox.StandardButton.Yes:
|
||||
self.fileModel.saveFile(self.model.getData())
|
||||
elif reply == QMessageBox.StandardButton.Cancel:
|
||||
return
|
||||
else:
|
||||
data = self.fileModel.loadFile()
|
||||
if data is not None:
|
||||
self.model.updateAllData(data)
|
||||
self.isDataChanged = True
|
||||
else:
|
||||
data = self.fileModel.loadFile()
|
||||
if data is not None:
|
||||
self.model.updateAllData(data)
|
||||
self.isDataChanged = True
|
||||
|
||||
@Slot()
|
||||
def on_savefileaction_triggered(self):
|
||||
self.isDataChanged = not self.fileModel.saveFile(self.model.getData())
|
||||
|
||||
@Slot()
|
||||
def on_closefileaction_triggered(self):
|
||||
self.fileModel.closeFile()
|
||||
self.isDataChanged = False
|
||||
|
||||
@Slot()
|
||||
def on_generateYaction_triggered(self):
|
||||
gw = GenerateWindow()
|
||||
if gw.exec():
|
||||
y = np.random.normal(gw.mat, gw.deviation, size=(gw.count, 1))
|
||||
self.model.updateAllData(y)
|
||||
self.isDataChanged = True
|
||||
|
||||
@Slot()
|
||||
def on_generateXaction_triggered(self):
|
||||
@@ -43,6 +94,8 @@ class MainWindow(QMainWindow):
|
||||
k = 2 - 1 / k
|
||||
if gfw.typeConnection == INDIRECT_LINK:
|
||||
k = 1 / k
|
||||
if gfw.deviation == 0:
|
||||
k = 1
|
||||
|
||||
x = np.random.normal(gfw.mat * (k ** 3), gfw.deviation * k, size=1)
|
||||
x_arr = np.append(x_arr, x)
|
||||
@@ -58,9 +111,45 @@ class MainWindow(QMainWindow):
|
||||
data = np.concatenate((data, x_arr), axis=1)
|
||||
# data = np.concatenate((data, dd), axis=1)
|
||||
self.model.updateAllData(data)
|
||||
self.isDataChanged = True
|
||||
|
||||
@Slot()
|
||||
def on_aboutmenuaction_triggered(self):
|
||||
global about_window
|
||||
about_window = AboutWindow()
|
||||
about_window.show()
|
||||
|
||||
def createMessageBox(self, title, text, icon, buttons, defaultButton):
|
||||
msgBox = QMessageBox()
|
||||
|
||||
msgBox.setIcon(icon)
|
||||
msgBox.setWindowTitle(title)
|
||||
msgBox.setText(text)
|
||||
msgBox.setStandardButtons(buttons)
|
||||
msgBox.setDefaultButton(defaultButton)
|
||||
|
||||
return msgBox
|
||||
|
||||
def closeEvent(self, event):
|
||||
if self.isDataChanged:
|
||||
file = ''
|
||||
if self.fileModel.file_name:
|
||||
file = '\nФайл сохранения:' + self.fileModel.file_name
|
||||
|
||||
msgBox = self.createMessageBox \
|
||||
('Завершение работы',
|
||||
"Сохранить данные?" + file,
|
||||
QMessageBox.Question,
|
||||
QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel,
|
||||
QMessageBox.Cancel)
|
||||
|
||||
reply = msgBox.exec_()
|
||||
if reply == QMessageBox.StandardButton.Yes:
|
||||
self.fileModel.saveFile(self.model.getData())
|
||||
event.accept()
|
||||
elif reply == QMessageBox.StandardButton.No:
|
||||
event.accept()
|
||||
else:
|
||||
event.ignore()
|
||||
else:
|
||||
event.accept()
|
||||
|
33
statapp/models/fileslc_model.py
Normal file
33
statapp/models/fileslc_model.py
Normal file
@@ -0,0 +1,33 @@
|
||||
import numpy as np
|
||||
from PySide2.QtWidgets import QFileDialog, QMessageBox
|
||||
|
||||
|
||||
class FileSLCModel:
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.file_name = None
|
||||
|
||||
def saveFile(self, data):
|
||||
if not self.file_name:
|
||||
self.file_name, _ = QFileDialog.getSaveFileName(None, "Сохранить файл", "", "Text Files (*.txt);;CSV Files (*.csv)")
|
||||
if self.file_name:
|
||||
np.savetxt(self.file_name, data, delimiter=",")
|
||||
return True
|
||||
return False
|
||||
|
||||
def loadFile(self):
|
||||
self.file_name, _ = QFileDialog.getOpenFileName(None, "Загрузить файл", "", "Files (*.txt *.csv)")
|
||||
if self.file_name:
|
||||
try:
|
||||
content = np.genfromtxt(self.file_name, delimiter=',', invalid_raise=True)
|
||||
except ValueError as e:
|
||||
QMessageBox.warning \
|
||||
(None,
|
||||
'Ошибка',
|
||||
"Ошибка чтения файла!\nФайл нельзя открыть или файл неверного формата")
|
||||
return None
|
||||
return content
|
||||
|
||||
def closeFile(self):
|
||||
self.file_name = None
|
||||
pass
|
BIN
statapp/ui/images/logo.ico
Normal file
BIN
statapp/ui/images/logo.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 100 KiB |
Before Width: | Height: | Size: 2.9 MiB After Width: | Height: | Size: 2.9 MiB |
@@ -40,13 +40,16 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>19</height>
|
||||
<height>21</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="filemenu">
|
||||
<property name="title">
|
||||
<string>Файл</string>
|
||||
</property>
|
||||
<addaction name="openfileaction"/>
|
||||
<addaction name="savefileaction"/>
|
||||
<addaction name="closefileaction"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="generatemenu">
|
||||
<property name="title">
|
||||
@@ -93,7 +96,21 @@
|
||||
<string>Генерация фактора</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="openfileaction">
|
||||
<property name="text">
|
||||
<string>Открыть</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="savefileaction">
|
||||
<property name="text">
|
||||
<string>Сохранить</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="closefileaction">
|
||||
<property name="text">
|
||||
<string>Закрыть</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
15
statapp/ui/ui_main_window.py
generated
15
statapp/ui/ui_main_window.py
generated
@@ -12,7 +12,6 @@ from PySide2.QtCore import *
|
||||
from PySide2.QtGui import *
|
||||
from PySide2.QtWidgets import *
|
||||
|
||||
|
||||
class Ui_MainWindow(object):
|
||||
def setupUi(self, MainWindow):
|
||||
if not MainWindow.objectName():
|
||||
@@ -24,6 +23,12 @@ class Ui_MainWindow(object):
|
||||
self.generateYaction.setObjectName(u"generateYaction")
|
||||
self.generateXaction = QAction(MainWindow)
|
||||
self.generateXaction.setObjectName(u"generateXaction")
|
||||
self.openfileaction = QAction(MainWindow)
|
||||
self.openfileaction.setObjectName(u"openfileaction")
|
||||
self.savefileaction = QAction(MainWindow)
|
||||
self.savefileaction.setObjectName(u"savefileaction")
|
||||
self.closefileaction = QAction(MainWindow)
|
||||
self.closefileaction.setObjectName(u"closefileaction")
|
||||
self.centralwidget = QWidget(MainWindow)
|
||||
self.centralwidget.setObjectName(u"centralwidget")
|
||||
self.gridLayout = QGridLayout(self.centralwidget)
|
||||
@@ -43,7 +48,7 @@ class Ui_MainWindow(object):
|
||||
MainWindow.setCentralWidget(self.centralwidget)
|
||||
self.menubar = QMenuBar(MainWindow)
|
||||
self.menubar.setObjectName(u"menubar")
|
||||
self.menubar.setGeometry(QRect(0, 0, 800, 19))
|
||||
self.menubar.setGeometry(QRect(0, 0, 800, 21))
|
||||
self.filemenu = QMenu(self.menubar)
|
||||
self.filemenu.setObjectName(u"filemenu")
|
||||
self.generatemenu = QMenu(self.menubar)
|
||||
@@ -64,6 +69,9 @@ class Ui_MainWindow(object):
|
||||
self.menubar.addAction(self.analyzemenu.menuAction())
|
||||
self.menubar.addAction(self.modelmenu.menuAction())
|
||||
self.menubar.addAction(self.helpmenu.menuAction())
|
||||
self.filemenu.addAction(self.openfileaction)
|
||||
self.filemenu.addAction(self.savefileaction)
|
||||
self.filemenu.addAction(self.closefileaction)
|
||||
self.generatemenu.addAction(self.generateYaction)
|
||||
self.generatemenu.addAction(self.generateXaction)
|
||||
self.helpmenu.addAction(self.aboutmenuaction)
|
||||
@@ -78,6 +86,9 @@ class Ui_MainWindow(object):
|
||||
self.aboutmenuaction.setText(QCoreApplication.translate("MainWindow", u"\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435", None))
|
||||
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.generateXaction.setText(QCoreApplication.translate("MainWindow", u"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0430\u043a\u0442\u043e\u0440\u0430", None))
|
||||
self.openfileaction.setText(QCoreApplication.translate("MainWindow", u"\u041e\u0442\u043a\u0440\u044b\u0442\u044c", None))
|
||||
self.savefileaction.setText(QCoreApplication.translate("MainWindow", u"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", None))
|
||||
self.closefileaction.setText(QCoreApplication.translate("MainWindow", u"\u0417\u0430\u043a\u0440\u044b\u0442\u044c", None))
|
||||
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.filemenu.setTitle(QCoreApplication.translate("MainWindow", u"\u0424\u0430\u0439\u043b", None))
|
||||
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))
|
||||
|
Reference in New Issue
Block a user