Canvas objekt lässt sich nicht mehr anzeigen

Fragen zu Tkinter.
Antworten
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Huhu mal wieder,
habe ein Problem mit Canvas.
Habe ein Programm geschreiben, dass auf eine EIngabe in ein Eingabefeld wartet, dann das Feld ausließt und das Hintergrundbild ändert. Funktioniert.
So, aber dann soll es auch noch neue Labels bzw Button anzeigen, die ich mit canvas.create_window hinzufüge. und die tauchen einfach nicht mehr auf. Also wenn ioch das Programm starte und die Eingabe auslese, sehe ich weder mein Label noch meien neuen Buttons.
Hier wäre der Code (gekürzt)

Code: Alles auswählen

from __future__ import absolute_import, division, print_function
import tkinter as tk
from tkinter import Button
from tkinter import messagebox
from tkinter import Entry
from tkinter import Label
from PIL import Image, ImageTk
from functools import partial
from itertools import cycle

#Label Defs
meme_def = "Memes entstehen aus Bildern, Videos, Blogs, Texten oder ganzen Webseiten,\ndie sich wie Lauffeuer über das Internet verbreiten. ... \nDiese Bilder, Wörter und Videos verbreiten sich rasend schnell viral im Netz – \nvor allem über soziale Netzwerke, aber auch über Webseiten wie 9GAG, reddit und Twitter."


#Vorab, sonst Bugs
fenster = tk.Tk()

def next_image(canvas, item_id, images):
    image = next(images)
    canvas.config(width=image.width(), height=image.height()) #Kann des weg? -Nö
    canvas.itemconfig(item_id, image=image)
    
fenster.geometry("1920x1080")
    
images = cycle(
    ImageTk.PhotoImage(Image.open(filename))
    for filename in ['Dudel_Glow_fertig.jpg', 'Dudel_klein_fertig.jpg']
)
    
canvas = tk.Canvas(fenster, highlightthickness=0)
canvas.pack()
background = canvas.create_image(0, 0, anchor=tk.NW)




#defs:
eingabefeld = Entry(fenster, bd=12, width=110)
eingabe = eingabefeld.get()
def Suchanfrage():  
    next_image(canvas, images, images)
    eingabe = eingabefeld.get()
    eingabefeld.destroy()
    Sucheingabe = Entry(fenster, bd=12, width=110)
    canvas.create_window(500, 70, window=Sucheingabe, anchor="nw")
    entry_button2 = Button(fenster, text="Suchen", command=Suchanfrage)
    canvas.create_window(550, 700, window=entry_button2)
    if "Test" in eingabe:
        messagebox.showinfo(message="Getestet! Alles funktioniert!")
    elif eingabe == "Test_Programm":
        import Test_Programm.py   
    elif "meme" in eingabe:
        meme_label = Label(fenster, text=meme_def)
        canvas.create_window(1000, 1000, window=meme_label)
        #Hier unten sind dann noch die ganzen Button und alten Canvas-Dinger, die sind aber egal...
So, hoffentlich hat jemand ne Lösung da, bitte meckert nicht nur rum dass es vllt schlampig und sinnfrei ist ^^
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: Das wird so nichts. Zudem geht das mit dem Hintergrundbild in Tk nicht wirklich. Das bedeutet nämlich, dass man alles auf dem Canvas und manuell, und mit absoluten Positionsangaben ausrichten muss. Und das will man nicht. Wirklich nicht.

Der Code sieht auch jetzt schon so aus das ihn niemand lesen möchte. Und dabei geht es nicht um ”Schönheit”, sondern das der nicht sauber strukturiert ist und man deshalb einfach nicht versteht was der machen soll, und dementsprechend auch Fehler nur schwer findet.

Es gibt Sachen da sieht man sofort das das Unsinn ist, wie:

Code: Alles auswählen

eingabefeld = Entry(fenster, bd=12, width=110)
eingabe = eingabefeld.get()
Zu dem Zeitpunkt hatte der Benutzer ja noch überhaupt gar keine Gelegenheit etwas in das Feld einzugeben, das heisst `eingabe` wird hier umständlich an die leere Zeichenkette gebunden.

Und in `Suchanfrage` wird erst das `eingabefeld` ausgelesen und dann zerstört, und danach eine Button erstellt der wieder `Suchanfrage` als Kommando hat. Wenn man den drückt, dann wird wieder `eingabefeld` ausgelesen, was aber offensichtlich nicht klappen kann, weil das beim vorherigen Aufruf ja zerstört wurde. Würde es klappen, dann würde *wieder* eine Schaltfläche erzeugt und an genau der gleichen Stelle über die vorhandene vom letzten Aufruf gelegt. So funktioniert das einfach nicht.

Ich würde dringend raten die GUI weg zu lassen und erst einmal die Programmiersprache zu lernen. Mindestens bis inklusive objektorientierter Programmierung. Denn das braucht man für die GUI-Programmierung.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Ich gebe zu, ich war etwas müde beim schreiben, da ist doch viel scheise entstanden...
Das bedeutet nämlich, dass man alles auf dem Canvas und manuell, und mit absoluten Positionsangaben ausrichten muss. Und das will man nicht. Wirklich nicht.
da ich nicht allzuviel habe was da später mal rein soll, will ich das sogesehen schon :)

Auch wenn der Code unsauber ist, es wird doch wohl einen bekanntes Problem geben, warum das object nicht mehr angezeigt wird?!?!
Ich möchte ja nur, dass später der Button wo anders wieder auftaucht, tut er aber nicht... Ich probiers mal anders, wie würde der Befehl aussehen mit dem ich mein cANVAS_WINDOW verschieben kann?

ps: Die hälfte des Codes stammt aus diesem Forum.
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: Wo Brüchstücke des Code herkommen ist egal — man kann auch mit qualitativ guten Zutaten ganz ungeniessbare Sachen zusammenrühren.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Phobit

Könntest du dein Projekt einmal genau beschreiben. Was muss das Skript genau machen. Dein Code ist sehr abstrakt und schwierig zu verstehen. Vielleicht könnte dies eine Beschreibung klären.

Gruss wuf ;-)
Take it easy Mates!
Antworten