tkinter - Print in Entry()

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
Mr. R341
User
Beiträge: 46
Registriert: Dienstag 29. September 2020, 10:51

Hi..

Ich bin ziemlich neu in python und setze mich gerade mit tkinter auseinander.
Mein Projekt ist gerade ein Taschenrechner in einer graphischen Oberfläche.

Jetzt würde ich es gerne so machen, dass das Ergebnis im Entry()-Fenster ausgegeben wird.

Gibt es eine Möglichkeit das zu tun?

Hier ein ("funktionierender") Ausschnitt aus meinem Code... Nur passiert halt nichts

Code: Alles auswählen

from tkinter import *

fenster = Tk()
fenster.title("Taschenrechner")
fenster.geometry("400x500")

def test():
    result_screen.config(text="Hello")
    
button_zero = Button(text="0", font=('Arial', '25', "bold"), command=test)

result_screen = Entry(fenster, bd=10, width=500, font=("Arial", "24"))

result_screen.place(relx=0, rely=0, relwidth=1, relheight=0.1)

button_zero.place(relx=0.2505, rely=0.7005, relwidth=0.25, relheight=0.2)

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

@Mr. R341: 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.

`place()` ist auch mit relativen Angaben keine gute Idee.

Du musst auf dem `Entry`-Objekt die entsprechenden Methoden benutzen um Text einzufügen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Mr. R341
User
Beiträge: 46
Registriert: Dienstag 29. September 2020, 10:51

Aber ich kann doch auch nicht jede einzelne Funktion die ich aus einem Modul brauche hinschreiben... allein in meinem unten stehenden Code wären das 12 Funktionen aus tkinter...
______________________________________________________________________________________________________________
Was meinst du mit Modulebene?
______________________________________________________________________________________________________________
place() Ist das aufwendigste, aber leider auch das einzige mir bisher bekannte, um die Buttons so darzustellen wie sie jetzt dargestellt werden und sich auch so verhalten... es gibt meines wissens leider nur pack(), grid(), und place(). und das Problem ist, dass sich nur bei place() die relativangaben zur größe der buttons machen lassen können...
______________________________________________________________________________________________________________
die Entry() funktion ist aber ein Objekt, das auf eine Eingabe wartet, bzw. in dem man einen input machen kann...
führe es (Das aus dem Hauptpost) mal aus, damit du weißt was ich meine..
Und aus dem bisherigen was ich aus der Documentary habe hat sich keine methode ergeben das Entry()-Fenster zu editieren ausser eben einen input durch die Tastatur... Aber wenn man das über die Tastatur eingeben kann und auch auslesen kann, dann müsste man doch auch etwas darin anzeigen lassen können.. oder nicht?
______________________________________________________________________________________________________________

Und was schreibe ich dann genau in main()? Weil das Programm hat ja viele funktionen... das Rechnen, das Öffnen des Fensters, etc... was genau schreibe ich in die main()? und wo definiere ich dann die ganzen Buttons?

warte.. hier ist der gesammte (bisherige) Code:

Code: Alles auswählen

from tkinter import *

result = 0

fenster = Tk()
fenster.title("Taschenrechner")
fenster.geometry("400x500")

def calculate_addition():
    pass
#    return a + b
    
def calculate_substraction():
    pass
#    return a - b

def calculate_multiplication():
    pass
#    return a * b

def calculate_division():
    pass
#    return a / b

def power_button():
    pass
#    return a ** b

def square_root():
    pass
#    return  x ** (.5)

def kopieren():
    clip = Tk()
    clip.withdraw()
    clip.clipboard_clear()
    clip.clipboard_append("INFO_TO_COPY")  #Change INFO_TO_COPY to the name of your data source --- Ich kenne die Methode nicht den Inhalt einer Funktion auszulesen...\n\
In diesem Fall wäre es die Funktion "Button(text="ZU KOPIERENDEN TEXT")"
    clip.destroy()

def test():
    result_button = Button(text="ZU KOPIERENDEN TEXT", command=kopieren)
    result_button.place(relx=0, rely=0, relwidth=1, relheight=0.1)

