Tkinter-Ideen

Fragen zu Tkinter.
Antworten
Bykl
User
Beiträge: 92
Registriert: Donnerstag 5. Oktober 2017, 17:57

Da hier Tkinter Fachleute versammelt sind, stelle ich ein paar Ideen vor, und erwarte von den lesenden, on Tkinter dazu die geeignete Wahl ist, die Idee zu realisieren:

1. Idee Eins
https://www.directupload.net/file/d/6314/_png.htm
wir weitergemacht, bin nur am Probieren, warum das Bild nicht zu sehen ist.
Hilfsweise (Bild und Idee) hier: https://matheplanet.com/default3.html?topic=255542=5108
In Excel bekommt man das nicht hin, aber in Tkinter kann man Tabellen mit aktiven Zellen imitieren

2. Idee 2.
Dann möchte ich eine grössere dynamische sensitive Tabelle. Da soll folgendes passieren. Man gibt eine Zahl ein in ein Entry-Feld, welches eingangs erscheint. Soviel Spalten hat dann die Tabelle und halb soviel Zeilen. Dann klickt man in eine Zeile auf ein beliebiges Feld, dieses färbt sich mit einer vorgegebenen Farbe, dann trägt man in das nun gefärbte Feld eine Zahl ein, und alle Felder in derselben Zeile, die im Abstand der Zahl stehen, färben sich ebenfalls mit derselben Farbe und die Zahl erscheint dort auch. Dann macht man dasselbe mit der nächsten Zeile.

Sind diese Idee in Tkinter umsetzbar?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bykl: Bei Idee 1 weiss ich nicht was da die Idee sein soll. Der Link auf das Forum von Matheplanet führt soweit ich das sehe zu keiner Beschreibung einer Idee, sondern zu einer Frage nach Python/OOP und was `self` bedeutet, und wird da ja auch zur Zufriedenheit des Fragestellers geklärt. Hier vielleicht noch mal der Quelltext, der dort steht:

Code: Alles auswählen

import tkinter as tk

#window = tk.Tk()
#label_gruss = tk.Label(window, text="Hallo")
#label_gruss.pack(padx=30,pady=20)
#window.mainloop()

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack(padx=50,pady=60)
        self.create_widgets()

    def create_widgets(self):
        self.hi_there = tk.Button(self)
        self.hi_there["text"] = "Hello World\n(click me)"
        self.hi_there["command"] = self.say_hi
        self.hi_there.pack(side="top")

        self.quit = tk.Button(self, text="QUIT", fg="red",
                              command=self.master.destroy)
        self.quit.pack(side="bottom")

    def say_hi(self):
        print("hi there, everyone!")

root = tk.Tk()
app = Application(master=root)
app.mainloop()
Der Druck auf die „Quit“-Schaltfläche funktioniert bei mir, ich sehe auch nicht warum er das nicht tun sollte. Und das sich da nichts blau färbt, liegt daran, dass in dem Code nichts steht was irgend etwas blau färben würde.

Anmerkungen zum Quelltext: `master` musst Du nicht selber an das Objekt binden, das macht die `Frame.__init__()` bereits.

Der `pack()`-Aufruf gehört nicht in die `__init__()`. Kein vorhandenes Widget layoutet sich selbst, das ist die Aufgabe des Aufrufers/Erstellers des Widgets.

Dann besteht die `__init__()` nur noch aus dem Aufruf von `Frame.__init__()` und der Methode die den Frame-Inhalt erstellt. Warum steht das nicht in der `__init__()`?

`hi_there` ist kein guter Name für einen `Button`. Und `quit` auch nicht, insbesondere weil damit eine Methode verdeckt wird, die gleich noch wichtig wird.

Beide `Button`-Objekte werden auch gar nicht mehr verwendet, nachdem sie erstellt werden, also gehören die auch nicht zum Zustand des Objekts und damit nicht als Attribute auf das Objekt.

Warum werden beim ersten Button `text` und `command` nicht bereits beim erstellen des `Button` übergeben wie das beim zweiten ja bereits gemacht wird?

Letztlich braucht man beiden Objekten dann nicht einmal einen lokalen Namen geben.

Wo `tkinter` Konstanten für Zeichenketten mit „Enum-Character“ hat, sollte man die auch verwenden (`TOP` und `BOTTOM` in diesem Fall).

`self.master.destroy` ist keine gute Idee, weil dass nur die gewünschte Wirkung hat, falls `master` denn auch tatsächlich das Hauptfenster ist. Man sollte in der Widgethierarchie nicht nach oben greifen und solche starken Annahmen über das übergeordnete Element machen. Das ist irgendein Widget. Mehr weiss man an der Stelle nicht wirklich, beziehungsweise mehr sollte man nicht wissen dürfen.

Da kommen wir dann wieder zu `quit`. Das ist eine Methode die es auf jedem Widget gibt, welche die GUI-Hauptschleife beendet. Und *das* sollte man machen.

`say_hi()` ist im Grunde keine Methode weil die nichts mit `self` macht. Das könnte man einfach als Funktion ausserhalb der Klasse definieren. Das ist aber auch so simpel, dass man das als ``lambda``-Ausdruck direkt beim `command`-Argument angeben könnte.

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk


class Application(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        tk.Button(
            self,
            text="Hello World\n(click me)",
            command=lambda: print("hi there, everyone!"),
        ).pack(side=tk.TOP)
        tk.Button(self, text="QUIT", fg="red", command=self.quit).pack(
            side=tk.BOTTOM
        )


def main():
    root = tk.Tk()
    app = Application(master=root)
    app.pack(padx=50, pady=60)
    root.mainloop()


if __name__ == "__main__":
    main()
Wobei man hier jetzt über die Aufteilung des Codes reden könnte. Die Klasse ist jetzt so simpel, dass man das alles in die `main()`-Funktion stecken könnte. Oder man könnte `Application` von `Tk` erben lassen, statt von `Frame` und den nur lokal in der `__init__()` erstellen.

Idee Nummer 2 sollte sich mit Tk umsetzen lassen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

@__blackjack__ ggf hat der TE im Mathe Forum den Code in IDLE ausgeführt. Das hat dann ja gerne tkinter Seiteneffekte
Bykl
User
Beiträge: 92
Registriert: Donnerstag 5. Oktober 2017, 17:57

Danke Blackjack...

hier nochmal der Link, den anderen nehm ich raus....
Mit den Links klappt das aus irgendwelchen Gründen nicht, es kommen immer andere, wenn ich den Link aus der Befehlszeile kopiere. Also, die Frage ist hier beschrieben, und hier kann ich sie nicht beschreiben, weil sie mit Bildern notwendig illustriert ist, die ich auch nicht hierher kriege, weil die Bilderdienste, diese Bilder irgendwie nicht akzeptieren...

Matheplanet -> Informatik -> "Welche Software für Animationen mathematischer Sachverhalte?"

Es wäre nett, wenn nochmal jemand draufsehen würde ....

Vielen Dank für die andere Antwort...
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also dieser Forenbeitrag: https://matheplanet.com/matheplanet/nuk ... pic=255515

Es ist ein bisschen ungenau was Du letztlich im vollem Umfang machen willst. Das im ersten Beitrag geht vielleicht noch mit Tk, aber dann fängst Du an mit 3D-Darstellungen. Da müsste man sich viel selbst programmieren, wenn man das tatsächlich in Tk machen will.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Gibt es einen Grund, nicht manim zu benutzen? Dafür ist das doch gemacht.
Antworten