Nur Ein Bild anzeigen !

Fragen zu Tkinter.
villamarinella
User
Beiträge: 13
Registriert: Mittwoch 2. September 2015, 23:44

Hallo,
mit den Nerven am Ende.
Habe nach x Stunden einen C+P Code gefunden der funktioniert und ein simples Foto anzeigt.

Code: Alles auswählen

import Tkinter as tk
from PIL import ImageTk, Image

#This creates the main window of an application
window = tk.Tk()
window.title("Join")
window.geometry("640x480+100+100")
window.configure(background='grey')
    
path = "p11.jpg"
img = ImageTk.PhotoImage(Image.open(path))
panel = tk.Label(window, image = img1)
panel1 = tk.Label(window, image = img1)
panel.pack(side = "bottom", fill = "both", expand = "yes")
window.mainloop()
Jetzt geht es nur weiter wenn ich das Fenster mit der Maus schliesse.

Kann das nicht einfach mit einem Tastendruck beendet werden?

Dann könnte ich nämlich das nächste Bild aufrufen.
Das soll mal auf einem Touchscreen laufen Bild ansehen, Taste und nächste Bild kommt.

VM
Zuletzt geändert von Hyperion am Donnerstag 3. September 2015, 08:33, insgesamt 1-mal geändert.
Grund: Code in Python Code Tags gesetzt.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du musst das passende Tastatur-Event eben mit einem Callback verknüpfen, der dafür sorgt, dass der Bildbereich mit neuem Inhalt (d.h. neues Bild) gezeichnet wird. Es wäre schon schön, wenn du hierzu ein bißchen Eigenrecherche betreibst, anstatt jetzt möglicherweise fertigen Code von uns zu erwarten.

Wir verfolgen hier im Forum in aller Regel die Philosophie, dass sich der Fragesteller sein Wissen unter Zuhilfenahme von Antworten aus dem Forum selbst erarbeitet. Es geht weniger darum, "auf Kommando" kostenlos Programme zu schreiben, falls du das jetzt gedacht hattest.
villamarinella
User
Beiträge: 13
Registriert: Mittwoch 2. September 2015, 23:44

Ich bin von dieser Antwort mehr als enttäuscht.
Da cancelt mich jemand ab.
Wir im Ruhrgebiet würden sagen so ein Klugscheisser.

Wenn Du mein Posting aufmerksam gelesen hättest würdest Du erkannt haben dass ich nun wirklich mir alle Mühe gegeben habe ein Lösung zu finden. Und die bitte um evtl. 2 - 3. Programmzeilen wird mit so einem dummen Kommenatr belohnt, das ist nur auf einer deutschen Forumsseite möglich.

Ich bin 67 , habe min. 6 Stunden gesucht um das zu finden, und ja, ich kann hier nichts anderes als Copy und Paste. und wollte lediglich einen Tip. Und wenn Du noch weiter gelesen hättest, das war von min. 20 Versuchen daer einzige, der überhaupt ein Bild angezeigt hat, alles vorher so stolz propagierte hat bei mir eben nicht funktioniert. Und ich habe Standardkrempel an geräten bzw. OS hier.

Was übrigens in allen anderen Foren auf denen ich bin ohne Probleme und Belehrungen geht.

Na dann mal weiter so in diesem Stil, so macht man sich Freunde.

VillaMarinella
Benutzeravatar
sparrow
User
Beiträge: 4144
Registriert: Freitag 17. April 2009, 10:28

Das hier könnte dir helfen.

Wenn ich deine Posts richtig versehe geht es dir aber nicht darum die Programmiersprache zu lernen. Dann empfehle ich einen Bildbetrachter mit Dia-Show-Funktion. Die kann man in der Regel so einstellen, dass auf einen Mausklick hin das nächste Bild geladen wird.
villamarinella
User
Beiträge: 13
Registriert: Mittwoch 2. September 2015, 23:44

Ich kann sehr wohl Bilder betrachten wenn ich das möchte.

Und ich kann/konnte prima in Python, in C, in Pascal, in Assembler und in Clipper programmieren, und das seit dreissig Jahren!

