title und geometry funktioniert nicht?

Fragen zu Tkinter.
Antworten
Benutzeravatar
MaximalMax
User
Beiträge: 18
Registriert: Sonntag 3. Mai 2020, 00:51

Kann mir jemand sagen, wieso title und geometry nicht funktionieren? Hier ist mein Code, falls der benötigt wird:

Code: Alles auswählen

from tkinter import *
import random
import string

chars = string.ascii_letters

def generatepw():
    pwl = []
    for _ in range(10):
        char = random.choice(chars)
        pwl.append(char)
    pws = ''.join(pwl)

    displayentry.insert(0, pws)

main = Tk()
main.title = "GUI-Passwort-Generator"
main.geometry = '400x300'

heading = Label(main, text="GUI-Passwort-Generator", font=('sans-serif', 15))
heading.pack()

placeholder = Label(main, text="")
placeholder.pack()

generatebtn = Button(main, text="Erstellen", command=generatepw)
generatebtn.pack()

placeholder2 = Label(main, text="")
placeholder2.pack()

displayentry = Entry(main)
displayentry.pack()

main.mainloop()
Danke für jede Hilfe, die ich bekommen werde :D
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Sowohl title als auch geometry sind Funktionen. Die muss man aufrufen und ihnen Parameter übergeben.
Du _überschreibst_ diese Funktionen und bindest an den Namen eine Zeichenkette.

Wo genau hast du denn in der Dokumentation gelesen, dass das so geht?
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine *-Importe und keine kryptischen Abkürzungen. Was soll den pwl heißen? Oder generatepw? Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen. chars sollte eine Konstante sein.
`main` sollte der Name der Funktion sein, wo alles statt auf oberster Ebene steht. Das Hauptfenster wird meist root genannt.
Das mit den placeholdern ist überflüssig. Benutze die Möglichkeiten, die der Layoutmanager bietet.

Code: Alles auswählen

import tkinter as tk
from functools import partial
import random
import string

CHARS = string.ascii_letters

def generate_password(password_display):
    password = ''.join(random.choices(CHARS, k=10))
    password_display.insert(0, password)

def main():
    root = tk.Tk()
    root.title("GUI-Passwort-Generator")
    password_display = tk.Entry(root)
    tk.Label(root, text="GUI-Passwort-Generator", font=('sans-serif', 15)).pack()
    tk.Button(root, text="Erstellen", command=partial(generate_password, password_display)).pack()
    password_display.pack()
    root.mainloop()

if __name__ == '__main__':
    main()
Benutzeravatar
__blackjack__
User
Beiträge: 14085
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MaximalMax: Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` fast 200 Namen ins Modul von denen nur ein kleiner Bruchteil verwendet wird. Auch Namen die gar nicht in `tkinter` definiert werden, sondern ihrerseits von woanders importiert werden. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. In dem Zusammenhang ist es ungünstig `main` auch noch als Namen des Fensters zu verwenden. Keine globalen Variablen hat zur Folge das Funktionen und Methoden alles was sie ausser Konstanten benötigen als Argument(e) übergeben bekommen. Das bedeutet bei GUIs mindestens Closures, bei jeder nicht-trivialen GUI aber auch objektorientierte Programmierung (OOP), also eigene Klassen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

Namen sollten keine kryptischen Abkürzungen enthalten (`generatebtn`, …) oder gar nur daraus bestehen (`pwl`, `pws`) und nicht nummeriert werden. Zwischen Worte in Namen gehört ein Unterstrichdamitdaslesbarerist.

Man muss auch nicht jedes Zwischenergebnis an Namen binden.

`geometry()` sollte man nicht verwenden solange die GUI nicht Elemente enthält die dann automatisch den Platz füllen. Die Grösse wird ja bereits durch den Layoutmanager an den Inhalt angepasst.

In `generatepw()` wird ja auch wirklich fast jedes Zwischenergebnis an einen Namen gebunden. Die ganze Funktion lässt sich mit einem Generatorausdruck als *ein* Ausdruck schreiben.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import random
import string
import tkinter as tk
from functools import partial

LETTERS = string.ascii_letters


def generate_password(display_entry):
    display_entry.insert(0, "".join(random.choice(LETTERS) for _ in range(10)))


def main():
    title = "GUI-Passwort-Generator"
    root = tk.Tk()
    root.title(title)

    tk.Label(root, text=title, font=("sans-serif", 15)).pack()

    tk.Label(root).pack()

    generate_button = tk.Button(root, text="Erstellen")
    generate_button.pack()

    tk.Label(root).pack()

    display_entry = tk.Entry(root)
    display_entry.pack()

    generate_button["command"] = partial(generate_password, display_entry)

    root.mainloop()


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten