Hallo,
ich hab nun doch noch weiter gemacht, und die Klasse angepasst. Ich habe mir Python komplett selbst beigebracht mit Online Tutorials, daher das "Unwissen" bei vielen Dingen. Ich suche mir einfach oft Beispiele und versuche das dann nachzubauen.
Nun sieht es so aus (Ausschnitte):
Gui File:
Code: Alles auswählen
import tkinter
import requests
from tkinter import *
from tkinter import messagebox as tkMessageBox
from IBroute import IBRouteCalc
from tkinter import filedialog as fd
class mainwindow(Tk):
def __init__(self, title, geometry):
super().__init__()
self.UpdateRate = 1000
self.title(title)
self.geometry(geometry)
self.UpdateRate = 1000
self.IBrunSession = IBRouteCalc()
self.counter = 0
self.statusvar = StringVar()
self.statusvar.set("Bereit")
self.update_bar()
.... Buttons, Textefelder, Labels, Menu etc (funktionert auch wie gewünscht)
def update_bar(self):
if self.IBrunSession.IBProgCount > 0:
self.statusvar.set("IB Progress: " + str(self.IBrunSession.IBProgCount))
self.after(1000, func=lambda: self.update_bar()) # wenn ich hier kein lambda verwende bricht dasScript mit dem Fehler
exzessive Wiedeholung ab
def runcalcbutton(self):
Frame.clipboard_clear(self)
ReturnArr = IBRouteCalc.runthis(self.IBrunSession) # <---- exzessiver Prozess aus einer Klasse in einem anderen Phyton Script
..... anderes Zeug
if __name__ == "__main__":
mainwindow = mainwindow("IBRouteGUI", "400x400")
mainwindow.mainloop()
IBRouteCalc in seperatem File (Klasse)
Code: Alles auswählen
import ... Zeug
class IBRouteCalc:
def __init__(self)
self.IBProgCount = 0
.... viele andere Variablen aus der Klasse
def runthis(self):
self.ErrorHandling()
self.loadconfig()
if self.SysName != "None" and self.SysPSI == "None":
self.Config.update({"KompColumn": 0})
self.Config.update({"KompCSV": self.Config["SysCSVSourceFile"]})
if self.IBFile != "None":
self.Config.update({"IBSourceFile": str.replace(self.IBFile, "/", "\\")})
print("Using manuallyT selected datasource: " + str(self.IBFile))
if self.SingleSystem == True:
self.debug.update({"SingleSystem": True})
self.DebugSingleSystem = {self.SysNo: [self.SysName, self.SysZip, 'dummy', 'dummy', 'dummy', self.SysCity, self.SysPSI]}
# self.DebugSingleSystem = {"PC3434XR03": ["Pristina", "89518", 'dummy', 'dummy', 'dummy', "Heidenheim", "XMM567"]}
self.Debugloop()
self.Load_IBList()
self.Debugloop()
self.Load_Kompetenz()
self.Load_SysFile()
self.Load_IBFile()
self.Load_TechFile()
self.Create_KompDic()
self.OutputSystemsFiles()
self.Prepare_Compdic()
self.ReadTechDrive()
self.IB_Tech_calc()
self.Output_override()
self.ReadTechDrive()
self.Output_result()
self.calc_statistic()
self.DebugLoop2()
self.SysPSI = "None"
self.SysCity = "None"
self.SysName = "None"
self.SingleSystem = False
self.SysNo = "None"
self.SysZip = "None"
return self.Results()
Beide Python Scripts funktionieren an sich gut.
Nur die Statusanzeige der Variable IBProgCount funktioniert nicht wie ich es gerne hätte.
Diese zeigt zu Anfang, wenn ich das Programm lade "Bereit" in der Statusbar an.
und wenn der Prozess IBRouteCalc.runthis(self.IBrunSession) ausführe ändert sich zur Laufzeit nichts, wenn der Prozess beendet ist, springt der Zähler in der Statusbar umgehend auf 1865.
Der Prozess kann bis zu 15-20 Minuten dauern, weil viele Daten über Internet Abfragen eingeholt werden.
Mein Wunsche wäre die Statusbar zur Laufzeit des IBRouteCalc Prozesses zu aktulaisieren.
Muss ich hier Funktionen wie Subprocess oder Threading in betracht ziehen. Es sieht mir so aus, als würde Python hier eine Stapelabarbeitung durchführen und die Aktualisierung erst nach Ende des Prozesses anzeigen.
Führe ich den Prozess IBRouteCalc in der eigenen Klasse als Main Window aus (if __name__ == "__main__":) dann erscheint die Ausgabe auf der Script-Befehlszeile und der Zähler wird laufend aktualisiert.
Danke und viele Grüße
Kitsab