Anfänger: Wenn ich Button X drücke soll Img Y zu sehen sein.

Fragen zu Tkinter.
Antworten
FabiSch
User
Beiträge: 3
Registriert: Dienstag 25. April 2023, 10:21

Schönen guten Tag an alle aus der Com,

ich versuche grade für mein GUI eine variable zu erschaffen. Ich möchte wenn z.B Button X betätigt wird das IMG X angezeigt wird. Das habe ich auch soweit mit:

def show_image():
image = ImageTk.PhotoImage(file='check-unsel-pressed.png')
imagebox.config(image=image)
imagebox.image = image

imagebox = tk.Label(mainWin)
imagebox.pack()
imagebox.place(x= 140, y= 700)

geschafft. Durch das drücken bleibt aber das Img Y auf dem Display bestehen. Ich möchte, aber das es wenn ich den Butto X nicht mehr drücke, das Image auch wieder verschwindet.
Eine andere möglichkeit wäre: Wenn gedrückt Img Y und wenn nicht gedrückt Img Z.

Bin grad erst ein paar Tage dabei und möchte dadurch z.B Anzeigen das durch eine Funktion z.B es wird gesprochen angezeigt wird das man "Live" ist.

Für eure Hilfe bin ich sehr dankbar.

Mit freundlichen Grüßen

FabiSch
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Da der Code nichts von einem Img Y enthält, läßt sich Deine Frage nicht beantworten.
Bitte posten den gesamten Code, der Dein Problem veranschaulicht. Am besten in Code-Tags, damit die Einrückungen auch erhalten bleiben.
FabiSch
User
Beiträge: 3
Registriert: Dienstag 25. April 2023, 10:21

]Hey, danke für die schnelle Antwort. In dem Fall ist Img Y = 'check-unsel-pressed-png' und sollte durch Img Y einfach nur veranschaulichen was ich meine. Dementsprechend ist es also:

Code: Alles auswählen

<
# Image Load
def show_image():
	image = ImageTk.PhotoImage(file='Img Y')
	imagebox.config(image=image)
	imagebox.image = image

# Button mit Event Anzeige
button1 = ttk.Button(mainWin, text='Konfiguration', style='Accent.TButton', command=show_image)
button1.place(x=850, y=680,w=100, h=40)

# Image Label
imagebox = tk.Label(mainWin)
imagebox.pack()
imagebox.place(x= 140, y= 700)
Mehr ist dazu im Code bei mir derzeit nicht drin da ich wie beschrieben die Variable suche.
FabiSch
User
Beiträge: 3
Registriert: Dienstag 25. April 2023, 10:21

Sirius3 hat geschrieben: Dienstag 25. April 2023, 10:48 Da der Code nichts von einem Img Y enthält, läßt sich Deine Frage nicht beantworten.
Bitte posten den gesamten Code, der Dein Problem veranschaulicht. Am besten in Code-Tags, damit die Einrückungen auch erhalten bleiben.

Code: Alles auswählen

is_on = True
def button_mode():
   global is_on

   # Determine it is on or off
   if is_on:
      button1.config(image=off)
      is_on = False
   else:
      button1.config(image=on)
      is_on = True
#Define our Images
on = PhotoImage(file="check-unsel-pressed.png")



off = PhotoImage(file="check-unsel-accent.png")


# Buttons Row 1

button1 = ttk.Checkbutton(mainWin, text='Anruf Bb', style='ToggleButton', command=button_mode)
button1.place(x=150, y=160,w=120, h=40)
Den switch zwischen den Images habe ich nun geschafft. Das Image ist nun aber im Button. Wie verschiebe ich die Position nun davon ? Wenn ich es als Label mache zusätzlich dann ist es auch vorhanden aber die Funktion ist immer noch auf dem Button.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@FabiSch: Das ist nicht der gesamte Quelltext. Das führt zu einem `NameError` weil mindestens mal die Importe fehlen. Und damit ``style="ToggleButton"`` funktioniert müsste sicher auch noch etwas passieren, denn zumindest bei mir ist das nicht im Standard-Theme enthalten.

``global`` ist keine Lösung, das ist ein Problem. GUI-Programmierung erfordert Klassen wenn man sich Zustand über Aufrufe hinweg merken muss.

Funktionen (und Methoden) werden üblicherweise nach der Tätigkeit benannt die sie durchführen, damit der Leser weis was die machen und um sie leicht von eher passiven Werten unterscheiden zu können. Der Name `button_mode` beschreibt keine Tätigkeit.

Bei `on` und `off` denkt man eher an einen Wahrheitswert oder einen Aufzählungstyp statt an Objekte die Bilder repräsentieren.

Man nummeriert keine Namen. Insbesondere wenn es sowieso nur eine 1 ist, die an diesen einen Namen angehängt ist, macht das ja nocht nicht einmal den Sinn für den Fall, dass man zu faul war sich sinnvolle Namen zu überlegen.

Man benutzt kein `place()`. Das funktioniert nur auf Systemen die genau so oder sehr ähnlich Deiner Bildschirmgrösse und -auflösung und den Einstellungen sind. Auf anderen Systemen kann das von unschön aussehen bis unbenutzbar gehen, wenn Anzeigeelemente oder deren Inhalte nicht passen und sich dann überlappen oder ausserhalb des sichtbaren Fensterbereichs liegen. Und selbst wenn das funktionieren würde, ist es unnötig aufwändig sich um die ganzen Positionen und Grössen selbst kümmern zu müssen, statt das `grid()` oder `pack()` zu überlassen.

So ganz schlau werde ich aus der Frage und dem Code immer noch nicht. Beschreibe doch mal die Problemstellung statt die vermeintliche Lösung.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten