Bild-Datei in einem Textfeld ersetzen

Fragen zu Tkinter.
Antworten
LifePool
User
Beiträge: 1
Registriert: Samstag 6. März 2021, 16:15

Ich muss für die Schule ein Programm schreiben mit dem man Würfeln kann.
Die Würfel sollen als Bild angezeigt werden sobald man den Button zum Würfeln drückt. Allerdings kann ich die Bilder nicht in das Textfeld einsetzen bzw. ersetzen mit dem Buttonclick.

Code: Alles auswählen

from tkinter import *
import random as r

hauptfenster = Tk()
hauptfenster.geometry("100x100")

def werfen():
    Zahl1 = r.randint(0,5)
    Zahl2 = r.randint(0,5)
    liste = ["./w1.png","./w2.png","./w3.png","./w4.png","./w5.png","./w6.png"]
    würfel1=PhotoImage(file=liste[Zahl1])
    würfel2=PhotoImage(file=liste[Zahl2])
    textfeld1.image_create(END, image=würfel1)
    textfeld2.image_create(END, image=würfel2)

textfeld1 = Text(hauptfenster, height=2, width=4, bg = "lightgrey")
textfeld1.place(x=20, y=10)

textfeld2 = Text(hauptfenster, height=2, width=4, bg = "lightgrey")
textfeld2.place(x=68, y=10)

button1 = Button(hauptfenster, text="Würfeln",command = werfen)
button1.place(x=5, y=70)

button1 = Button(hauptfenster, text="Beenden",command = quit)
button1.place(x=61, y=70)

hauptfenster.mainloop()
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Man benutzt keine *-Importe und kürzt random auch nicht mit r ab. Das vermindert alles nur die Lesbarkeit.
Statt randint würde man hier auch choice benutzen um einen Wert aus einer Liste auszuwählen.
Man benutzt keine globalen Variablen, denn alles, was eine Funktion braucht, muß sie über ihre Argumente bekommen.
Man benutzt kein place, weil das je nach System zu unbrauchbaren GUIs führt.
Und das eigentliche Problem ist, dass man sich immer eine Referenz auf das PhotoImage-Objekt merken muss, am besten, indem man die Bilder im Hauptprogramm einmal lädt.

Code: Alles auswählen

import tkinter as tk
import random
from functools import partial

def werfen(wuerfel, textfeld1, textfeld2):
    wuerfel1 = random.choice(wuerfel)
    wuerfel2 = random.choice(wuerfel)
    textfeld1.image_create(tk.END, image=wuerfel1)
    textfeld2.image_create(tk.END, image=wuerfel2)

def main():
    hauptfenster = tk.Tk()
    textfeld1 = tk.Text(hauptfenster, height=2, width=4, bg="lightgrey")
    textfeld1.grid(row=0, column=0)
    textfeld2 = tk.Text(hauptfenster, height=2, width=4, bg="lightgrey")
    textfeld2.grid(row=0, column=1)
    wuerfel = [
        tk.PhotoImage(file=f"w{i}.png")
        for i in range(1,7)
    ]
    tk.Button(hauptfenster, text="Würfeln", command=partial(werfen, wuerfel, textfeld1, textfeld2).grid(row=1, column=0)
    tk.Button(hauptfenster, text="Beenden", command=hauptfenster.quit).grid(row=1, column=1)
    hauptfenster.mainloop()

if __name__ == "__main__":
    main()
Antworten