Nur eben NULL Ahnung im Bereich Grafik.
Und um so frustierter sitze ich hier, habe u. a. eben einen raspi als router programmiert, Habe 4 Kameras an einem raspi die ( nur so zum Spass, versteht hier ohnehin keiner ) alle 10 Sekunden ein Foto machen, das per OCR ausgelesen wird und die Informationen in einer SQL Datenbank speichern. Ist Grundlage für industrielle Warenkontrolle!

Und nun soll nicht anders als so ein simples 640x480 Bild auf einem Touchscreen angezeigt werden.
Also, ein völlig unbemittelter Mensch drückt auf einen Touchscreen und sieht ein Bild. Dann drückt er nochmal und sieht das nächste Bild.
Das alles habe ich bis hierher ALLEINE unter Zuhilfenahme von Tutorials und MIT DER HILFE von Teilnehmern in anderen Foren prima geschafft. Und nun verzweifle ich an so einer simplen Sache und muss mir dann noch solche Dinge anhören.
Warum liest denn niemand mal genau was ich möchte
Ich will über die command Zeile ein Bild anzeigen.
Und das funktioniert ja auch prima!

Ich bitte lediglich darum das Programm mit einem Tastendruck zu beenden. Ist das zu viel verlangt?

Begeht da jemand Geheimnisverrat in diesen Code oben zwei Zeilen einzufügen.
Und ich gelobe, ich verspreche, ich schwöre, ich komme nie wieder hierher.

Villamarinella .
villamarinella
User
Beiträge: 13
Registriert: Mittwoch 2. September 2015, 23:44

Und ja,

ich habe auch das event und den Button längst gefunden und bin auch schon der Lage ein Fenster in bestimmetr Größe an einer bestimmten Stelle zu platzieren und mit Button zu beenden.
Insofern trifft Dein Pfeil mich nicht, sparrow!
Wärest Du schon Kapitän hättest Du mir bestimmt geholfen:-)
Nur eben die Kombination der beiden Scripte ist mir nicht gelungen.
Und ja, ich habe es probiert und dann nach gefühlten hundert Versuchen gelassen.

Wer mir mangelnde Geduld vorwirft hat noch nicht mit mir gearbeitet.

Nur ich kenne die anderen Sprachen und da gibt es Funktionen in Büchereien die so arbeiten:

zeigebild( hier, da und was )
inkey(0) warte auf Tastatur
end program


Wenn ich ja Zeit hätte, nur aus FRUST würde ich so lange üben bis ich eine solche Funktion fertig hätte.
Ich will aber nur raspi Fan werden und da sind ja ( zum Glück ) die Grafik Features stark eingeschränkt.

VillaMarinella
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@villamarinella: Hey, beruhige Dich! Denk an Dein Herz :!: :-)

Wenn jemand hier im Forum postet, dann setzen wir zunächst voraus, dass derjenige Interesse an Python hat - genau das hat snafu getan und ehrlich gesagt ist an der Antwort imho nichts böses oder abweisendes :K

Wenn Du lediglich fertigen Code suchst, dann solltest Du das entsprechend formulieren *und* dazu eben deutlich machen, dass Du kein Interesse an Python an sich hast.

Deine Reaktionen wirken ehrlich gesagt extrem überzogen! Speziell in Deinem Alter sollte man Dinge doch etwas ruhiger sehen, oder? Und wenn Du wirklich seit 30 Jahren in diversen Sprachen programmierst, dann weißt Du einfach auch, dass *Geduld* zu dieser Passion dazu gehört, gel ;-)

Also, bitte ein wenig runterfahren und dann auf ein neues, ok?

Hier gibt es durchaus viele User, die auch mal fertigen Code beisteuern; insbesondere wenn der Ton stimmt :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3552
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

villamarinella hat geschrieben:Ich bin von dieser Antwort mehr als enttäuscht.
Da cancelt mich jemand ab.
Wir im Ruhrgebiet würden sagen so ein Klugscheisser.
Das Kompliment können wir gerne zurückgeben.

