ich beschäftige mich seit einiger Zeit mit Python und wollte, hauptsächlich zu Übungszwecken, ein kleines Programm schreiben bei dem die GUI und die Progammlogik in verschiedenen Klassen liegen.
Das Programm sollte eigentlich via openpyxl Dateien kopieren, formatieren etc. und zwischen den einzelnen Schritten einen Status in eine Textbox schreiben.
Das alles funktioniert auch soweit, wie ich mir das vorgestellt habe, abgesehen davon das die GUI einfriert, und alle Einträge in die Textbox erst nach Ende der Funktion erscheinen/geschrieben werden.
Ich habe versuch das Problem mit threading zu lösen aber bisher keinen Erfolg.
Ich hab das Programm mal heruntergebrochen auf das "minimum" um es hier zu posten und würde mich freuen wenn mir jmd helfen oder mich in die richtige Richtung schubsen kann.
Ich habe schon einiges suchen/lesen und ausprobieren hinter mir und verstehe einfach nicht wo der Fehler liegt.
Oder habe ich evtl. einen prinzipiellen Fehler beim Aufbau mit den 2 Klassen?
Vielen dank schonmal im vorraus!
Code: Alles auswählen
#!/usr/bin/env python3.9
import tkinter as tk
from tkinter import ttk
from tkinter import filedialog as fd
from tkinter import messagebox
import os
import openpyxl
from openpyxl import load_workbook
import threading
class MainFrame():
def __init__(self, root, *args, **kwargs):
super().__init__()
self.root = root
self.root.rowconfigure(0, weight=1)
self.root.columnconfigure(0, weight=1)
self.lgc = Logic()
self.main_gui()
def main_gui(self):
frame1 = tk.Frame(
self.root,
bd=2,
relief='groove'
)
frame1.grid(
row=0, rowspan=1, column=0, columnspan=1,
padx=5, pady=5, sticky='NESW')
frame1.columnconfigure(0, weight=1)
frame1.rowconfigure(0, weight=0)
frame1.rowconfigure(1, weight=1)
bttn_choose_file = ttk.Button(
frame1,
text='Choose File',
width=15,
command=lambda: self.action()
)
bttn_choose_file.grid(
row=0, rowspan=1,
column=0, columnspan=1,
padx=10, pady=5,
sticky='w'
)
self.txt_output = tk.Text(
frame1, bg='white',
bd=0,
width=40,
height=10,
)
self.txt_output.grid(
row=1, rowspan=1,
column=0, columnspan=1,
padx=10, pady=5,
sticky='NESW'
)
def action(self):
file = fd.askopenfilename()
if len(file) == 0:
return
self.txt_output.insert('end', 'Start ... \n')
self.txt_output.insert('end', 'Load file first time... \n')
wb_1 = self.lgc.load_vorlage(file)
self.txt_output.insert('end', 'Load file second time... \n')
wb_2 = self.lgc.load_vorlage_2(file)
self.txt_output.insert('end', 'Done \n')
messagebox.showinfo(
title='Done',
message=' Job done'
)
class Logic():
def load_vorlage(self, path):
x = load_workbook(path)
return x
def load_vorlage_2(self, data):
x = load_workbook(data, data_only=True, read_only=False)
return x
def main():
root = tk.Tk()
MainFrame(root)
root.mainloop()
if __name__ == '__main__':
main()