Enrty-Ausgabe in GUI

Fragen zu Tkinter.
Antworten
kaiderclown
User
Beiträge: 2
Registriert: Dienstag 14. März 2023, 16:30

Hallo,

ich bin gerade dabei, mir Python beizubringen und habe ein Problem.

Ich würde gerne die Entry ausgaben nicht in der Konsole sondern in der GUI (Frame oder Textbox ) ausgeben lassen. Ich bekomme es aber irgendwie nicht hin.

Die Print ausgaben in der Konsole gehen einwandfrei!






Könnte mir jemand eventuell weiter helfen?

Wie bekomme ich die Entry-Ausgabe in die Textbox?




Code: Alles auswählen

import customtkinter as ctk

# Selecting GUI theme - dark, light , system (for system default)
ctk.set_appearance_mode("dark")

# Selecting color theme - blue, green, dark-blue
ctk.set_default_color_theme("blue")


def user_entry1():
current_input1 = user_entry1.get()
print(current_input1)
strv.set(user_entry1)

current_input2 = user_entry2.get()
print(current_input2)
strv.set(user_entry2)

current_input3 = user_entry3.get()
print(current_input3)
strv.set(user_entry3)

current_input4 = user_entry4.get()
print(current_input4)
strv.set(user_entry4)





app = ctk.CTk()
app.geometry("1500x700")
app.title(" System ")


strv= ctk.StringVar()





#Button Event/Umrechnen


button = ctk.CTkButton(master=app, font=("Arial", 20), text='Umrechnen', width=150, height=120, command=user_entry1 )
button.place(x=1330, y=620, )






#TextBox

textbox = ctk.CTkTextbox(app, width=1183, height=500, )
textbox.place(x= 30, y=250, )






#Button=Label

button = ctk.CTkButton(app, text_color="Black", font=("Arial", 15), text='Ergebniss', width=150, height=40, state=ctk.DISABLED,)
button.place(x=30, y=200, )

button = ctk.CTkButton(app,text_color="White", font=("Arial", 15), text='Gib bitte Zahlen von 1-60 ein!', width=150, height=40)
button.place(x=30, y=5, )








#Optionsmenü

optionmenu_var = ctk.StringVar(value="option 2") # set initial value

def optionmenu_callback(choice):
print("optionmenu dropdown clicked:", choice)

combobox = ctk.CTkOptionMenu(master=app,
values=["option 1", "option 2", "option 3", "option 4"],
command=optionmenu_callback,
variable=optionmenu_var,width=150, height=45, )
combobox.place(x=1330, y=30,)





#Label TEXT

label = ctk.CTkLabel(app, text="System ",)
label.place(x = 1330, y = 5 )




#Positions Zahl!

frame = ctk.CTkFrame(master=app, width=1183, height=80, )
frame.place(x = 30, y = 80 )

label1 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="1.")
label1.place(x = 13, y = 0 )

label2 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="2.")
label2.place(x = 73, y = 0 )

label3 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="3.")
label3.place(x = 133, y = 0 )

label4 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="4.")
label4.place(x = 193, y = 0 )

label5 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="5.")
label5.place(x = 253, y = 0 )

label6 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="6.")
label6.place(x = 313, y = 0 )

label7 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="7.")
label7.place(x = 373, y = 0 )

label8 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="8.")
label8.place(x = 433, y = 0 )

label9 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="9.")
label9.place(x = 493, y = 0 )

label10 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="10.")
label10.place(x = 548, y = 0 )

label11 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="11.")
label11.place(x = 608, y = 0 )

label12 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="12.")
label12.place(x = 669, y = 0 )

label13 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="13.")
label13.place(x = 728, y = 0 )

label14 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="14.")
label14.place(x = 788, y = 0 )

label15 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="15.")
label15.place(x = 848, y = 0 )

label16 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="16.")
label16.place(x = 908, y = 0 )

label17 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="17.")
label17.place(x = 968, y = 0 )

label18 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="18.")
label18.place(x = 1028, y = 0 )

label19 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="19.")
label19.place(x = 1088, y = 0 )

label20 = ctk.CTkLabel(master=frame, font=("Arial", 15), text="20.")
label20.place(x = 1148, y = 0 )












#Eingabe/Entry



user_entry1 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry1.place(x=30, y=107,)

user_entry2 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry2.place(x=90, y=107, )

user_entry3 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry3.place(x=150, y=107, )

user_entry4 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry4.place(x=210, y=107, )

user_entry5 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry5.place(x=270, y=107, )

user_entry6 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry6.place(x=330, y=107, )

user_entry7 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry7.place(x=390, y=107, )

user_entry8 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry8.place(x=450, y=107, )

user_entry9 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry9.place(x=510, y=107, )

user_entry10 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry10.place(x=570, y=107, )

user_entry11 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry11.place(x=630, y=107, )

user_entry12 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry12.place(x=690, y=107, )

user_entry13 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry13.place(x=750, y=107, )

user_entry14 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry14.place(x=810, y=107, )


user_entry15 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry15.place(x=870, y=107, )

user_entry16 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry16.place(x=930, y=107, )

user_entry17 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry17.place(x=990, y=107, )

user_entry18 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry18.place(x=1050, y=107, )

user_entry19 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry19.place(x=1110, y=107, )

user_entry20 = ctk.CTkEntry(master=app,width=38, height=40,font=("Arial", 20), placeholder_text="")
user_entry20.place(x=1170, y=107, )


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