Du hast dir offensichtlich keine Mühe gemacht die Antwort zu lesen und zu verstehen. Ich habe bisher in meinem ganzen Leben vielleicht insgesamt eine Stunde mit TK gearbeitet und das ist auch noch Jahre her, aber ich konnte mit der Hilfestellung von snafu innerhalb von 5 Minuten das gewünschte Verhalten erreichen.

Wenn du das Event längst gefunden hast, dann hast du sicher auch folgenden Code geschrieben.

Code: Alles auswählen

panel.bind("<Button-1>", callback)
Dann brauchtest du ja nur doch die callback Funktion definieren (ich bin jetzt mal davon ausgegangen, dass img2 analog zu img passend deklariert wurde):

Code: Alles auswählen

def callback(event):
    panel.configure(image=img2)
Woran hat es denn da gehapert?


Wenn du eine flexible Slideshow basierend auf den aktuellen Dateien im Verzeichnis haben möchtest, dann kommt natürlich noch etwas Code dazu, aber das ist dann eine andere Frage.
Zuletzt geändert von /me am Donnerstag 3. September 2015, 09:52, insgesamt 1-mal geändert.
BlackJack

@villamarinella: Es geht nicht um Geheimnisverrat sondern das die meisten hier ihre Freizeit nicht für Leute verwenden möchte die gar kein Python lernen wollen und kaum bis keine Eigenleistung zeigen.

Du zeigst ein Stück Quelltext das nach eigenen Angaben Copy und Paste ist, und aus einer Suche nach Beispielen entstanden ist statt das selbst programmiert und verstanden zu haben und sagst das ist das einzige von vielen Beispielen das funktioniert hat. Nun ja es funktioniert aber nicht einmal. Was man auch ziemlich leicht sehen kann, sogar ohne das man es ausführt. Und dazu muss man noch nicht einmal GUI-Programmierung in Python können, es reicht die absolute Grundlage das man weiss das ein Name definiert werden muss bevor man ihn verwenden kann. Du hast das also anscheinend weder durchgelesen noch ausgeführt, weil spätestens dann wäre Dir ja aufgefallen das es nicht funktioniert. Ich fühle mich da ein bisschen verarscht, ums mal deutlich zu sagen.

Sparrow hat ja schon Effbot's Tkinter-”Buch” velinkt. Die andere brauchbare Referenzdokumentation für Tkinter ist von der New Mexico Tech und da geht's mit Ereignissen hier los: Events: responding to stimuli.

Wenn das ein Touchscreen ist möchte man vielleicht auch einen ”Mausklick” auf das Label behandeln.

Das mit dem `inkey()` ist keine übliche GUI-Programmierung. Bei GUI-Rahmenwerken funktioniert die Programmierung nicht mehr so linear das man den kompletten Kontrollfluss die ganze Zeit selber in der Hand hat, sondern man setzt die GUI auf und registriert Rückruffunktionen/-methoden für bestimmte Ereignisse die einen interessieren und gibt dann die Kontrolle an die GUI-Hauptschleife ab. Wenn dann ein Ereignis auftritt für das man sich registriert hat, wird die entsprechende Funktion oder Methode von der GUI aufgerufen. Die tut dann *kurz* etwas, denn während sie läuft kann die GUI-Hauptschleife sich nicht mehr um die Aktualisierung der Anzeige und das Reagieren auf neue Ereignisse kümmern, und kehrt dann zur GUI-Hauptschleife zurück.

Da man in der Regel gemeinsamen Zustand zwischen diesen Rückrufen hat, kommt man bei GUI-Programmierung um objektorientierte Programmierung (OOP) nicht wirklich herum.

Wenn Du das auf dem Niveau mit einer `inkey()`-Funktion haben möchtest, dann schau Dir vielleicht mal Pygame statt Tkinter an. Das ist eher so wie man Grafikanwendungen auf DOS programmiert hat. Das würde ich dann auch wirklich als Grafikprogrammierung bezeichnen, denn Tkinter ist eher GUI-Programmierung, denn man hantiert dort nicht auf der Ebene von Zeichenprimitiven und Pixeln, sondern schon etwas abstrakter mit GUI-Elementen/Widgets.

Welche Grafik-Features sind denn beim Raspi stark eingeschränkt? Da läuft ein normaler X-Server und man hat einen ganz normalen Desktop in HD-Auflösung. Es gibt kein ”normales” OpenGL sondern nur die Embedded-Variante, aber das ist bei einer normalen Desktop-Anwendung mit Tkinter eigentlich ziemlich egal.
villamarinella
User
Beiträge: 13
Registriert: Mittwoch 2. September 2015, 23:44

Und schon reiht sich der Nächste ein mich zu belehren.

Wo ist der CODE?
https://www.youtube.com/watch?v=Ug75diEyiA0

VillaMarinella
Benutzeravatar
/me
User
Beiträge: 3552
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

villamarinella hat geschrieben:Ich bitte lediglich darum das Programm mit einem Tastendruck zu beenden. Ist das zu viel verlangt?
Nein, ist es nicht. Ursprünglich wolltest du aber doch ein Folgebild anzeigen, statt das Programm zu beenden.
villamarinella
User
Beiträge: 13
Registriert: Mittwoch 2. September 2015, 23:44

Stell Dir mal vor,

ich hätte es tatsächlich geschafft ein weiters Bild alleine aufzurufen. Mit dem gleichen Code.
Kann ich jetzt auch, nach Klick mit der Maus.

Was ist das hier?

Muss ich hier erst meine sittliche und moralische Qualität beweisen um eine Tip zu bekommen?

und nein, ICH WILL DAS ALLES NICHT LERNEN. Ich kann in Python zählen, kann beliebig viel Stringoperatinen aufrufen und auswerten und das reicht mir.

Naja, lassen wir es, werdet glücklich in Eurer heilen Welt........................
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@villamarinella: Ich habe beschrieben, wie es hier im Forum normalerweise läuft. Dass dir die Antwort nicht gefällt, ist die eine Sache. Aber dass du dich gleich persönlich angegriffen fühlst, wundert mich schon. So scharf formuliert fand ich meinen Beitrag jetzt nicht.

Und hier will dich sicherlich niemand abkanzeln. Meine Intention war es zumindest nicht. Wir helfen auch gerne Anfängern. Nur ein bißchen Eigenleistung sollte schon sein. Es steht dir ja durchaus frei, weitere Fragen zu stellen. Das ist im Grunde sogar erwünscht. Nur vielleicht mit ein bißchen weniger Mimimi.

Und vor allem ist es nicht gerade hilfreich, deinen Ärger wegen mir in eine allgemeine Patzigkeit zu verwandeln. Nichts für ungut.
Zuletzt geändert von snafu am Donnerstag 3. September 2015, 10:16, insgesamt 1-mal geändert.
villamarinella
User
Beiträge: 13
Registriert: Mittwoch 2. September 2015, 23:44

Und das was ich bisher geschafft habe ist KEINE Eigenleistung?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

villamarinella hat geschrieben:Und das was ich bisher geschafft habe ist KEINE Eigenleistung?
Hat irgendwer das Gegenteil behauptet? Deine beschriebenen 6 Stunden Recherche sind ja durchaus eine Eigenleistung. Nun wollen wir dich zur nächsten Eigenleistung ermuntern, was ja keinesfalls die vollständige Lösung der Aufgabe in Eigenregie sein muss.

Aber du hast ja schon geschrieben, dass du anscheinend an einer fertigen Lösung interessiert bist. Vielleicht hast du Glück und bekommst tatsächlich eine solche Lösung geliefert. Falls nicht, dann bist du nun wenigstens "vorgewarnt" und kannst dich ggf noch woanders umschauen.
Benutzeravatar
/me
User
Beiträge: 3552
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

villamarinella hat geschrieben:Muss ich hier erst meine sittliche und moralische Qualität beweisen um eine Tip zu bekommen?
Nein, aber ein zivilisiertes Auftreten wäre trotzdem nicht schlecht.

