Seite 1 von 1

Bild-Datei in einem Textfeld ersetzen

Verfasst: Samstag 6. März 2021, 16:23
von LifePool
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()

Re: Bild-Datei in einem Textfeld ersetzen

Verfasst: Samstag 27. März 2021, 23:47
von Sirius3
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()