Tkinter GUI als Modul auslagern, Problem Button-Funktionalität

Fragen zu Tkinter.
Antworten
blutec
User
Beiträge: 16
Registriert: Montag 21. September 2020, 17:05

Mittwoch 5. Mai 2021, 11:58

Hallo zusammen,

ich hab ein größeres Programm, möchte aber nun das Hauptcode im File FW.py von der GUI trennen.
Nun sind die Touchscreen-Buttons aber an Funktionen aus dem Hauptfile (FW.py) gebunden, die nun nicht mehr in dem Modul gefunden werden können, wie hier z.B. self.repeat.
GUI:

Code: Alles auswählen

 self.button_repeat = tk.Button(self.root, command=self.repeat)
Aus diesem Grund habe ich ausprobiert, der Klasse GUI im ausgelagertem Modul eine Klasse des Hauptprogramms zu übergeben, was aber auch nicht funktioniert.

Code: Alles auswählen

class Gui(Controls):
	def __init__(self, class_Control):
Hier meckert der Complier, dass es "Controls" nicht kennt

Wie schaffe ich es, dass die ausgelagerten Buttons der GUI Funktionen aus dem Hauptprogramm aufrufen?
Hier der gesamte Code:

Code: Alles auswählen

""" GUI for touch screen display"""

import tkinter as tk
from PIL import ImageTk

class Gui():

    my_color = {'green': '#00A587', 'grey': '#425583', 'limeblue': '#8DC8E8', 'orange': '#FF6A39', 'yellow': '#D0DF00'}  # Dictionary of color theme

    def __init__(self, class_Control):

        """initialize parameters"""
        self.class_Control = class_Control

        self.root = tk.Tk()
        self.root.geometry("800x480")
        self.root.attributes('-fullscreen', True)
        self.root.bind('<Return>', self.get_input_and_check)
        self.root.bind('<F12>', self.quit)

        self.seriallabel_text = tk.StringVar()  # Binding variable to display serial number
        self.statuslabel_text = tk.StringVar()  # Binding variable to display status message

        self.label_serialnumber = tk.Label(self.root, textvariable=self.seriallabel_text)
        self.label_serialnumber.config(font=('Arial, 24'), justify='center', background='white',
                                       fg=self.my_color['grey'], borderwidth=1, relief="solid")
        self.label_serialnumber.place(x=231, y=0, width=569, height=230)

        self.label_status = tk.Label(self.root, textvariable=self.statuslabel_text)
        self.label_status.config(font=('Arial', 24), justify='center', background="white", fg=self.my_color['grey'],
                                 borderwidth=1, relief="solid")
        self.label_status.place(x=231.00, y=230, width=569, height=230)

        # Create buttons and add button pictures
        self.bild = ImageTk.PhotoImage(file="images/repeat_button.bmp")
        self.button_repeat = tk.Button(self.root, command=self.repeat)
        self.button_repeat.configure(image=self.bild, borderwidth=1)
        self.button_repeat.place(x=0.0, y=0, width=230, height=230)

        self.button_mode_switch = tk.Button(self.root, command=self.modeswitch)
        self.button_mode_switch.configure(text="Manual\nmode", font=('Arial', 20), borderwidth=1,
                                          bg=self.my_color['limeblue'], activebackground=self.my_color['limeblue'])
        self.button_mode_switch.place(x=0.0, y=345, width=230, height=115)

        self.root.title("Display")
        self.seriallabel_text.set("Please connect")
        self.message = "blabla"
        self.statuslabel_text.set(self.message)
Sirius3
User
Beiträge: 14584
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 5. Mai 2021, 12:34

Ein button gehört doch zur GUI. An der Stelle kannst du dein Programm nicht auftrennen.
Überlege Dir welche Teile des Programms unabhängig von der GUI sind.
blutec
User
Beiträge: 16
Registriert: Montag 21. September 2020, 17:05

Mittwoch 5. Mai 2021, 12:54

Hallo Sirius,
da hast du mich falsch verstanden. Die Buttons sollen natürlich in der GUI bleiben und zusammen mit den Labels etc. ausgelagert werden.
Der von mir gepostete Code (my_gui.py) ist bereits die ausgelagerte GUI und soll auch so zusammen bleiben.

Dann gibt es aber Funktionen, die im Hauptprogramm (nennen wir es control.py) stehen und beim Druck auf den Button aufgerufen werden.
In der ausgelagerten GUI werden die Buttons mit den entsprechenden Funktionen "verbunden". Die Namen der Funktionen im Hauptprogramm sind in diesem GUI-Modul aber nun nicht mehr bekannt.
Ich habe versucht, es wieder zusammen zu bringen, aber bisher ist es mir nicht gelungen. Wie kann ich eine Schnittstelle GUI<-> Hauptprogramm realisieren, sodass beim Druck auf einen Button eine Funktion in einem anderen Modul aufgerufen wird?
class Gui(Namedeshauptprogramms) oder class Gui(NameeineranderenKlasse) hat nicht funktioniert, aber ich denke so ähnlich muss man das machen.
Sirius3
User
Beiträge: 14584
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 5. Mai 2021, 13:23

Weder ist das Hauptprogramm eine GUI noch umgekehrt. Vererbung ist hier total falsch.
Was ist denn bei dir das Hauptprogramm. Normalerweise bezeichnet man die GUI als Hauptprogramm und der Rest sind Funktionen die vom Hauptprogramm (GUI) aufgerufen werden.
blutec
User
Beiträge: 16
Registriert: Montag 21. September 2020, 17:05

Mittwoch 5. Mai 2021, 13:35

Normalerweise bezeichnet man die GUI als Hauptprogramm und der Rest sind Funktionen die vom Hauptprogramm (GUI) aufgerufen werden.
OK, dass ist schon mal eine Aussage, die ich verstehe und auch erst mal ausprobieren kann.
Danke für den Denkanstoß.
Antworten