mit Button GUI Elemente einer anderen Funktion bearbeiten

Fragen zu Tkinter.
Antworten
Darrenshan
User
Beiträge: 1
Registriert: Freitag 4. Mai 2018, 21:52

Hey,
ich versuche einen frame zu erstellen und dieser hat buttons(funktioniert so weit).Bei betätigen eines Buttons sollen die bisher eingerichteten Buttons verschwinden und eventuell neue erscheinen(oder allgemein alte grafische Elemente verschwinden und neue erstellt werden). Genau daran hapert es aber leider. Hier mein code:


Code: Alles auswählen

import tkinter as tk
 
def create_mainframe(width, height, titel):
    window = tk.Tk()
    window.title(titel)
    window.geometry("{}x{}".format(width,height))
    return window
 

def button_action_load_save():
    print("atext")


def button_action_start_new():
    print("atext")
 
def create_button(target_frame, text, command):
    button = tk.Button(target_frame, text=text, command=command)
    return button
 
 
def main():
    mainframe = create_mainframe(400, 300, "Testfenster")
    button_load_save = create_button(mainframe, "Load Saves", button_action_load_save)
    button_start_new = create_button(mainframe, "Start new Game", button_action_start_new)
    button_load_save.pack()
    button_start_new.pack()
    mainframe.mainloop()
 
if __name__ == '__main__':
    main()

wenn ich hier in button_action_load_save oder button_action_start_new anfange irgendwas wie

Code: Alles auswählen

button_load_save.destroy
zu benutzenbekomme ich natürlich die fehlermeldung, dass button_load_save nicht definiert ist. Allgemein glaube ich, dass ist noch kein super ansatz. Hat jemand eine Idee, wie ich in einer anderen Funktion die GUI elemente bearbeite? Oder ist die Funktion einfach ein schlechtes mittel dafür? ich habe bisher nur mit webframeworks gearbeitet und stelle mir das vermutlich etwas zu sehr noch als einzelne pages vor :roll:

MfG
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Der Name ist in der jeweiligen Funktion zum Behandeln der Aktion ja auch nicht definiert, sondern nur lokal in der `main()`-Funktion. Wenn die Namen die innerhalb einer Funktion definiert werden, automatisch in allen anderen, oder auch nur in den Aufgerufenen, existieren würden, dann wären Funktionen nahezu nutzlos, denn sie sollen es ja gerade ermöglichen in sich geschlossene Einheiten zu bilden, die eine Aufgabe lösen ohne das man an anderer Stelle etwas über die Interna wissen muss, oder darin herumpfuschen kann.

Alles was eine Funktion oder Methode verwendet, ausser Konstanten, sollte als Argument übergeben werden. Du müsstest die Objekte also beispielsweise mit `functools.partial()` an die Funktion binden bevor sie als `command` übergeben wird, oder objektorientiert arbeiten. Letzteres ist der übliche Weg in Python.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mal als Beispiel `partial()` und OOP gegenübergestellt:

Code: Alles auswählen

from functools import partial
import tkinter as tk

 
def do_load():
    print('load...')


def do_start(load_button):
    load_button['state'] = tk.DISABLED
    print('start...')
  
 
def main():
    root = tk.Tk()
    root.title('Testfenster')

    load_button = tk.Button(root, text='Load Saves', command=do_load)
    load_button.pack()
    start_button = tk.Button(
        root, text='Start new Game', command=partial(do_start, load_button)
    )
    start_button.pack()
    
    root.mainloop()


if __name__ == '__main__':
    main()
Und:

Code: Alles auswählen

import tkinter as tk


class MainWindow(tk.Tk):
    
    def __init__(self):
        tk.Tk.__init__(self)
        self.title('Testfenster')
        
        self.load_button = tk.Button(
            self, text='Load Saves', command=self.do_load
        )
        self.load_button.pack()
        self.start_button = tk.Button(
            self, text='Start new Game', command=self.do_start
        )
        self.start_button.pack()
    
    @staticmethod
    def do_load():
        print('load...')

    def do_start(self):
        self.load_button['state'] = tk.DISABLED
        print('start...')
  
 
def main():
    root = MainWindow()
    root.mainloop()


if __name__ == '__main__':
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten