Formen in verschiedenen Python Scripts aufrufen

Fragen zu Tkinter.
Antworten
ChrisB
User
Beiträge: 12
Registriert: Sonntag 13. Februar 2022, 13:27

Hallo miteinander,

ich steige gerade in das Thema Python ein und bin nun vor einem Problem gestoßen, dass ich seit vielen Stunden versuche zu löse.
Ich möchte für mich ein kleines Tool bauen, welches verschiedene Formen beinhaltet. Ich habe mein Repo wie folgt geordnet:
  • docs (Folder)
  • gui (Folder)
  • researchtool (Folder)
  • tests (Folder)
Ich möchte klar meine GUI von dem Backend trennen. Springen wir also in den Ordner GUI:
  • assets (Folder with images)
  • gui_mainmenu.py
  • gui_summarization.py
  • gui_settings.py
In der GUI-Settings sind nur zwei Funktionen, die den relativen Path zu Assets ermittelt und eine, die die x und y Koordinaten zurückgibt, um eine Form zu zentrieren.
Mein Problem betrifft aber jedoch eher der gui_mainmenu.py und gui_summarization.
Ich möchte über die Form Mainmenu die Form Summarization aufrufen und wenn ich wieder die Form Summarization schließe die Form MainMenu aufgreifen.

Ich habe in der Dokumentation gelesen, dass dies über TopLevel und Klassen funktioniert und habe mich auch mithilfe dieses Tutorials versucht dies für meinen Fall zu lösen. Der einzige Unterschied ist, dass ich dies in Python Skripte trennen möchte. Dies ist für mich einfach wichtig, dass ich GUIs auch als Dateien trenne.

gui_mainmenu.py

Code: Alles auswählen

import tkinter
import gui_summarize
import gui_settings


# With help from this side: https://www.pythontutorial.net/tkinter/tkinter-toplevel/


class GUIMainMenu(tkinter.Toplevel):
    def __init__(self):
        super().__init__()

        self_width = 800
        self_height = 500
        
        # center_x, center_y = gui_settings.center_form(self, self_width, self_height)
        # self.geometry(f'{self_width}x{self_height}+{center_x}+{center_y}')
        self.geometry(f'{self_width}x{self_height}')
        self.title("Research Tool")
        self.configure(bg="#EEEEEE")

        # Background Canvas

        canvas = tkinter.Canvas(
            self,
            bg="#EEEEEE",
            height=500,
            width=800,
            bd=0,
            highlightthickness=0,
            relief="ridge"
        )
        
        canvas.place(x=0, y=0)
        canvas.create_rectangle(
            0.0,
            0.0,
            400.0,
            500.0,
            fill="#00ADB5",
            outline="")
        
        # Title, Description (Texts) and Images on Left Side
        
        canvas.create_text(
            50.0,
            56.0,
            anchor="nw",
            text="Research Tool",
            fill="#EEEEEE",
            font=("Roboto", 48 * -1)
        )
        
        image_checkbox = tkinter.PhotoImage(
            file=gui_settings.assets("checkbox.png"))
        
        image_cb1 = canvas.create_image(
            96.0,
            208.0,
            image=image_checkbox
        )
        
        image_cb2 = canvas.create_image(
            96.0,
            273.0,
            image=image_checkbox
        )
        
        image_cb3 = canvas.create_image(
            96.0,
            340.0,
            image=image_checkbox
        )
        
        image_cb4 = canvas.create_image(
            96.0,
            406.0,
            image=image_checkbox
        )
        
        canvas.create_text(
            125.0,
            194.0,
            anchor="nw",
            text="Summarize Text",
            fill="#FFFFFF",
            font=("Roboto", 24 * -1)
        )
        
        canvas.create_text(
            125.0,
            324.0,
            anchor="nw",
            text="Analyze Keywords",
            fill="#FFFFFF",
            font=("Roboto", 24 * -1)
        )
        
        canvas.create_text(
            125.0,
            257.0,
            anchor="nw",
            text="Identify Keywords",
            fill="#FFFFFF",
            font=("Roboto", 24 * -1)
        )
        
        canvas.create_text(
            125.0,
            390.0,
            anchor="nw",
            text="Further Research",
            fill="#FFFFFF",
            font=("Roboto", 24 * -1)
        )
        
        canvas.create_text(
            7.0,
            481.0,
            anchor="nw",
            text="©  (2022) Christoph Beckmann",
            fill="#FFFFFF",
            font=("Roboto", 12 * -1)
        )
        
        # Right Side: Subtitle and Buttons
        
        canvas.create_text(
            415.0,
            66.0,
            anchor="nw",
            text="What should be done?",
            fill="#222831",
            font=("Roboto", 36 * -1)
        )
        
        # Buttons
        
        btn_image_Summarize = tkinter.PhotoImage(
            file=gui_settings.assets("btn_Summarize.png"))
        
        btn_Summarize = tkinter.Button(
            image=btn_image_Summarize,
            borderwidth=0,
            highlightthickness=0,
            command=lambda: self.open_gui_summarize(),
            relief="flat"
        )
        btn_Summarize.place(
            x=500.0,
            y=197.0,
            width=200.0,
            height=58.0
        )
        
        btn_image_Analyze = tkinter.PhotoImage(
            file=gui_settings.assets("btn_Analyze.png"))
        
        btn_Analyze = tkinter.Button(
            image=btn_image_Analyze,
            borderwidth=0,
            highlightthickness=0,
            command=lambda: print("Analyze pressed"),
            relief="flat"
        )
        
        btn_Analyze.place(
            x=500.0,
            y=288.0,
            width=200.0,
            height=58.0
        )
        
        btn_image_Research = tkinter.PhotoImage(
            file=gui_settings.assets("btn_Research.png"))
        
        btn_Research = tkinter.Button(
            image=btn_image_Research,
            borderwidth=0,
            highlightthickness=0,
            command=lambda: print("Research pressed"),
            relief="flat"
        )
        btn_Research.place(
            x=500.0,
            y=379.0,
            width=200.0,
            height=58.0
        )

        self.resizable(False, False)

    def open_gui_summarize(self):
        gui_summarize = gui_summarize.GUISummarize(self)
        gui_summarize.grab_set()


if __name__ == "__main__":
    mainmenu = GUIMainMenu()
    mainmenu.mainloop()
gui_summarization.py

Code: Alles auswählen

import gui_settings
from tkinter import *
import tkinter.filedialog


def open_textfile(textbox: tkinter.Text):
    filetypes = (
        ('AlL files', '*.*')
    )
    file = tkinter.filedialog.askopenfilename(
        filetypes=[filetypes],
        defaultextension=".txt")
    fob = open(file, 'r')
    text = fob.read()
    textbox.delete(1.0, tk.END)
    textbox.insert(tk.INSERT, text)
    fob.close()


class GUISummarize(tkinter.Toplevel):
    def __init__(self, parent):
        super().__init__(parent)
    
        self_width = 1200
        self_height = 800
    
        # center_x, center_y = gui_settings.center_form(self, self_width, self_height)
        # self.geometry(f'{self_width}x{self_height}+{center_x}+{center_y}')
        self.geometry(f'{self_width}x{self_height}')
        self.title("Research Tool - Summarize")
        self.configure(bg="#EEEEEE")
    
        canvas = tkinter.Canvas(
            self,
            bg="#EEEEEE",
            height=800,
            width=1200,
            bd=0,
            highlightthickness=0,
            relief="ridge"
        )
    
        canvas.place(x=0, y=0)
        canvas.create_rectangle(
            600.0,
            0.0,
            1200.0,
            800.0,
            fill="#00ADB5",
            outline="")
        btn_image_summarize = tkinter.PhotoImage(
            file=gui_settings.assets("btn_summarize.png"))
        btn_summarize = tkinter.Button(
            image=btn_image_summarize,
            command=lambda: print("Summarize clicked"),
        )
        btn_summarize.place(
            x=200.0,
            y=716.0,
            width=200.0,
            height=58.0
        )

        btn_image_export = PhotoImage(
            file=gui_settings.assets("btn_export.png"))
        btn_export = Button(
            image=btn_image_export,
            borderwidth=0,
            highlightthickness=0,
            command=lambda: print("Export pressed"),
            relief="flat"
        )
        btn_export.place(
            x=800.0,
            y=716.0,
            width=200.0,
            height=58.0
        )

        btn_image_pathpicker = PhotoImage(
            file=gui_settings.assets("btn_pathpicker.png"))
        btn_pathpicker = Button(
            image=btn_image_pathpicker,
            borderwidth=0,
            highlightthickness=0,
            command=lambda: open_textfile(textbox_text),
            relief="flat"
        )
        btn_pathpicker.place(
            x=50.0,
            y=716.0,
            width=65.0,
            height=58.0
        )
    
        btn_image_back = tkinter.PhotoImage(
            file=gui_settings.assets("btn_back.png"))
        btn_back = Button(
            image=btn_image_back,
            command=lambda: self.closewindow()
        )
        btn_back.place(
            x=0.0,
            y=0.0,
            width=65.0,
            height=58.0
        )
    
        canvas.create_text(
            207.0,
            17.0,
            anchor="nw",
            text="Insert Text:",
            fill="#222831",
            font=("Roboto", 36 * -1)
        )
    
        textbox_text = tkinter.Text(
            bd=0,
            fg='#EEEEEE',
            bg="#00ADB5",
            highlightthickness=0
        )
        textbox_text.place(
            x=50.0,
            y=79.0,
            width=500.0,
            height=602.0
        )
    
        canvas.create_text(
            752.0,
            17.0,
            anchor="nw",
            text="Summarized Text:",
            fill="#EEEEEE",
            font=("Roboto", 36 * -1)
        )
    
        textbox_summarized = tkinter.Text(
            bd=0,
            fg='#222831',
            bg="#EEEEEE",
            highlightthickness=0
        )
        textbox_summarized.place(
            x=650.0,
            y=79.0,
            width=500.0,
            height=602.0
        )
    
        self.resizable(False, False)

    def closewindow(self):
        self.destroy()
