GUI in mehrere Files aufteilen

Fragen zu Tkinter.
Antworten
Knecht_Ruprecht
User
Beiträge: 6
Registriert: Dienstag 9. März 2021, 17:40

Hi Leute,

ich arbeite gerade an einem Programm und der Code für die GUI wird langsam unübersichtlich, weshalb ich sie in mehrere Files aufteilen will. Um das Prinzip zuverstehen, habe ich probiert das ganze als Test in kleinem Maßstab auszuprobieren, was allerdings nicht funktioniert. Konkret habe ich vor ein Fenster mit mehreren Tabs zu erstellen. Dazu möchte ich die Frames in jeweils eigenen Files speichern.

Zunächst soll nur frame1 ausgegliedert werden:

Code: Alles auswählen

from tkinter import *
from tkinter import ttk

class make_frame(Frame):
    def __init__(self, master, width, height):
        super().__init__(master, width, height)
        
Die Main-Klasse sieht wie folgt aus:

Code: Alles auswählen

from tkinter import *
from tkinter import ttk
from graphs import *


# Create Window
root = Tk()
root.title('Test')
w, h =root.winfo_screenwidth(), root.winfo_screenheight()
root.geometry("%dx%d+0+0" % (w, h))

#Create Notebook
notebook = ttk.Notebook(root)
notebook.pack(pady=15)

#Create Frames
frame1 = make_frame(notebook, w, h)
frame1.pack()
frame2 = Frame(notebook, width=w, height=h, bg='blue')
frame2.pack()

notebook.add(frame1, text='Tracking')
notebook.add(frame2, text='Graphs')


root.mainloop()

Ich erhalte folende Fehlermeldung:
Traceback (most recent call last):
File "C:\Users\versp\STATISTICS\Tabs2\Main.py", line 17, in <module>
frame1 = make_frame(notebook, w, h)
File "C:\Users\versp\STATISTICS\Tabs2\graphs.py", line 13, in __init__
super().__init__(master, width, height)
TypeError: __init__() takes from 1 to 3 positional arguments but 4 were given


Ich verstehe nicht, warum angezeigt wird, dass ich 4 argumente angegeben habe, wo ich doch nur notebook, w und h für frame1 angegeben habe.

Hat jemand eine Idee wo der Fehler liegt?
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Vergleich doch mal den Aufruf von super().__init__ mit dem Aufruf von Frame in Deinem Hauptprogramm. Dann sollten Dir die Unterschiede auffallen.
Ansonsten wurden Dir sicher schon in einem anderen Thread gesagt, dass *-Importe böse™ sind.
Knecht_Ruprecht
User
Beiträge: 6
Registriert: Dienstag 9. März 2021, 17:40

Sirius3 hat geschrieben: Mittwoch 31. März 2021, 13:45 Vergleich doch mal den Aufruf von super().__init__ mit dem Aufruf von Frame in Deinem Hauptprogramm. Dann sollten Dir die Unterschiede auffallen.
Ansonsten wurden Dir sicher schon in einem anderen Thread gesagt, dass *-Importe böse™ sind.
Den *Import habe ich bearbeitet. Jedoch weiß ich nicht genau worauf du hinauswillst. Ich habe alles möglich versucht, das Ding gefühlt 100 mal umgeschrieben und es funktioniert nicht.

In der super().-Methode sind master, width und height verlangt, und ich gebe notebook als master an, w als width und height als Höhe. Dass bei Frame auch noch bg=blue steht habe ich gesehen, zu super.()-Methode hinzugefügt und es funktioniert ebenfalls nicht.
Knecht_Ruprecht
User
Beiträge: 6
Registriert: Dienstag 9. März 2021, 17:40

Kann mir jemand sagen, ob der Fehler bei "Main" oder bei der Klasse "make_frame" liegt?
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Wo der Fehler liegt, habe ich Dir doch geschrieben und die Stelle steht ja auch im Traceback:

Code: Alles auswählen

"C:\Users\versp\STATISTICS\Tabs2\graphs.py", line 13
`make_frame` ist für eine Klasse ein seltsamer Name, um nicht ›falsch‹ zu schreiben.

Die ganzen Tk-Widgets erwarten alle Argumente (außer master) als Keyword-Argumente.
Antworten