Du hast jetzt so viele Tipps bekommen, aber anscheinend war der richtige immer noch nicht dabei. Vielleicht liegt das auch daran, dass deine Fragestellung unklar war, ich zumindest werde nach deinen zusätzlichen Postings immer verwirrter. Was möchtest du denn jetzt genau erreichen? Soll nach einem Klick das nächste Bild angezeigt oder das Programm beendet werden?

Der Code für die Anzeige eines anderen Bildes wurde dir schon gezeigt und das eventgesteuerte Schließen mit window.destroy() wird ja wohl auch nicht das Problem sein. Was also genau möchtest du?
Benutzeravatar
sparrow
User
Beiträge: 4144
Registriert: Freitag 17. April 2009, 10:28

villamarinella hat geschrieben:und nein, ICH WILL DAS ALLES NICHT LERNEN.
Dann bist du hier schlicht falsch.
villamarinella
User
Beiträge: 13
Registriert: Mittwoch 2. September 2015, 23:44

Ich möchte NICHTS anderes als das was ich nun schon zum x-ten Male schreibe.

Ich möchte das o. g. Programm mit einem Tastendruck beenden.

Sonst nichts.


Statt mit einem Mausklick das TK Fenster zu schliessen sollte ein Tastendruck reichen.

Und NEIN, ich habe keinen Tip bekommen. Ich werde auf Seiten verwiesen in denen genau das alles steht was ich NICHT verstehe. Das ganze kommt mir vor wie jemand der nach der Uhrzeit fragt die Anwort bekommt; Für welche Zeitzone wollen Sie das wissen, in welcher Darstellungsart wollen Sie das wissen. Wollen Sie die Antwort jetzt oder später? Weil später sich ja die Zeit wieder geändert hat.

Eine Frage, hast Du mal diesen Code laufen lassen?
Und würdest Du Dir zutrauen das Programm mit einem Tastendruck enden zu lassen?
Offensichtlich nicht!
Sonst hättest Du es ja längst mal hier posten können.

Und NEIN, ich will nicht den gesamten Grundaufbau von Python lernen. Ich will ein Ergebns für meine Arbeit. Wie und woher ist mir völlig egal, solange es nicht geklaut ist. Und diese Bildanzeige ist 0,3% meines Projektes.
Zum Glück!!!!!!!!!
Ist das so verwerflich? Ich komme mir langsam vor wie jemand der was stehlen möchte und dabei erwischt wurde.

VM
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Code: Alles auswählen

import tkinter
import tkinter.messagebox
from tkinter import Frame, Tk


root = Tk()

def key(event):
    print("pressed", "Zeichen:", repr(event.char), "Beschreibung:", repr(event.keysym), "Codezahl:", repr(event.keycode))

def callback(event):
    frame.focus_set()
    print("clicked at", event.x, event.y)

def ende(frame):
    if tkinter.messagebox.askokcancel("Quit", "Do you really wish to quit?"):
        root.destroy()

frame = Frame(root, width=100, height=100)
frame.bind("<Key>", key)
frame.bind("0", ende)
frame.bind("<Button-1>", callback)
frame.pack()

root.mainloop()
Probier es damit......
Und wenn es stimmt das du seit 30 Jahren programmierst wirst aus diesem Code das wichtigste rausfiltern und es für deine Wünsche anpassen können
villamarinella
User
Beiträge: 13
Registriert: Mittwoch 2. September 2015, 23:44

Ok, ok, sorry, ich habe einen Fehler gemacht.
In dem Posting taucht ein zweites Bild auf, das ist aber Blödsinn.
Jaja, der path1 ist übrig von meinen Versuchen überhaupt was zu machen.
Reste von einem Tutorial der zwei Bilder abechselnd angezeigt hat. Diesen Code habe ich auch nicht ans Laufen bekommen, wie min. 6 andere auch nicht. Und immer mit der Fehlermeldung das irgendwas nicht korrekt definiert ist, also form not follws function.
Diese Zeile ist drin geblieben, ein Fehler von mir.

Dafür muss ich mich entschuldigen. Asche über mein Haupt:-)


VM
Antworten