# Button definitionen
button_zero = Button(text="0", font=('Arial', '25', "bold"), command=test)
button_one = Button(text="1", font=('Arial', '25', "bold"))
button_two = Button(text="2", font=('Arial', '25', "bold"))
button_three = Button(text="3", font=('Arial', '25', "bold"))
button_four = Button(text="4", font=('Arial', '25', "bold"))
button_five = Button(text="5", font=('Arial', '25', "bold"))
button_six = Button(text="6", font=('Arial', '25', "bold"))
button_seven = Button(text="7", font=('Arial', '25', "bold"))
button_eight = Button(text="8", font=('Arial', '25', "bold"))
button_nine = Button(text="9", font=('Arial', '25', "bold"))
button_comma = Button(text=",", font=('Arial', '25', "bold"))
button_plus = Button(text="+", font=('Arial', '25', "bold"))
button_minus = Button(text="-", font=('Arial', '25', "bold"))
button_times = Button(text="x", font=('Arial', '25', "bold"))
button_division = Button(text="/", font=('Arial', '25', "bold"))
button_negative = Button(text="+/-", font=('Arial', '25', "bold"))
button_power = Button(text="^", font=('Arial', '25', "bold"))
button_squareroot = Button(text=u"\u221a", font=('Arial', '25', "bold"))
button_result = Button(text="=", font=('Arial', '25', "bold"))

result_screen = Entry(fenster, bd=10, width=500, font=("Arial", "24"))

result_screen.place(relx=0, rely=0, relwidth=1, relheight=0.1)

# Button placement
button_zero.place(relx=0.2505, rely=0.7005, relwidth=0.25, relheight=0.2)
button_one.place(relx=0.0005, rely=0.1, relwidth=0.25, relheight=0.2)
button_two.place(relx=0.2505, rely=0.1, relwidth=0.25, relheight=0.2)
button_three.place(relx=0.5005, rely=0.1, relwidth=0.25, relheight=0.2)
button_four.place(relx=0.0005, rely=0.3005, relwidth=0.25, relheight=0.2)
button_five.place(relx=0.2505, rely=0.3005, relwidth=0.25, relheight=0.2)
button_six.place(relx=0.5005, rely=0.3005, relwidth=0.25, relheight=0.2)
button_seven.place(relx=0.0005, rely=0.5005, relwidth=0.25, relheight=0.2)
button_eight.place(relx=0.2505, rely=0.5005, relwidth=0.25, relheight=0.2)
button_nine.place(relx=0.5005, rely=0.5005, relwidth=0.25, relheight=0.2)
button_comma.place(relx=0.5005, rely=0.7005, relwidth=0.25, relheight=0.2)
button_plus.place(relx=0.7505, rely=0.1, relwidth=0.25, relheight=0.2)
button_minus.place(relx=0.7505, rely=0.3005, relwidth=0.25, relheight=0.2)
button_times.place(relx=0.7505, rely=0.5005, relwidth=0.25, relheight=0.2)
button_division.place(relx=0.7505, rely=0.7005, relwidth=0.25, relheight=0.2)
button_negative.place(relx=0.0005, rely=0.7005, relwidth=0.25, relheight=0.2)
button_power.place(relx=0.0005, rely=0.9005, relwidth=0.25, relheight=0.1)
button_squareroot.place(relx=0.7505, rely=0.9005, relwidth=0.25, relheight=0.1)
button_result.place(relx=0.2505, rely=0.9005, relwidth=0.50, relheight=0.1)


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

@Mr. R341: Mit Modulebene ist der Code gemeint der ausgeführt wird wenn man das Modul importiert. Alles was nicht in einer Funktion oder Klasse steckt sollte nur Code sein der Konstanten, Funktionen, und Klassen definiert. Alles andere hat da nichts zu suchen.

Und auch das wird nicht reichen, Du wirst auch `functools.partial()` und objektorientierte Programmierung (OOP), also eigene Klassen, verstanden haben müssen und hier verwenden.

Es gibt nur `pack()` und `grid()`, vergiss `pack()`. Die Buttons kann man ganz wunderbar mit einem `grid()` anordnen.

Ich weiss was ein `Entry`-Objekt macht und ich weiss auch wie man den Inhalt ändert. Habe ich ja schon geschrieben: die entsprechende Methode zum einfügen von Text verwenden. Wenn Du die in der Dokumentation die Du verwendest nicht findest, such genauer oder nimm eine andere, wo das drin steht.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@Mr. R341: Die Modulebene ist quasi der Code, der nicht eingerückt ist. Dort gehören nur Importe; die Definition von Konstanten, Klassen, Funktionen; der Start der Main-Funktion hin.

Ein minimales Programm:

Code: Alles auswählen

def main():
    print("Hallo Welt)"

if __name__ == "__main__":
    main()
So umschiffst du auch gleich die Gefahr mit globalen Variablen zu arbeiten.

In main muss dann stehen, was auch immer dein Programm ist.


Zu den *-Importen:
Üblicherweise importiert man tkinter so:

Code: Alles auswählen

import tkinter as tk
Antworten