Added GUI files initially

This commit is contained in:
BlueFox 2025-05-17 02:23:05 +02:00
parent a408bb05a4
commit b088ad2cdb
3 changed files with 271 additions and 3 deletions

View File

@ -41,7 +41,7 @@ The CLI script ([tasmotonov.py](tasmotonov.py)) relies on two libaries apart fro
- `fqdn`: for validating the FQDN - `fqdn`: for validating the FQDN
- `requests`: for making the HTTP requests - `requests`: for making the HTTP requests
To use it, just execute the following command: To install it, just execute the following command:
```bash ```bash
pip install fqdn requests pip install fqdn requests
@ -49,9 +49,30 @@ pip install fqdn requests
--- ---
The GUI application is based on Qt with it's python3 bindings PyQt6. The GUI application is based on Qt with it's python3 bindings PyQt6:
TODO - `PySide6`: for running all the GUI stuff
To install it, just execute the following command:
```bash
pip install PySide6
```
## Running
CLI: Use `./tasmotonov.py`
GUI: Use `./tasmotonov-gui.py`
## Plans
I plan to add
- a darkmode maybe (but of course the interface doesn't look good either lol ;)
- and bundle everything together to get a desktop application (e.g. runnable under windows without development tools)
## License ## License

77
tasmotonov-gui.py Executable file
View File

@ -0,0 +1,77 @@
#!/usr/bin/python3
import sys
import subprocess
from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QApplication,QFileDialog
from PySide6.QtCore import QFile, QUrl, QIODevice
filename = ""
action = "toggle"
def tab1_load_file():
global filename
dialog = QFileDialog()
dialog.setFileMode(QFileDialog.AnyFile)
#fileNames = QStringList()
if dialog.exec():
filename = dialog.selectedFiles()[0]
window.tab1_label.setText(f"File loaded: {filename}")
window.tab1_label.show()
window.tab1_filecontent_textBrowser.setSource(QUrl(filename))
def tab1_action():
if filename != "":
p = subprocess.Popen(["python3", "tasmotonov.py", "file", filename, action], stdout=subprocess.PIPE)
out, err = p.communicate()
window.tab3_textBrowser.append("==== RUNNING ====\n" + str(out) + "\n=================\n")
else:
window.tab3_textBrowser.append("Will not run, no file selected!")
def tab2_action():
content = window.tab2_plainTextEdit.toPlainText()
if content != "":
p = subprocess.Popen(["python3", "tasmotonov.py", "inline", content, action], stdout=subprocess.PIPE)
out, err = p.communicate()
window.tab3_textBrowser.append("==== RUNNING ====\n" + str(out) + "\n=================\n")
print(out)
else:
window.tab3_textBrowser.append("Will not run, no input given!")
def select_on():
global action
action = "on"
window.tab3_textBrowser.append("Now turning everything on when running.")
def select_off():
global action
action = "off"
window.tab3_textBrowser.append("Now turning everything off when running.")
def select_toggle():
global action
action = "toggle"
window.tab3_textBrowser.append("Now toggling when running.")
if __name__ == "__main__":
app = QApplication(sys.argv)
ui_file_name = "tasmotonov.ui"
ui_file = QFile(ui_file_name)
if not ui_file.open(QIODevice.ReadOnly):
print(f"Cannot open {ui_file_name}: {ui_file.errorString()}")
sys.exit(-1)
loader = QUiLoader()
window = loader.load(ui_file)
ui_file.close()
if not window:
print(loader.errorString())
sys.exit(-1)
window.tab1_label.hide()
window.tab1_load_file_pushButton.clicked.connect(tab1_load_file)
window.tab1_action_pushButton.clicked.connect(tab1_action)
window.tab2_action_pushButton.clicked.connect(tab2_action)
window.radioButton_on.clicked.connect(select_on)
window.radioButton_off.clicked.connect(select_off)
window.radioButton_toggle.clicked.connect(select_toggle)
window.show()
sys.exit(app.exec())

170
tasmotonov.ui Normal file
View File

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>mainWindow</class>
<widget class="QMainWindow" name="mainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>630</width>
<height>404</height>
</rect>
</property>
<property name="windowTitle">
<string>Tasmotonov</string>
</property>
<property name="documentMode">
<bool>false</bool>
</property>
<property name="tabShape">
<enum>QTabWidget::TabShape::Rounded</enum>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="QTabWidget" name="tabWidget">
<property name="tabPosition">
<enum>QTabWidget::TabPosition::East</enum>
</property>
<property name="tabShape">
<enum>QTabWidget::TabShape::Rounded</enum>
</property>
<property name="currentIndex">
<number>1</number>
</property>
<property name="usesScrollButtons">
<bool>true</bool>
</property>
<property name="documentMode">
<bool>true</bool>
</property>
<widget class="QWidget" name="tab1_from_file">
<attribute name="title">
<string>From File</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_2">
<item row="3" column="0">
<widget class="QTextBrowser" name="tab1_filecontent_textBrowser">
<property name="frameShadow">
<enum>QFrame::Shadow::Sunken</enum>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="tab1_label">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>File loaded: </string>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QPushButton" name="tab1_action_pushButton">
<property name="text">
<string>Run!</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="tab1_load_file_pushButton">
<property name="text">
<string>Load file</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab2_from_inline">
<attribute name="title">
<string>From Inline</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPlainTextEdit" name="tab2_plainTextEdit">
<property name="lineWrapMode">
<enum>QPlainTextEdit::LineWrapMode::WidgetWidth</enum>
</property>
<property name="plainText">
<string/>
</property>
<property name="textInteractionFlags">
<set>Qt::TextInteractionFlag::LinksAccessibleByMouse|Qt::TextInteractionFlag::TextEditable|Qt::TextInteractionFlag::TextEditorInteraction|Qt::TextInteractionFlag::TextSelectableByKeyboard|Qt::TextInteractionFlag::TextSelectableByMouse</set>
</property>
<property name="placeholderText">
<string>Enter your addresses here (IP-Adresses, or Domain names / FQDNs). The list can be either comma-, semicolon-, or whitespace-separated, but should not be mixed!</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="tab2_action_pushButton">
<property name="text">
<string>Run!</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab3_output">
<attribute name="title">
<string>Console</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="tab3_label_output">
<property name="text">
<string>Tasmotonov.py output</string>
</property>
</widget>
</item>
<item>
<widget class="QTextBrowser" name="tab3_textBrowser"/>
</item>
</layout>
</widget>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QRadioButton" name="radioButton_on">
<property name="text">
<string>All ON!</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButton_off">
<property name="text">
<string>All OFF!</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButton_toggle">
<property name="text">
<string>TOGGLE all!</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>