Seit dem ich es in Klassen und Funktionen gepackt habe, funktioniert es nicht mehr. Die jeweiligen GUIs ohne Klassen und Funktionen wurden jedoch korrekt dargestellt. Er hat Probleme bei den PhotoImages, sowie auch sieht er nicht die Reference und Import von gui_summarize in der MainForm an.

Ich hoffe man kann hier weiterhelfen, dass ich über MainForm die Summarization Form aus einer anderen Python Datei aufrufen kann. Viele Tutorials, die ich mir angesehen habe, arbeiten mit der GUI aus einer Datei heraus und konnten mein Problem nicht wirklich lösen.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Als erstes müssen mal die *-Importe weg.

Code: Alles auswählen

# Falsch:
from tkinter import *

# Üblich:
import tkinter as tk
Entsprechend greifst du dann mit tk. auf den Namensraum des Moduls zu.


Was ist denn jetzt dein Problem?
Welche Fehlermeldungen erhälst du? Was erwartest du stattdessen?
ChrisB
User
Beiträge: 12
Registriert: Sonntag 13. Februar 2022, 13:27

Vielen Dank, das habe nun im folgenden geändert:
Die Probleme beschreibe ich darunter.

gui_mainmenu.py

Code: Alles auswählen

import tkinter as tk
import gui_summarize
import gui_settings


# With help from this side: https://www.pythontutorial.net/tkinter/tkinter-toplevel/

class GUIMainMenu(tk.Toplevel):
    def __init__(self):
        super().__init__()

        self_width = 800
        self_height = 500
        
        # center_x, center_y = gui_settings.center_form(self, self_width, self_height)
        # self.geometry(f'{self_width}x{self_height}+{center_x}+{center_y}')
        self.geometry(f'{self_width}x{self_height}')
        self.title("Research Tool")
        self.configure(bg="#EEEEEE")

        # Background Canvas

        canvas = tk.Canvas(
            self,
            bg="#EEEEEE",
            height=500,
            width=800,
            bd=0,
            highlightthickness=0,
            relief="ridge"
        )
        
        canvas.place(x=0, y=0)
        canvas.create_rectangle(
            0.0,
            0.0,
            400.0,
            500.0,
            fill="#00ADB5",
            outline="")
        
        # Title, Description (Texts) and Images on Left Side
        
        canvas.create_text(
            50.0,
            56.0,
            anchor="nw",
            text="Research Tool",
            fill="#EEEEEE",
            font=("Roboto", 48 * -1)
        )
        
        image_checkbox = tk.PhotoImage(
            file=gui_settings.assets("checkbox.png"))
        
        image_cb1 = canvas.create_image(
            96.0,
            208.0,
            image=image_checkbox
        )
        
        image_cb2 = canvas.create_image(
            96.0,
            273.0,
            image=image_checkbox
        )
        
        image_cb3 = canvas.create_image(
            96.0,
            340.0,
            image=image_checkbox
        )
        
        image_cb4 = canvas.create_image(
            96.0,
            406.0,
            image=image_checkbox
        )
        
        canvas.create_text(
            125.0,
            194.0,
            anchor="nw",
            text="Summarize Text",
            fill="#FFFFFF",
            font=("Roboto", 24 * -1)
        )
        
        canvas.create_text(
            125.0,
            324.0,
            anchor="nw",
            text="Analyze Keywords",
            fill="#FFFFFF",
            font=("Roboto", 24 * -1)
        )
        
        canvas.create_text(
            125.0,
            257.0,
            anchor="nw",
            text="Identify Keywords",
            fill="#FFFFFF",
            font=("Roboto", 24 * -1)
        )
        
        canvas.create_text(
            125.0,
            390.0,
            anchor="nw",
            text="Further Research",
            fill="#FFFFFF",
            font=("Roboto", 24 * -1)
        )
        
        canvas.create_text(
            7.0,
            481.0,
            anchor="nw",
            text="©  (2022) Christoph Beckmann",
            fill="#FFFFFF",
            font=("Roboto", 12 * -1)
        )
        
        # Right Side: Subtitle and Buttons
        
        canvas.create_text(
            415.0,
            66.0,
            anchor="nw",
            text="What should be done?",
            fill="#222831",
            font=("Roboto", 36 * -1)
        )
        
        # Buttons
        
        btn_image_Summarize = tk.PhotoImage(
            file=gui_settings.assets("btn_Summarize.png"))
        
        btn_Summarize = tk.Button(
            image=btn_image_Summarize,
            borderwidth=0,
            highlightthickness=0,
            command=lambda: self.open_gui_summarize(),
            relief="flat"
        )
        btn_Summarize.place(
            x=500.0,
            y=197.0,
            width=200.0,
            height=58.0
        )
        
        btn_image_Analyze = tk.PhotoImage(
            file=gui_settings.assets("btn_Analyze.png"))
        
        btn_Analyze = tk.Button(
            image=btn_image_Analyze,
            borderwidth=0,
            highlightthickness=0,
            command=lambda: print("Analyze pressed"),
            relief="flat"
        )
        
        btn_Analyze.place(
            x=500.0,
            y=288.0,
            width=200.0,
            height=58.0
        )
        
        btn_image_Research = tk.PhotoImage(
            file=gui_settings.assets("btn_Research.png"))
        
        btn_Research = tk.Button(
            image=btn_image_Research,
            borderwidth=0,
            highlightthickness=0,
            command=lambda: print("Research pressed"),
            relief="flat"
        )
        btn_Research.place(
            x=500.0,
            y=379.0,
            width=200.0,
            height=58.0
        )

        self.resizable(False, False)


   def open_gui_summarize(self):
        gui_summarize = gui_summarize.GUISummarize(self)
        gui_summarize.grab_set()


if __name__ == "__main__":
    mainmenu = GUIMainMenu()
    mainmenu.mainloop()
Problem 1:

Die Variablen image_cb1- 4 werden anscheinend nicht erkannt und es kommt zu keiner Darstellung. Mit folgender Fehlermeldung:

