Hilfe bei einfacher oop Frage

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
timm4444
User
Beiträge: 51
Registriert: Samstag 1. August 2020, 14:11

Ich habe eine wahrscheinlich sehr einfache Frage. Hier der Code:

Code: Alles auswählen

from time import sleep

from tkinter import Button, Tk, messagebox

try:
    from reader1_0 import *
except:
    messagebox.showerror("ERROR", "Datei wurde nicht gefunden!\n:-[")

menue: Tk = Tk()

w, h = 800, 800
menue.geometry("%dx%d+0+0" % (w, h))
menue.configure(bg="grey")
menue.title("1234")
canvas_width = w
canvas_height = h
menue.update()
width = menue.winfo_width()

beenden_button = Button(menue, fg="white", bg="blue", text="Beenden", font=("times", int(width / 40)),
                        command=lambda: menue.destroy())

button2 = Reader(menue, fg="white", bg="blue", text="Drücke mich!", font=("times", int(width / 40)),
                              command=Reader.reader("wert1234"))

beenden_button.place(relx=0.4, rely=0.85, relwidth=0.3, relheight=0.1)
button2.place(relx=0.4, rely=0.1, relwidth=0.3, relheight=0.1)
menue.mainloop()
und:

Code: Alles auswählen

from tkinter import *

class Reader(Button):
    @staticmethod
    def reader(wert):
        fenster = Tk()
        fenster.geometry("500x400")
        fenster.title("4321")
        rahmen = Frame(fenster, relief="ridge", borderwidth=5)
        rahmen.pack(fill="both", expand=1)
        label = Label(rahmen, text=wert)
        label.config(font=("Arial", 14, "bold"))
        label.pack(pady=20)
        fenster.mainloop()
Ich möchte, dass sich das Fenster mit dem wert erst öffnet, wenn ich den button drücke, und nicht wenn ich die haupt datei öffne. Wie mache ich das?
Sirius3
User
Beiträge: 18276
Registriert: Sonntag 21. Oktober 2012, 17:20

Nackte excepts benutzt man nicht, vor allem nicht beim Import von Modulen. Der Modulname ist komisch, was sollen die Ziffern? *-Importe benutzt man nicht, was Dir ja hier schon öfter gesagt wurde. Bei einem Importfehler macht das Programm weiter als ob nichts gewesen wäre. Was dann zu Folgefehler führt.
Die Typ-Annotation ist unsinn.
`update` sollte man nicht verwenden und ist hier unnötig.
Die Reader-Klasse ist Unsinn, weil sie Button nicht sinnvoll erweitert. Staticmethoden machen generell selten Sinn. Es darf nur ein Tk-Exemplar geben, weitere Fenster macht man mit Toplevel.
Genauso wie es nur einen mainloop-Aufruf geben sollte.

Beim ersten Button ist das lambda unnötig, weil man auch gleich menue.destroy übergeben könnte. Beim zweiten Button fehlt dagegen das lambda, weil Du sofort die Funktion aufrufst.
Besser benutzt man partial.

Code: Alles auswählen

import tkinter as tk
from functools import partial

def reader(wert):
    fenster = tk.Toplevel()
    fenster.title("4321")
    rahmen = tk.Frame(fenster, relief="ridge", borderwidth=5)
    rahmen.pack(fill="both", expand=1)
    label = tk.Label(rahmen, text=wert)
    label.config(font=("Arial", 14, "bold"))
    label.pack(pady=20)


def main():
    menue = tk.Tk()
    menue.configure(bg="grey")
    menue.title("1234")
    width = menue.winfo_width()

    beenden_button = tk.Button(menue,
        fg="white", bg="blue", text="Beenden",
        font=("times", int(width / 40)),
        command=menue.destroy)
    button2 = tk.Button(menue,
        fg="white", bg="blue", text="Drücke mich!",
        font=("times", int(width / 40)),
        command=partial(reader, "wert1234"))
    beenden_button.place(relx=0.4, rely=0.85, relwidth=0.3, relheight=0.1)
    button2.place(relx=0.4, rely=0.1, relwidth=0.3, relheight=0.1)
    menue.mainloop()

if __name__ == "__main__":
    main()
Antworten