Objektorientierte Programmierung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Morgen,

Ich hatte mal vor ~1 Woche ein Thread zu einem anderen Thema eröffnet, in dem mir geraten wurde, das Ganze in OOP zu schreiben.
In meinem Buch, auf Internetseiten und YouTube Videos habe ich bereits so einiges gelesen / gehört, aber nie wurde was beschrieben, wie man das bei GUIs macht.

Ich habe mein Code versucht in einer Klasse mit Methoden zu schreiben:

Code: Alles auswählen

########### Eigene CronusMax GamePack GUI (Graphical User Interface) ###########
# Importierung:
import tkinter, webbrowser
from tkinter import messagebox

class ScriptGameInterface:
    
    def __init__(self):
        # Hauptfenster:
         self.mainwindow = tkinter.Tk()
         self.mainwindow.title("xXSkyWalkerXx1 - Fortnite S.G.I. Tool")
         self.mainwindow.resizable(0,0)
         self.mainwindow.geometry("1200x540") #(x - Y)
         self.mainwindow.mainloop()
         
        # Menüleiste:
         self.menuLeiste = tkinter.Menu(self.mainwindow)
         self.infoLeiste = tkinter.Menu(self.menuLeiste,tearoff=0)
         self.donateLeiste = tkinter.Menu(self.menuLeiste,tearoff=0)
         self.exitLeiste = tkinter.Menu(self.menuLeiste,tearoff=0)
         self.updateLeiste = tkinter.Menu(self.menuLeiste,tearoff=0)
         self.shopLeiste = tkinter.Menu(self.menuLeiste,tearoff=0)

         self.infoLeiste.add_command(label = "AGBs", command = showAGB)
         self.infoLeiste.add_command(label = "Credits", command = showAuthor)
         self.exitLeiste.add_command(label = "Beenden", foreground = "red",command = Beenden) #Ändert Schriftfarbe zu Rot (Hintergrund wäre "background")
         self.donateLeiste.add_command(label = "Donate", command = openDonateLink)
         self.shopLeiste.add_command(label = "Online Shop", foreground = "green",command = openShopLink)

         self.menuLeiste.add_cascade(label="Infos", menu= infoLeiste)
         self.menuLeiste.add_cascade(label="Update[comming soon!]", menu= updateLeiste)
         self.menuLeiste.add_cascade(label="Donate", menu= donateLeiste)
         self.menuLeiste.add_cascade(label="More Scripts", menu= shopLeiste)
         self.menuLeiste.add_cascade(label="Beenden", menu= exitLeiste)

         self.mainwindow["menu"] = menuLeiste
         
        # Frames:
         self.frameLeft = tkinter.Frame(self.mainwindow,width=200,height=300,relief="sunken",bd=0)#300 , 540
         self.frameLeft.pack(side="left",expand=1)
         self.frameRight = tkinter.Frame(self.mainwindow, width=500,height=400,relief="sunken",bd=0)#900 , 540
         self.frameRight.pack(side="right",expand=1)

        # Widgets vom/für linken Frame:
         self.generateButton = tkinter.Button(self.frameLeft, text= ">>>GENERATE BUTTON<<<", command = generate)
         self.infoLabel1 = tkinter.Label(self.frameLeft, text = "Layout Settings:", font = "arial 27 bold", foreground = "orange")  #Gibt Text in Arial, Größe 25 und Art fettgedruckt aus
         self.layoutButton = tkinter.Button(self.frameLeft, text = "Layout Settings", command = layoutSettings)
         self.infoLabel2 = tkinter.Label(self.frameLeft, text = "Mods:", font = "arial 27 bold", foreground = "orange")  #Gibt Text in Arial, Größe 25 und Art fettgedruckt aus
         self.aimbotButton = tkinter.Button(self.frameLeft, text = "Aimbot", command = aimbotSettings)
         self.aimassistButton = tkinter.Button(self.frameLeft, text = "AimAssist", command = aimassistSettings)
         self.norecoilButton = tkinter.Button(self.frameLeft, text = "NoRecoil", command = norecoilSettings)
         self.rapidfireButton = tkinter.Button(self.frameLeft, text = "RapidFire", command = rapidfireSettings)
         self.jitterButton = tkinter.Button(self.frameLeft, text = "Double Tac & Pump", command = jitterSettings)
         self.autorunButton = tkinter.Button(self.frameLeft, text = "AutoRun", command = autorunSettings)

        # Widgets vom/für rechten Frame:
         self.titleLabel = tkinter.Label(self.frameRight,foreground = "red", font = "arial 33 bold")
         self.previewLabel = tkinter.Label(self.frameRight, text = "PLACEHOLDER FOR PICTURE/VIDEO!")
         self.info1Label = tkinter.Label(self.frameRight, text = "Information/en:",foreground = "red",font = "arial 18 bold") 
         self.info2Label = tkinter.Label(self.frameRight,text = "<Noch keine Informationen enthalten!>",font = "arial 10") 
         self.setting1Label = tkinter.Label(self.frameRight, text = "Einstellungen:",foreground = "red",font = "arial 18 bold")
         self.setting2Label = tkinter.Label(self.frameRight, text = "Schaltung:",font = "arial 10")
         self.setting3Label = tkinter.Label(self.frameRight,font = "arial 10")
         self.setting4Label = tkinter.Label(self.frameRight,font = "arial 10")
         self.setting5Label = tkinter.Label(self.frameRight,font = "arial 10")
         self.toggle = tkinter.StringVar()
         self.toggle.set("FALSE")                  
         self.on = tkinter.Radiobutton(self.frameRight, text = " ON",variable=toggle,value="TRUE")
         self.off = tkinter.Radiobutton(self.frameRight, text = "OFF",value="FALSE")
         self.entry1 = tkinter.Entry(self.frameRight)
         self.entry2 = tkinter.Entry(self.frameRight)
         self.entry3 = tkinter.Entry(self.frameRight)

        #Widgets platzieren:
         self. generateButton.pack(pady=12)
         self.infoLabel1.pack(pady=12)
         self.layoutButton.pack(pady=8)
         self.infoLabel2.pack(pady=12)
         self.aimbotButton.pack(pady=8)
         self.aimassistButton.pack(pady=8)
         self.norecoilButton.pack(pady=8)
         self.rapidfireButton.pack(pady=8)
         self.jitterButton.pack(pady=8)
         self.autorunButton.pack(pady=8)

    def Beenden(self):
        self.mainwindow.destroy()

    def check_updates(self):
        pass

    def openDonateLink(self):
        try:
            self.webbrowser.open("https://www.paypal.me/xXSkyWalkerXx1")
        except:
            self.error = tkinter.messagebox.showerror("Fehler","Verbindung konnte nicht aufgebaut werden!")    

    def openShopLink(self):
        try:
            self.webbrowser.open("https://selly.gg/@xXSkyWalkerXx1")
        except:
            self.error = tkinter.messagebox.showerror("Fehler","Verbindung konnte nicht aufgebaut werden!")    

    def showAGB(self):
        self.infoText = tkinter.messagebox.showinfo("AGBs","\
    *****************************************\n\
       Hier werden später die AGBs stehen!   \n\
    *****************************************") #41 "*" für eine ganze Zeile

    def showAuthor(self):
        self.infoText = tkinter.messagebox.showinfo("Credits","\
    *****************************************\n\
            Credits: xXSkyWalkerXx1\n\
              Thanks to:  __deets__\
    *****************************************")

    def generate(self): # generiert Skript
        pass

    def layoutSettings(self): 
        pass

    def aimbotSettings(self):
        pass

    def aimassistSettings(self):
        pass

    def norecoilSettings(self):
        pass

    def jitterSettings(self):
        pass

    def autorunSettings(self):
        pass

    def rapidfireSettings(self): # (self,shootrate = "4") - set shootrate default to 4!
        pass
    