Code: Alles auswählen

  File "/Users/chris/Library/Mobile Documents/com~apple~CloudDocs/Programming/Python/ResearchTool/gui/gui_mainmenu.py", line 200, in <module>
    mainmenu = GUIMainMenu()
  File "/Users/chris/Library/Mobile Documents/com~apple~CloudDocs/Programming/Python/ResearchTool/gui/gui_mainmenu.py", line 54, in __init__
    image_checkbox = tk.PhotoImage(
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tkinter/__init__.py", line 4064, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tkinter/__init__.py", line 4009, in __init__
    self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't open "/Users/chris/Library/Mobile Documents/com~apple~CloudDocs/Programming/Python/ResearchTool/gui/test_assets/checkbox.png": no such file or directory
Ohne die Klasse und Funktionen wird jedoch die GUI ganz normal erstellt. Ich muss das hinzufügen im Falle ohne Gui:

Code: Alles auswählen

MainForm = Tk()
und

Code: Alles auswählen

MainForm.MainLoop()
Ich würde gerne, dass er genau diese GUI erstellt. Ich weise ja der Variable die TopLevel Klasse GUIMainMenu zu, wenn ich es richtig verstanden habe. Danach sollte die Form erstellt werden. Aber es passiert nichts und es kommt zur o.g. Fehlermeldung.

Problem 2:
Problem 2 betrifft meine GUI Trennung, von gui_mainmenu (siehe oben) und gui_summarize (siehe 1. Post). Ich möchte jetzt über den Button die Klasse in der Python Datei aufrufen. Dafür habe ich ja die Funktion open_gui_summarize, die ich über den Button Summarize auslöse.
Leider wird mir folgendes Ausgegeben

Code: Alles auswählen

Unused import statement 'import gui_summarize'
und

Code: Alles auswählen

Unresolved reference 'gui_summarize'
in der Zeile, wo ich die Klasse der Variable gui_summarize zuordne.

Ich habe gedacht, wenn ich die Python Datei gui_summarize importiere, kann ich auch auf die Klasse zugreifen, die dort hinterliegt und entsprechend die GUI, die dort hinterlegt ist, auch erstellen lassen.


Wenn es hilft schicke ich auch gerne mein Github Repo Link.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

zu Problem 1: die Datei /Users/chris/Library/Mobile Documents/com~apple~CloudDocs/Programming/Python/ResearchTool/gui/test_assets/checkbox.png existiert offensichtlich nicht. Du mußt halt die Datei da hinlegen.
Außerdem mußt Du eine Referenz auf `image_checkbox` an `self` binden, weil sonst das Bild von der Speicherverwaltung wieder abgeräumt wird.

zu Problem 2: in `open_gui_summarize` definierst Du eine lokale Variable `gui_summarize`, die kannst Du natürlich nicht verwenden, bevor Du ihr einen Wert zugewiesen hast. Das Modul `gui_summarize` auf oberster Ebene wird durch diese lokale Variable verdeckt.
Wenn Du mehrere Module hast, dann solltest Du diese in ein eigenes Paket auslagern, um den Paket-Namensraum nicht mit zu vielen eigenen Modulen zuzumüllen.
ChrisB
User
Beiträge: 12
Registriert: Sonntag 13. Februar 2022, 13:27

Vielen Dank, du konntest mir schon sehr weiterhelfen! Ich habe Problem 1 und 2 mit deinen Tipps lösen können:
Hier die aktuelle Überarbeitung:
gui_mainmenu.py

Code: Alles auswählen

import tkinter as tk
import gui_summarize
import gui_settings


class GUIMainMenu(tk.Toplevel):
    def __init__(self):
        super().__init__()

        self_width = 800
        self_height = 500
        
        center_x, center_y = gui_settings.center_form(self, self_width, self_height)
        self.geometry(f'{self_width}x{self_height}+{center_x}+{center_y}')
        self.title("Research Tool")
        self.configure(bg="#EEEEEE")

        # Background Canvas

        canvas = tk.Canvas(
            self,
            bg="#EEEEEE",
            height=500,
            width=800,
            bd=0,
            highlightthickness=0,
            relief="ridge"
        )
        
        canvas.place(x=0, y=0)
        canvas.create_rectangle(
            0.0,
            0.0,
            400.0,
            500.0,
            fill="#00ADB5",
            outline="")
        
        # Title, Description (Texts) and Images on Left Side
        
        canvas.create_text(
            50.0,
            56.0,
            anchor="nw",
            text="Research Tool",
            fill="#EEEEEE",
            font=("Roboto", 48 * -1)
        )
        
        self.image_checkbox = tk.PhotoImage(
            file=gui_settings.assets("checkbox.png"))

        canvas.create_image(
            96.0,
            208.0,
            image=self.image_checkbox
        )
        
        canvas.create_image(
            96.0,
            273.0,
            image=self.image_checkbox
        )
        
        canvas.create_image(
            96.0,
            340.0,
            image=self.image_checkbox
        )
        
        canvas.create_image(
            96.0,
            406.0,
            image=self.image_checkbox
        )
        
        canvas.create_text(
            125.0,
            194.0,
            anchor="nw",
            text="Summarize Text",
            fill="#FFFFFF",
            font=("Roboto", 24 * -1)
        )
        
        canvas.create_text(
            125.0,
            324.0,
            anchor="nw",
            text="Analyze Keywords",
            fill="#FFFFFF",
            font=("Roboto", 24 * -1)
        )
        
        canvas.create_text(
            125.0,
            257.0,
            anchor="nw",
            text="Identify Keywords",
            fill="#FFFFFF",
            font=("Roboto", 24 * -1)
        )
        
        canvas.create_text(
            125.0,
            390.0,
            anchor="nw",
            text="Further Research",
            fill="#FFFFFF",
            font=("Roboto", 24 * -1)
        )
        
        canvas.create_text(
            7.0,
            481.0,
            anchor="nw",
            text="©  (2022) Christoph Beckmann",
            fill="#FFFFFF",
            font=("Roboto", 12 * -1)
        )
        
        # Right Side: Subtitle and Buttons
        
        canvas.create_text(
            415.0,
            66.0,
            anchor="nw",
            text="What should be done?",
            fill="#222831",
            font=("Roboto", 36 * -1)
        )
        
        # Buttons
        
        self.btn_image_Summarize = tk.PhotoImage(
            file=gui_settings.assets("btn_Summarize.png"))
        
        btn_summarize = tk.Button(
            self,
            image=self.btn_image_Summarize,
            borderwidth=0,
            highlightthickness=0,
            command=lambda: self.open_gui_summarize(),
            relief="flat"
        )
        btn_summarize.place(
            x=500.0,
            y=197.0,
            width=200.0,
            height=58.0
        )
        
        self.btn_image_Analyze = tk.PhotoImage(
            file=gui_settings.assets("btn_Analyze.png"))
        
        btn_analyze = tk.Button(
            self,
            image=self.btn_image_Analyze,
            borderwidth=0,
            highlightthickness=0,
            command=lambda: print("Analyze pressed"),
            relief="flat"
        )
        
        btn_analyze.place(
            x=500.0,
            y=288.0,
            width=200.0,
            height=58.0
        )
        
        self.btn_image_Research = tk.PhotoImage(
            file=gui_settings.assets("btn_Research.png"))

        btn_research = tk.Button(
            self,
            image=self.btn_image_Research,
            borderwidth=0,
            highlightthickness=0,
            command=lambda: print("Research pressed"),
            relief="flat"
        )
        btn_research.place(
            x=500.0,
            y=379.0,
            width=200.0,
            height=58.0
        )

        self.resizable(False, False)

    def open_gui_summarize(self):
        var_gui_summarize = gui_summarize.GUISummarize(self)
        var_gui_summarize.grab_set()


if __name__ == "__main__":
    mainmenu = GUIMainMenu()
    mainmenu.mainloop()

gui_summarize.py

Code: Alles auswählen

import gui_settings
import tkinter as tk
from tkinter import filedialog as fd


class GUISummarize(tk.Toplevel):
    def __init__(self, parent):
        super().__init__(parent)

        self_width = 1200
        self_height = 800

        center_x, center_y = gui_settings.center_form(self, self_width, self_height)
        self.geometry(f'{self_width}x{self_height}+{center_x}+{center_y}')
        self.title("Research Tool - Summarize")
        self.configure(bg="#EEEEEE")

        canvas = tk.Canvas(
            self,
            bg="#EEEEEE",
            height=800,
            width=1200,
            bd=0,
            highlightthickness=0,
            relief="ridge"
        )

        canvas.place(x=0, y=0)
        canvas.create_rectangle(
            600.0,
            0.0,
            1200.0,
            800.0,
            fill="#00ADB5",
            outline="")
        self.btn_image_summarize = tk.PhotoImage(
            file=gui_settings.assets("btn_summarize.png"))
        btn_summarize = tk.Button(
            self,
            image=self.btn_image_summarize,
            command=lambda: print("Summarize clicked"),
        )
        btn_summarize.place(
            x=200.0,
            y=716.0,
            width=200.0,
            height=58.0
        )

        self.btn_image_export = tk.PhotoImage(
            file=gui_settings.assets("btn_export.png"))
        btn_export = tk.Button(
            self,
            image=self.btn_image_export,
            borderwidth=0,
            highlightthickness=0,
            command=lambda: print("Export pressed"),
            relief="flat"
        )
        btn_export.place(
            x=800.0,
            y=716.0,
            width=200.0,
            height=58.0
        )

        self.btn_image_back = tk.PhotoImage(
            file=gui_settings.assets("btn_back.png"))
        btn_back = tk.Button(
            self,
            image=self.btn_image_back,
            command=lambda: self.close_window()
        )
        btn_back.place(
            x=0.0,
            y=0.0,
            width=65.0,
            height=58.0
        )

        canvas.create_text(
            207.0,
            17.0,
            anchor="nw",
            text="Insert Text:",
            fill="#222831",
            font=("Roboto", 36 * -1)
        )

        textbox_text = tk.Text(
            self,
            bd=0,
            fg='#EEEEEE',
            bg="#00ADB5",
            highlightthickness=0
        )
        textbox_text.place(
            x=50.0,
            y=79.0,
            width=500.0,
            height=602.0
        )

        canvas.create_text(
            752.0,
            17.0,
            anchor="nw",
            text="Summarized Text:",
            fill="#EEEEEE",
            font=("Roboto", 36 * -1)
        )

        textbox_summarized = tk.Text(
            self,
            bd=0,
            fg='#222831',
            bg="#EEEEEE",
            highlightthickness=0
        )
        textbox_summarized.place(
            x=650.0,
            y=79.0,
            width=500.0,
            height=602.0
        )

        self.btn_image_pathpicker = tk.PhotoImage(
            file=gui_settings.assets("btn_pathpicker.png"))
        btn_pathpicker = tk.Button(
            self,
            image=self.btn_image_pathpicker,
            borderwidth=0,
            highlightthickness=0,
            command=lambda: self.open_textfile(textbox_text),
            relief="flat"
        )
        btn_pathpicker.place(
            x=50.0,
            y=716.0,
            width=65.0,
            height=58.0
        )
    
        self.resizable(False, False)

    def open_textfile(self, textbox: tk.Text):
        filetypes = (
            ('AlL files', '*.*')
        )
        file = fd.askopenfilename(
            filetypes=[filetypes],
            defaultextension=".txt")
        fob = open(file, 'r')
        text = fob.read()
        textbox.delete(1.0, tk.END)
        textbox.insert(tk.INSERT, text)
        fob.close()

    def close_window(self):
        self.destroy()

Es entstand aber dadurch ein neues Problem:

Wenn ich nun das MainMenu Modul ausführe wird zwar die MainMenu Form korrekt dargestellt, es erscheint aber darüber hinaus eine weitere Form "tk". Diese muss auch das TopLevel Window darstellen, denn wenn ich die schließe wird der Prozess beendet. Wenn ich jedoch meine MainMenu Form schließe, bleibt die Form "tk" erhalten und der Prozess bzw. Debug ebenso.

Problem 2:
Ich habe eine weiteres Modul gui_setting, welches ich wie oben beschrieben habe nutze um meine Funktion center_form und den relativen Pfad zu den assets zu hinterlegen:

Code: Alles auswählen

from pathlib import Path
import tkinter as tk

OUTPUT_PATH = Path(__file__).parent
ASSETS_PATH = OUTPUT_PATH / Path("assets")


def assets(path: str) -> Path:
    return ASSETS_PATH / Path(path)


# Center given Tkinter Form on the Screen
def center_form(form: tk, form_width: int, form_height: int):
    screen_width = form.winfo_screenwidth()
    screen_height = form.winfo_screenheight()

    x_coordinate = (screen_width / 2) - (form_width / 2)
    y_coordinate = (screen_height / 2) - (form_height / 2)

    return int(x_coordinate), int(y_coordinate)
Mein Hauptmenu wird auch wie gewünscht zentriert dargestellt. Jedoch die Summarize Form nicht. Das verwundert mich sehr, da ich keinerlei Änderungen habe. Ich habe auch die x und y Koordinate und screen_widt und height überprüft. Aber anscheinend wird dennoch nicht die Form zentriert.

Hast du da wieder Tipps?

EDIT:

Ich habe noch eine weitere Frage: Ist es von der Logik korrekt, auch die Funktion zum öffnen einer Textfile auch in der Klasse der GUI zu hinterlegen? Funktionieren tut beides (also innerhalb und außerhalb der Klasse) und es interessiert mich natürlich, was nun "korrekter" ist.
ChrisB
User
Beiträge: 12
Registriert: Sonntag 13. Februar 2022, 13:27

Problem 2 konnte ich lösen, indem ich die Zeile in der Funktion center_form ergänze:

Code: Alles auswählen

    form.update_idletasks()
Das Problem 1 konnte ich jetzt auch lösen:
Ich habe in dem Modul gui_mainmenu.py der Klasse auch den Parameter

Code: Alles auswählen

tk.TopLevel
gegeben statt

Code: Alles auswählen

tk.TK
.
Antworten