ich hab schon viel mit Powershell gemacht und versuche nebenbei immer mal wieder was in Python zu machen.
Aktuell ein kleines Tool welches in regelmäßigen Abständen (30 Sekunden - 5 Min) eine Website (Gaming-Server) abfragt und die Daten auswerten soll.
Der Webserver liefert dann so was wie:
Und das Programm bringt es dann kurzerhand in eine ansehnliche Form. Natürlich kann man auch die Website aufrufen, aber darum gehts ja nicht, ich möchte ja was lernen.b'{"gametime":{"days":908,"hours":8,"minutes":14},"players":4,"hostiles":10,"animals":12}'
Hier der Quellcode:
Code: Alles auswählen
# Server Info - 7 Days to die - Hauptcode
#import ctypes #Für beehebung des Unschärfeeffektes
#ctypes.windll.shcore.SetProcessDpiAwareness(1)
#import qtmodern.styles # Nur für Dark - Mode
#import qtmodern.windows # Nur für Dark - Mode
from time import sleep # Für Sleep Befehl
#import requests # für Webabfragen
from threading import Thread # Für Hintergrund Schleife der Websiteabfragen
import urllib.request # Benötigt zur Abfrage von Websites
#import requests # Nur bei alternativer Prüfung Onlinestatus ! Ist aktuell auskommentiert
import re # Regex
#from PySide6.QtWidgets import (QApplication, QMainWindow, QMenuBar, QAction, QStatusBar)
from PySide6.QtWidgets import (QApplication, QMainWindow, QToolBar, QMenu, QMenuBar, QStatusBar, QSystemTrayIcon)
from PySide6.QtGui import (QAction, QIcon)
from PySide6 import QtCore # Für QTimer (Loop)
#from PyQt6.QtWidgets import QAction
# GUI Import
from gui.ui_Hauptfenster import Ui_Hauptfenster # Hauptfenster ist eine Python Datei - Die "Klasse" darin wird geladen (sprich das User Interface, die Benutzeroberfläche)
from gui.ui_Einstellungen import Ui_Einstellungen # Das UserInterface kann mit dem PySide6-Designer sauber modeliert werden
from gui.ui_Einstellungen_Server import Ui_Einstellungen_Server # GUI für Servereinstellungen
# Globale VARIABLEN
SERVER = { 'Name' : 'Nachtwache 1',
'IP' : '176.57.174.233',
'Port' : '8102',
'Status' : 'Unbekannt'
}
SERVER['Adresse'] = SERVER['IP'] + ":" + SERVER['Port']
#serveradresse="0.0.0.0:0000"
temp = 1
app = QApplication()
##### H A U P T F E N S T E R ##########################################
class Hauptfenster(QMainWindow, Ui_Hauptfenster, QSystemTrayIcon, QIcon):
def __init__(self):
super().__init__()
global testvariable, SERVER
self.setupUi(self)
self.lb_servername.setText("Nachtwache 1")
#self.lb_serveradresse.setText("176.57.169.88:8082")
self.lb_serveradresse.setText(SERVER['Adresse'])
self.v_tag.setText("100")
self.v_uhrzeit
self.v_rebootzeit
self.v_spieler
self.v_freie_slots
self.v_eventzeit.setText("00:30 Uhr")
self.v_eventzeit.setStyleSheet("color:red")
#menuTest = self.menubar.addMenu("Test")
self.actionEinstellungen.triggered.connect(self.einstellungen)
self.actionInformationen.triggered.connect(self.informationen)
self.actionBeenden.triggered.connect(self.close)
# Test
#self.menuEinstellungen.addAction(self.einstellungen_oeffnen)
self.v_freie_slots = temp + 1
#self.schleife()
def schleife(self):
self.timer = QtCore.QTimer()
self.timer.setSingleShot(False)
#self.timer.timeout.connect(self.do_stuff_timer)
self.timer.start(5000)
print("5 Sekunden")
def statusbar(self):
statusBar.showMessage(tr("Server ONLINE"))
def einstellungen_server(self):
einstellungen_server.show()
print("Servereinstellungen wird eingeblendet...")
def einstellungen(self):
einstellungen.show()
print("Einstellungensfenster wird eingeblendet")
def informationen(self):
print("Informationsfenster wird angezeigt")
##### H A U P T F E N S T E R - ENDE #####################################
##### E I N S T E L L U N G E N - S E R V E R #############################
class Einstellungen_Server(QMainWindow, Ui_Einstellungen_Server):
def __init__(self):
# Einstellungsfenster wird definiert
super().__init__()
self.setupUi(self)
#self.bt_uebernehmen.clicked.connect(self.uebernehmen)
self.bt_uebernehmen.clicked.connect(self.uebernehmen)
def uebernehmen(self):
# Button Übernehmen wird gedrückt !
print("Servereinstellung werden übernommen...")
# Eingebefelder werden übernommen
hauptfenster.lb_servername.setText(self.in_servername.text())
hauptfenster.lb_serveradresse.setText(self.in_serveripport.text())
#hauptfenster.statusbar.setToolTip(einstellungen_server.in_servername.text())
# ENDE
self.close()
###########################################################################
##### E I N S T E L L U N G E N ##########################################
class Einstellungen(QMainWindow, Ui_Einstellungen):
def __init__(self):
# Einstellungsfenster wird definiert
super().__init__()
self.setupUi(self)
#self.bt_uebernehmen.clicked.connect(self.uebernehmen)
self.bt_uebernehmen.clicked.connect(self.uebernehmen)
def uebernehmen(self):
# Button Übernehmen wird gedrückt !
print("Einstellung werden übernommen")
# Eingebefelder werden übernommen
#hauptfenster.lb_serveradresse.setText(self.in_serveripport.text())
# ENDE
self.close()
###########################################################################
###### TEST SCHLEIFE ###########
def Get_Server(Serveradresse, Return):
print(Serveradresse)
url = "http://" + Serveradresse + "/api/getstats"
if Return == "Status":
print("Serverstatus wird abgerufen... ")
try:
urllib.request.urlopen(urllib.request.Request(url))
except urllib.error.HTTPError as error:
# Return code error (e.g. 404, 501, ...)
status = "Offline"
print("FEHLER - HTTPError: " + error.code + "\n")
return status
except urllib.error.URLError as error:
# Not an HTTP-specific error (e.g. connection refused)
status = "Offline"
print("\nFEHLER (URLError)\tGrund: " + str(error.reason) + "\nFEHLER\t"+url+" Offline.\n")
return status
else:
# 200
status = "Online"
return status
"""
try :
code = requests.get(url).status_code
except requests.exceptions.RequestException:
code = 0
print(url + " ist OFFLINE")
print("Status-Code: " + str(code))
if code == 200:
print("Server ist ONLINE !")
return "ONLINE"
elif code == 0:
print("Server ist OFFLINE !")
return "OFFLINE"
else:
print("Serverstatus: Unbekannt")
return "UNBEKANNT"
"""
elif Return in ["Tag","Zeit","Spieler","Feinde","Tiere"]:
inhalt = urllib.request.urlopen(url,timeout=1)
daten = str(inhalt.read())
print("Daten: " + daten)
if Return == "Tag":
print("Tag")
#match = re.match("(?<=time:{).+?(?=})",daten)
regex = r"gametime.\:{(.*)},"
# gametime.:{\"days\":(.*),\"hours.*},
suche = re.search(r"days\":(.*),\"hours\".*},",daten)
tage = suche.group(1)
print("Tage:" + tage)
return tage
elif Return == "Zeit":
suche = re.search(r"hours\":(.*),\"minutes\":(.*)},",daten)
zeit = suche.group(1) + ":" + suche.group(2)
print("Zeit: " + zeit)
return zeit
elif Return == "Spieler":
suche = re.search(r"players\":(.*),\"hostiles.*",daten)
spieler = suche.group(1)
print("Spieler:" + spieler)
return spieler
elif Return == "Feinde":
suche = re.search(r"hostiles\":(.*),\"animals.*",daten)
feinde = suche.group(1)
print("Feinde:" + feinde)
return feinde
elif Return == "Tiere":
suche = re.search(r"animals\":(.*)}'",daten)
tiere = suche.group(1)
print("Tiere:" + tiere)
return tiere
elif Return == "Namen":
print(Return)
else:
print("Abfrage falsch ! Return: " + Return)
###
# http://176.57.174.233:8102/api/getstats
# Prüfe ob Hauptfenster geschlossen wurde
##############################################
# hauptfenster.quit()
# Hauptfenster.destroy()
# print("Warte 10 Sekunden bis erneut abgefragt wird...")
# sleep(10)
# hauptfenster.after(1000,update)
# # .. collect ur things
hauptfenster = Hauptfenster()
# Dark Mode - Benötigt pip install qtmodern
#qtmodern.styles.dark(app)
#hauptfenster = qtmodern.windows.ModernWindow(Hauptfenster())
# Trayicon #################################################################
class Trayicon(QSystemTrayIcon):
icon = QIcon('Grafiken\Serverinfo-7Dtd.ico')
tray = QSystemTrayIcon(icon, hauptfenster)
#tray.setVisible(True)
tray.setToolTip("Ich bin ein Tooltipp")
# Traymenü
traymenu = QMenu()
# Tray - Zeige Hauptfenster
# Tray - Einstellungen Server
traym_Einstellungen_Server = traymenu.addAction("Einstellungen Server")
traym_Einstellungen_Server.triggered.connect(hauptfenster.einstellungen_server)
# Tray - Einstellungen
traym_Einstellungen = traymenu.addAction("Einstellungen")
traym_Einstellungen.triggered.connect(hauptfenster.einstellungen)
traymenu.addAction("") # Leerzeile
# Tray - Exit
traym_exit = traymenu.addAction("Exit")
traym_exit.triggered.connect(app.quit)
# Tray - ContextMenu
tray.setContextMenu(traymenu) # Fügt Menu dem Trayicon hinzu
tray.showMessage("7Days to die", "Popupnachricht") # Wenn in Hauptcode ausgeführt Tray.show() ploppt es auf
# TrayIcon anzeigen
tray.show()
# Tayicon - ENDE
##############################################################################
Tray = Trayicon()
Tray.show()
#Tray.setToolTip("Tooltipp")
#Tray.showMessage("Supermesage", "Massage") #
einstellungen = Einstellungen()
einstellungen_server = Einstellungen_Server()
#hole_Daten("176.57.169.88:8082")
SERVER['Status'] = Get_Server(SERVER["Adresse"], "Status")
print("SERVER['Status']: " + SERVER['Status'])
if SERVER['Status'] == "Offline":
print("Server ist Offline")
hauptfenster.lb_servername.setStyleSheet("color:red")
else:
hauptfenster.lb_servername.setStyleSheet("color:green")
SERVER['Tag'] = Get_Server(SERVER["Adresse"], "Tag")
SERVER['Zeit'] = Get_Server(SERVER["Adresse"], "Zeit")
SERVER['Spieler'] = Get_Server(SERVER["Adresse"], "Spieler")
hauptfenster.v_tag.setText(SERVER['Tag'])
hauptfenster.v_uhrzeit.setText(SERVER['Zeit'])
hauptfenster.v_spieler.setText(SERVER['Spieler'])
hauptfenster.show() # Standardmäßig werden Fenster versteckt
app.exec() # Startet die Ereigniskette/schleife
#hauptfenster.schleife.timer.stop()
#VARIABLEN
#DEFINITIONEN
STD = { 'Schriftart' : 'Calibri',
'Schriftfarbe' : '#FFFFFF',
'Hintergrundfarbe' : '#404452'
}
# Ende
Aktuell funktioniert das Programm schon sehr gut, ich habe allerdings zwei Probleme.
1. Der Code sollte sauberer aussehen
Vom Aufbau her hätte ich Gerne Hauptfenster, Funktionen, App starten
Aktuell sieht das so aus:
- Import
- app = QApplication()
- Klasse Hauptfenster
- Klasse Einstellungen_Server (Fenster Servereinstellungen)
- Klasse Einstellungen (Fenster Einstellungen)
- Funktion Get_Server (Ruft Informationen vom Server ab)
- hauptfenster = Hauptfenster()
- Klasse Trayicon
- Trayicon.show()
- Serverabfrage (hier fehlt mir noch ne saubere SChleife)
- hauptfenster.show()
- app.exec()
Das sollte aber eher so aussehen:
- Import
- Klasse Hauptfenster
- Klasse Einstellungen_Server (Fenster Servereinstellungen)
- Klasse Einstellungen (Fenster Einstellungen)
- Klasse Trayicon
- Funktion Get_Server (Ruft Informationen vom Server ab)
- Serverabfrage (hier fehlt mir noch ne saubere SChleife)
- hauptfenster = Hauptfenster()
- hauptfenster.show()
- Trayicon.show()
- Starte Schleife
- app.exec()
Also es sollten erst sauber alle Klassen und Funktionen definiert werden und dann alles geladen werden.
Aber irgendwie krieg ich das nicht hin.
2. Ich bekomme den Code für das Trayicon nicht separiert (als Klasse der Funktion).
- Ich würde das Trayicon gerne in das Hauptfenster bringen (und später dann in eine eigene Datei) allerdings meckert Python dann das er das Trayicon erst nach dem Hauptfenster laden kann.
Ich denke mal wenn man Problem 1 in den Griff bekommt ist Problem 2 auch mit behoben... ...aber wo fange ich an - möchte ungern weiter Programmieren so lange das so "unsauber" ist.
Ich hoffe Ihr versteht was ich meine...