Interface = ScriptGameInterface()
Interface.__init__()
Allerdings erhalte ich beim Start keine Widgets - einfach nur ein leeres Fenster mit Titel.
Nach Beendigung erhalte ich diesen Fehler in der Shell:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/pi/Schreibtisch/CronusMax_SGI.py", line 142, in <module>
    Interface = ScriptGameInterface()
  File "/home/pi/Schreibtisch/CronusMax_SGI.py", line 18, in __init__
    self.menuLeiste = tkinter.Menu(self.mainwindow)
  File "/usr/lib/python3.5/tkinter/__init__.py", line 2720, in __init__
    Widget.__init__(self, master, 'menu', cnf, kw)
  File "/usr/lib/python3.5/tkinter/__init__.py", line 2151, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: can't invoke "menu" command: application has been destroyed
Habe nun ne Woche nicht mehr probiert, da ich auch mal wieder was für YouTube machen wollte, doch nun möchte ich weiter machen.

Mit freundlichen Grüßen,
xXSkyWalkerXx1
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Du startest den Mainloop zu früh. Alles was nach `self.mainwindow.mainloop()` kommt, wird ja erst ausgeführt, wenn das Fenster schon wieder geschlossen ist.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Ahhh...Danke! :D Ja, dann ist das Hauptproblem gelöst! :)
Jetzt nur noch "self." an den Methodenaufrufen anhängen.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Den expliziten Aufruf von __init__() solltest Du entfernen.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Wieso?
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Haha, hat sich erledigt - danke! :D
Dadurch wurde auch das Problem gelöst, dass beim drücken von "Beenden" das Fenster erneut aufgerufen wurde und erst beim 2. drücken beendet blieb. ^^
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Die mainloop aus der __init__ zu starten ist ja auch suboptimal.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

xXSkyWalkerXx1 hat geschrieben: Dienstag 10. Juli 2018, 20:22 Wieso?
__init__ wird ohnehin automatisch beim Erstellen der Objektinstanz aufgerufen. Das zweimal zu machen ist sinnlos.
Antworten