@kaiderclown: Die Einrückung stimmt nicht. Du hättest den gleichen Code nicht aus dem fast identischen Beitrag von Dir (viewtopic.php?p=418103) kopieren dürfen, sondern aus dem Editor, wo die Einrückung noch vorhanden ist.

Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Die Fenstergrösse gibt man in der Regel nicht hart, absolut vor, die ergibt sich automatisch aus dem Fensterinhalt. Natürlich nicht wenn man `place()` verwendet, aber das verwendet man auch nicht, weil das nicht wirklich funktioniert. Das sieht auf dem System auf dem man das ursprünglich programmiert hat, vielleicht brauchbar aus, aber auf anderen Systemen mit anderen Bildschirmgrössen und -auflösungen, sowie Einstellungen passt das nicht, bis hin zu unbrauchbaren GUIs, wenn Elemente sich überdecken oder nicht mehr in den sichtbaren Bereich passen. Bei mir ragt das System-Label beispielsweise ein bisschen in das Option-Menü rein.

Man nummieriert keine Namen. Dann will man sich entweder passendere Namen überlegen, oder gar keine einzelnen Namen/Werte, sondern eine Datenstruktur. Oft eine Liste.

`user_entry1` ist ein kein guter Name für eine Funktion, zumal der Name dann auch tatsächlich im gleichen Programm und Namensraum dann auch noch für ein `Entry`-Objekt verwendet wird. Zudem bekommen Funktionen alles was sie ausser Konstanten benötigen, als Argument(e) übergeben. Denn globale Variablen darf es ja nicht geben. Das bedeutet bei GUI-Programmen in der Regel das man die objektorientiert schreiben muss, also eigene Klassen schreiben können muss. In ganz einfach Fällen kann man sich noch mit `functools.partial()` behelfen, aber das wird sehr schnell unübersichtlich bis unpraktikabel.

Man verwendet keine Buttons als Label weil das ”besser” aussieht. Und mit Vorgabe von Farben und Schriftgrössen sollte man sich auch zurück halten, denn der Benutzer und das Theme haben da ja schon Vorgaben gemacht, zu denen eigene Werte nicht passen müssen. Auch hier wieder bis hin zu unbrauchbaren GUIs weil der Benutzer die Schriftgrösse nicht entziffern kann, oder die Schrift zu viel Platz weg nimmt, oder die Farbe nicht oder nur schlecht lesbar ist, gegen den Hintergrund.

Der Code der die Eingabeelemente erzeugt, sollte am besten in der Reihenfolge im Programm stehen in der die Elemente angeordnet sind, sonst ist das noch schwieriger Code und Anzeige zusammen zu bringen, als sowieso schon.

Wenn man Code immer wieder kopiert und leicht anpasst, macht man in der Regel etwas falsch. Programmierer wiederholen sich nicht — dafür gibt es Schleifen und/oder Funktionen.

Die ganzen `strv.set()`-Aufrufe sind bis auf den letzten unsinnig, weil am Ende ja nur der Wert vom letzten Aufruf erhalten bleibt. Und auch hier wieder: keinen Code kopieren, sondern eine Schleife schreiben.

Code: Alles auswählen

#!/usr/bin/env python3
import customtkinter as ctk
from functools import partial


def optionmenu_callback(choice):
    print("optionmenu dropdown clicked:", choice)


def do_calculation(entries, string_var):
    text = ""
    for entry in entries:
        text = entry.get()
        print(text)
    string_var.set(text)


def main():
    ctk.set_appearance_mode("dark")
    ctk.set_default_color_theme("blue")

    app = ctk.CTk()
    app.title("System")

    string_var = ctk.StringVar()
    optionmenu_var = ctk.StringVar(value="option 2")

    ctk.CTkLabel(
        app, text_color="White", text="Gib bitte  Zahlen von 1-60 ein!"
    ).grid(row=0, column=0, sticky=ctk.W)

    frame = ctk.CTkFrame(app)
    frame.grid(row=0, column=1)
    ctk.CTkLabel(frame, text="System").pack(side=ctk.TOP, anchor=ctk.NW)

    ctk.CTkOptionMenu(
        master=frame,
        values=["option 1", "option 2", "option 3", "option 4"],
        command=optionmenu_callback,
        variable=optionmenu_var,
    ).pack(side=ctk.TOP)

    frame = ctk.CTkFrame(app)
    frame.grid(row=1, column=0)

    number_entries = []
    for index in range(20):
        ctk.CTkLabel(frame, text=f"{index + 1}.").grid(row=0, column=index)
        entry = ctk.CTkEntry(frame, width=32)
        entry.grid(row=1, column=index)
        number_entries.append(entry)

    ctk.CTkLabel(app, text="Ergebniss").grid(row=2, column=0, sticky=ctk.W)

    ctk.CTkTextbox(app, height=500).grid(row=3, column=0, sticky=ctk.NSEW)
    ctk.CTkButton(
        master=app,
        text="Umrechnen",
        command=partial(do_calculation, number_entries, string_var),
    ).grid(row=3, column=1, sticky=ctk.SW)
    app.mainloop()


if __name__ == "__main__":
    main()
An der Stelle möchte ich mal ganz klar sagen das ich `customtkinter` für unbrauchbar halte, weil man die Breite der Eingabefelder hart in *Pixeln* angeben muss, und das damit keine sinnvoll portable GUI ist.

Die Dokumentation verwendet an sehr vielen Stellen absolute Pixelangaben und das ist der grösste Murks den man in GUI-Anwendungen machen kann.

Verwende `tkinter`, oder wenn dir die Optik nicht gefällt ein anderes modernes GUI-Rahmenwerk wie Qt oder Gtk.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten