Textfeld dynamisch vergrößern

Fragen zu Tkinter.
Antworten
MarKie
User
Beiträge: 2
Registriert: Sonntag 9. Februar 2025, 16:54

Hallo in die Runde,

ich habe folgendes Problem: meine Textfelder passen sich nicht dynamisch an, egal ob ich sie in ein .grid einbinde oder auf ein Frame.

Wenn ich width und height angebe verändern sie sich natürlich nicht dynamisch, wenn ich die Angabe weglasse werden die Felder riesig groß und überschreiten bei mehreren Textfeldern meinen Screen.

Wer hat Erfahrungen damit und kann mir sagen, warum
1. die Textfelder ohne width / height so riesig groß werden bzw wie man das anders einstellen kann
2. sich nicht flexibel anpassen

Kennt jemand eine Lösung dafür?

Ich hatte das gleiche Problem bei der Anpassung von Schrift und dort eine prozentuale Formel erstellt, die die Schrift ungefähr mit vergrößert - und Schrift ist ja in Pixeln angegeben - die width und heigth-Angaben eines Textfeldes sind es aber nicht. Wenn ich das prozentual umrechnen möchte, gibt es da hinterlegte Werte? Ein height / Zeile = x Pixel, ein width / Buchstabe, Zeichen = x Pixel?

Vielleicht gibt es ja auch eine ganz andere einfachere Lösung. Ich habe auch schon überlegt auf kivy 'umzusteigen', da man damit angeblich responsive gestalten kann - nur hätten die Textfelder dann vielleicht das gleiche Problem. Weiß jemand ob es dort geht?

Bitte um Erfahrungswerte. Wie macht ihr die Anpassung eines Textfeldes, wenn sich das Hauptfenster in der Größe verändert?
Danke schön.



Hier ein Beispiel, wie es leider nicht angepasst wird:


from tkinter import *


app = Tk()
app.title("")
app.wm_state("zoomed")


# ------------------------------------------------------------------------------

def leer():
pass

# beenden mit Escape
def schliessen(event):
app.destroy()

app.bind_all('<Escape>', schliessen)

# -----------------------------------------------------------------------------

Frame_Textbereiche = Frame(app)
Frame_Textbereiche.pack(side=TOP, pady=100, padx=100, expand=TRUE, fill=BOTH)


# --------------------------------------------------------------------


benennen_1 = Text(Frame_Textbereiche,
bg="#FF99CC", font=("Arial", 11))

benennen_2 = Text(Frame_Textbereiche,
bg="#FFFFCC", font=("Arial", 11))

benennen_3 = Text(Frame_Textbereiche,
bg="lightblue", font=("Arial", 11))



textfenster_1 = Text(Frame_Textbereiche,
fg="lightblue", bg="lightblue",
font=("Arial", 11), wrap="word")

textfenster_2 = Text(Frame_Textbereiche,
fg="lightblue", bg="lightblue",
font=("Arial", 11), wrap="word")

textfenster_3 = Text(Frame_Textbereiche,
fg="white",
font=("Arial", 11), wrap="word")


textfenster_1.focus()


benennen_1.grid(row=0, column=0, sticky="nswe")
benennen_2.grid(row=0, column=1, sticky="nswe")
benennen_3.grid(row=0, column=2, sticky="nswe")

textfenster_1.grid(row=1, column=0, sticky="nswe")
textfenster_2.grid(row=1, column=1, sticky="nswe")
textfenster_3.grid(row=1, column=2, sticky="nswe")



app.mainloop()
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MarKie: Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` fast 140 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.

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

Man nummeriert keine Namen. Dann will man sich entweder bessere Namen überlegen, oder gar keine Einzelnamen/-werte verwenden, sondern eine Datenstruktur. Oft eine Liste.

`benennen` ist ein komischer Name für ein Texteingabe-Element. Und `text_fenster` ist gar kein Fenster.

`leer()` wird definiert aber nirgends verwendet.

An der Schriftgrösse sollte man besser nur relativ zur Grösse ändern die der Benutzer eingestellt hat.

Beim `grid()`-Layout muss man sagen welche Spalten und Zeilen sich ändern dürfen wenn sich die zur Verfügung stehende Fläche ändert. Das kann man auch verschieden gewichten.

Code: Alles auswählen

import tkinter as tk


def main():
    app = tk.Tk()
    app.title("")
    app.bind_all("<Escape>", lambda _event: app.quit())

    textbereiche_frame = tk.Frame(app)
    textbereiche_frame.pack(
        side=tk.TOP, pady=100, padx=100, expand=True, fill=tk.BOTH
    )

    text_widgets = []
    for column_index, (color_a, color_b) in enumerate(
        [("#F9C", "lightblue"), ("#FFC", "lightblue"), ("lightblue", "white")]
    ):
        text_widget_a = tk.Text(textbereiche_frame, bg=color_a)
        text_widget_a.grid(row=0, column=column_index, sticky=tk.NSEW)
        text_widget_b = tk.Text(textbereiche_frame, bg=color_b, wrap=tk.WORD)
        text_widget_b.grid(row=1, column=column_index, sticky=tk.NSEW)
        text_widgets.append((text_widget_a, text_widget_b))
        textbereiche_frame.columnconfigure(column_index, weight=1)

    textbereiche_frame.rowconfigure(0, weight=1)
    textbereiche_frame.rowconfigure(1, weight=1)

    text_widgets[0][1].focus()
    app.mainloop()


if __name__ == "__main__":
    main()
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
MarKie
User
Beiträge: 2
Registriert: Sonntag 9. Februar 2025, 16:54

Puh ... Lass mich doch bitte so programmieren, wie ich es mache. Danke.
Das mit dem .grid und der Gewichtung ist bekannt. Die Größe der Textfelder passt sich in einem .grid bei mir nicht dynamisch an, trotz Gewichtung. Und die Frage war, wie man Textfelder dynamisch vergrößert oder verkleinert bzw diese sich dem Fenster anpassen. Ein .grid macht diese Anpassung mit Buttons nach meiner Erfahrung nahezu perfekt. Textfelder werden aber nicht angepasst.

Falls es eine Lösung für die dynamische Anpassung von Textfeldern gibt, bitte posten. Danke schön.
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MarKie: Also bei meinem Code passt sich die Grösse der Textfelder bei mir der Fenstergrösse an.

Du kannst auch gerne weiter Code schreiben der fehleranfälliger und unverständlicher ist als er sein müsste, und nur bei Dir auf dem Rechner so funktioniert, aber nicht auf anderen Systemen mit anderen Einstellungen und Hardwarevorgaben.
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
Benutzeravatar
grubenfox
User
Beiträge: 593
Registriert: Freitag 2. Dezember 2022, 15:49

__blackjack__ hat geschrieben: Mittwoch 12. Februar 2025, 12:01 @MarKie: Also bei meinem Code passt sich die Grösse der Textfelder bei mir der Fenstergrösse an.
Hier ebenso... (getestet auf einem Windows-Rechner, falls das hier relevant ist)
Antworten