Forum: PC-Programmierung Click-Callbacks in python / tkinter


von Rahul D. (rahul)


Lesenswert?

Moin,
ich habe hier ein interessantes Phänomen, das ich mir nicht erklären 
kann:
Ich will Einträge von einer Quelllistbox in eine Ziellistbox übertragen, 
indem ich den gewünschten Eintrag doppelt anklicke oder per Drag-n-Drop 
verschiebe - das soll gleichzeitig möglich sein.
Das funktioniert auch wunderbar in einem Test-Script.
Wenn ich die Funktionen nun in eine Klasse übertrage, und in einem 
Notebook-Tab verwende, wird nur das Einzel-Click-Event ausgeführt.
Wenn ich dessen Bind auskommentiere, funktioniert der Doppelklick.


Woran könnte das liegen?

Vielen Dank schon mal!
Rahul

: Bearbeitet durch User
von Oliver (imonbln)


Lesenswert?

Ich fürchte, bei der aktuellen Informationslage wirst du nur solche 
generischen Antworten bekommen wie: „Zeile 42 ist sicher falsch, auch 
ohne den Quelltext zu kennen.“

Um dir wirklich helfen zu können, solltest du uns ein paar weitere 
Parameter mitteilen. Schön wäre zum Beispiel zu wissen, unter welchem 
Betriebssystem du das Phänomen beobachtest.

Außerdem kann es hilfreich sein, deinen Sourcecode so weit zu 
reduzieren, bis das Problem nicht mehr auftritt. Ich empfehle dir, dein 
Projekt zu sichern und nach und nach alle Teile zu entfernen, die nichts 
mit dem Fenster zu tun haben, bis du ein kleines Programm hast, das dein 
Problem demonstrieren kann. Dieses Programm kannst du dann hier posten, 
so haben wir eine grobe Vorstellung davon, was du versuchst und können 
gezielter helfen.

Zudem kannst du überlegen, ob ein generisches Mikrocontroller-Forum 
wirklich die beste Anlaufstelle für Python-Probleme ist. Vielleicht ist 
deine Frage im python-forum.de besser aufgehoben.

Allerdings möchte man auch dort von dir ein minimal lauffähiges Programm 
sehen, das dein Problem demonstriert.

von Ein T. (ein_typ)


Lesenswert?

Rahul D. schrieb:
> Wenn ich die Funktionen nun in eine Klasse übertrage, und in einem
> Notebook-Tab verwende, wird nur das Einzel-Click-Event ausgeführt.
> Wenn ich dessen Bind auskommentiere, funktioniert der Doppelklick.

Mitunter hilft es, den Eventhandler mit after() aufzurufen. Vielleicht 
kannst Du ein minimales Beispiel einstellen, das Dein Problem zeigt?

von Ein T. (ein_typ)


Lesenswert?

Oliver schrieb:
> Zudem kannst du überlegen, ob ein generisches Mikrocontroller-Forum
> wirklich die beste Anlaufstelle für Python-Probleme ist. Vielleicht ist
> deine Frage im python-forum.de besser aufgehoben.

Meine Wahrnehmung ist, daß man hier schon ziemlich gute Hilfe für 
Probleme unter Python finden kann, mitunter hoffentlich sogar von mir.

Von dem Forum, das Du empfiehlst, kann ich im Übrigen nur abraten.

von Rahul D. (rahul)


Lesenswert?

Ein T. schrieb:
> Vielleicht
> kannst Du ein minimales Beispiel einstellen, das Dein Problem zeigt?

Schwierig / aufwendig, da da derzeit noch ein ganzer (notwendiger) 
Rattenschwanz dran hängt.

von Rahul D. (rahul)


Angehängte Dateien:

Lesenswert?

Ein T. schrieb:
> Vielleicht
> kannst Du ein minimales Beispiel einstellen, das Dein Problem zeigt?

Im Anhang.
Es wird auch beim Doppelclick immer der Eventhandler der linken 
Maustaste ausgeführt.

> Mitunter hilft es, den Eventhandler mit after() aufzurufen.
Wie meinst du das? Bzw. wie macht man das? ("after()" selbst ist mir ein 
Begriff).
Ich habe zwar Ahnung vom Programmieren semikolon- und klammerbehafteter 
Programmiersprachen, aber an python muss ich mich erst mal gewöhnen - 
bloß nicht die IDE / den Editor beim Entwickeln -wechseln... ;))
Das ist mein erstes umfangreicheres python-Projekt (mit viel GUI) seit 
langem.

Oliver schrieb:
> Schön wäre zum Beispiel zu wissen, unter welchem
> Betriebssystem du das Phänomen beobachtest.
Windows 10

von Ein T. (ein_typ)


Lesenswert?

Rahul D. schrieb:
> Ein T. schrieb:
>> Mitunter hilft es, den Eventhandler mit after() aufzurufen.
> Wie meinst du das? Bzw. wie macht man das? ("after()" selbst ist mir ein
> Begriff).

Versuch' bitte mal anstelle von Zeile 16 und 17 das Folgende:
1
self._makroListbox.bind("<Double-Button-1>", 
2
    self.after(100, self._onDoubleClick))
3
self._makroListbox.bind("<Button-1>", 
4
    self.after(100, self._onLeftClick))

Der Aufruf von .after() steckt die auszuführende Funktion / Methode in 
die Eventloop, anstatt sie direkt auszuführen.

Ist zumindest einen Versuch wert... :-) Tkinter funktioniert sehr gut, 
aber erstens würde ich heute eher auf Tix (oder eine andere alternative 
Variante) setzen, schon wegen der moderneren Optik, und zweitens sind 
Tkinter, Tix & Konsorten mitunter ein bisschen... sagen wir, 
eigenwillig. :-)

> Das ist mein erstes umfangreicheres python-Projekt (mit viel GUI) seit
> langem.

Tjaaa... mittlerweile mache ich nur noch ganz selten Python-Skripte mit 
GUI, sondern setze ich -- auch lokal -- eher auf Webtechnologien. :-)

von Rahul D. (rahul)


Lesenswert?

Ein T. schrieb:
> Tjaaa... mittlerweile mache ich nur noch ganz selten Python-Skripte mit
> GUI, sondern setze ich -- auch lokal -- eher auf Webtechnologien. :-)

Es gibt bei uns leider Mitarbeiter (Werk-Studenten / Praktikanten etc), 
die python toll finden.
Und wenn die die Firma verlassen, darf sich irgendwer um die 
Fortführunge derer "Projekte" kümmern.
Dokumentation wird natürlich auch überbewertet. "Das crazy" ;)

Ein T. schrieb:
> Versuch' bitte mal anstelle von Zeile 16 und 17 das Folgende:
> self._makroListbox.bind("<Double-Button-1>",
>     self.after(100, self._onDoubleClick))
> self._makroListbox.bind("<Button-1>",
>     self.after(100, self._onLeftClick))
>
> Der Aufruf von .after() steckt die auszuführende Funktion / Methode in
> die Eventloop, anstatt sie direkt auszuführen.

Probier ich mal.

: Bearbeitet durch User
von Rahul D. (rahul)


Lesenswert?

Rahul D. schrieb:
> Die Zeilen bewirken leider nur Fehlermeldungen:
> "TypeError: _onLeftClick() missing 1 required positional argument:
> 'event'"

OK, den habe ich selber behoben.
Der Links-Klick-Eventhandler wird jetzt aber nur ein einziges Mal 
ausgeführt.

: Bearbeitet durch User
von N. M. (mani)


Lesenswert?

Rahul D. schrieb:
> Es gibt bei uns leider Mitarbeiter (Werk-Studenten / Praktikanten etc),
> die python toll finden

Ein T. schrieb:
> Tjaaa... mittlerweile mache ich nur noch ganz selten Python-Skripte mit
> GUI, sondern setze ich -- auch lokal -- eher auf Webtechnologien. :-)

Geht ja beides. Für das Backend Python und für das Frontend HTML/JS/... 
im Browser.

Schau dir Mal Django/Flask/FastAPI an. Nutze ich auch wenn ich mit 
Python eine Oberfläche brauche.

von Rahul D. (rahul)


Lesenswert?

N. M. schrieb:
> Schau dir Mal Django/Flask/FastAPI an. Nutze ich auch wenn ich mit
> Python eine Oberfläche brauche.

Es geht nur um zwei Eventhandler, die sich gegenseitig "behindern".
Die GUI ist soweit fertig (und sieht halt etwas steril aus, was aber 
niemanden stört; Klicki-Bunti lenkt nur ab).

Beim nächsten Mal baue ich das auf C# und Avalonia um.
Das ist hier Standard (und wird von mehreren Kollegen unterstützt).

: Bearbeitet durch User
von Ein T. (ein_typ)


Lesenswert?

Rahul D. schrieb:
> Es gibt bei uns leider Mitarbeiter (Werk-Studenten / Praktikanten etc),
> die python toll finden.

Das liegt sicherlich daran, daß Python so toll ist. :-)

> Und wenn die die Firma verlassen, darf sich irgendwer um die
> Fortführunge derer "Projekte" kümmern.
> Dokumentation wird natürlich auch überbewertet. "Das crazy" ;)

Dieses Problem entsteht ja immer, wenn in einem Unternehmen etwas Neues 
eingeführt wird. Deswegen brauchen Unternehmen immer auch Strategien, 
damit umzugehen, oder sie bekommen Probleme. Oder sie führen nie wieder 
was Neues ein, aber auch das führt ja früher oder später zu Problemen.

von Rahul D. (rahul)


Lesenswert?

Ein T. schrieb:
> Das liegt sicherlich daran, daß Python so toll ist. :-)

Interpretersprachen sind toll? LOL YMMD...

von Ein T. (ein_typ)


Lesenswert?

Rahul D. schrieb:
> Ein T. schrieb:
>> Das liegt sicherlich daran, daß Python so toll ist. :-)
>
> Interpretersprachen sind toll? LOL YMMD...

Oha, da spricht ein echter "Fachmann". ;-)

von Rahul D. (rahul)


Lesenswert?

[OffTopic]
Ein T. schrieb:
> Oha, da spricht ein echter "Fachmann". ;-)

Wo ist das / dein Problem?
Um ein python-Script ohne IDE laufen zu lassen, braucht man den 
Interpreter, der das script übersetzt (wenn auch einmalig).
Will man es auf einer anderen Maschine verwenden, muss man das ganze 
Geraffel bzgl. Libs etc. mitschleppen oder nachträglich installieren.
Ja, dass man eine Exe mit pyInstaller erstellen kann, ist mir klar.
Das erledigen andere IDE und Programmiersprachen aber schon so.
[/OffTopic]

von Ein T. (ein_typ)


Lesenswert?

Rahul D. schrieb:
> [OffTopic]
> Ein T. schrieb:
>> Oha, da spricht ein echter "Fachmann". ;-)
>
> Wo ist das / dein Problem?

Daß Du ein Dummschwätzer bist.

> Um ein python-Script ohne IDE laufen zu lassen, braucht man den
> Interpreter, der das script übersetzt (wenn auch einmalig).

Um es mit IDE laufen zu lassen, braucht man sogar die IDE. Wow.

> Will man es auf einer anderen Maschine verwenden, muss man das ganze
> Geraffel bzgl. Libs etc. mitschleppen oder nachträglich installieren.
> Ja, dass man eine Exe mit pyInstaller erstellen kann, ist mir klar.
> Das erledigen andere IDE und Programmiersprachen aber schon so.

Die müssen dafür allerdings eine Libc, eine Libstd++ -- und beide bitte 
auch in halbwegs kompatiblen Versionen --, und allerlei anderes Zeugs 
haben. Dein "Argument" ist also, wie schon früher erkannt, nichts als 
Dummschwätzerei.

von Rahul D. (rahul)


Lesenswert?

Ein T. schrieb:
> Dein "Argument" ist also, wie schon früher erkannt, nichts als
> Dummschwätzerei.

Oh! Habe ich jetzt die Ehre eines python-Jüngers mit meiner auf 
Erfahrung basierenden Meinung verletzt?
Tut mir leid.
Du kannst bestimmt dein "Argument" "Dummschwätzerei" präzisieren, oder?

Danke, für deine Hilfe. Die war leider nicht zielführend.

von Ein T. (ein_typ)


Lesenswert?

Rahul D. schrieb:
> Ein T. schrieb:
>> Dein "Argument" ist also, wie schon früher erkannt, nichts als
>> Dummschwätzerei.
>
> Oh! Habe ich jetzt die Ehre eines python-Jüngers mit meiner auf
> Erfahrung basierenden Meinung verletzt?

Nein. Schließlich beherrsche ich nicht nur Python, sondern auch C, C++, 
Golang, Bash und noch ein paar andere Werkzeuge.

> Tut mir leid.
> Du kannst bestimmt dein "Argument" "Dummschwätzerei" präzisieren, oder?

Der große Unterschied zwischen Profi und Dummschwätzer ist: ich benutze 
für meine Aufgaben das jeweils passende Werkzeug und habe, um stets ein 
passendes zur Hand zu haben, deren mehrere im Portfolio.

Aber der allergrößte Dummschwatz ist IMHO Deine Schlußfolgerung:

Rahul D. schrieb:
> Beim nächsten Mal baue ich das auf C# und Avalonia um.

Dieses c# benötigt doch eine Laufzeitumgebung, die mehrere Gigabyte groß 
sein und zudem eine starke Abhängigkeit von einer bestimmten 
Betriebssystemfamilie haben soll. Und Du beschwerst Dich über einen 
Python-Interpreter, der winzig klein, auf der besagten 
Betriebssystemfamilie ratzfatz installiert, und dazu auch für die 
Entwicklung plattformunabhängiger Software geeignet ist?

von Rahul D. (rahul)


Lesenswert?

Ein T. schrieb:
> Dieses c# benötigt doch eine Laufzeitumgebung, die mehrere Gigabyte groß
> sein und zudem eine starke Abhängigkeit von einer bestimmten
> Betriebssystemfamilie haben soll. Und Du beschwerst Dich über einen
> Python-Interpreter, der winzig klein, auf der besagten
> Betriebssystemfamilie ratzfatz installiert,
Ich nehme meine C#-Exe und lass sie einfach auf einem Windows-System 
laufen.

> und dazu auch für die
> Entwicklung plattformunabhängiger Software geeignet ist?
Die Portabilität ist spätestens dann zuende, wenn man Funktionen 
benutzt, für die es keine Unterstützung unter dem Betriebssystem gibt 
(hatte ich gerade bei der python-Geschichte, weswegen ich "import 
platform" benutzen durte.

Ein T. schrieb:
> Nein. Schließlich beherrsche ich nicht nur Python, sondern auch C, C++,
> Golang, Bash und noch ein paar andere Werkzeuge.
Wichtigtuerei nicht vergessen!
Auf deine "Hilfe" kann ich echt verzichten. Die kann man auch gleich 
verreiben.
Tipp meinerseits: Sollte ich (den Ersteller sieht man ja in der 
Übersicht) noch mal einen Thread zum Thema python o. dergl. eröffnen, 
einfach überlesen und gar nicht erst darüber nachdenken, deine Hilfe 
anzubieten.

Danke, dass der Thread aufgrund deines Egos jetzt endgültig OT ist.
Schönes Restleben.

: Bearbeitet durch User
von Jens K. (jensky)


Lesenswert?

Rahul D. schrieb:
> Das funktioniert auch wunderbar in einem Test-Script.
> Wenn ich die Funktionen nun in eine Klasse übertrage, und in einem
> Notebook-Tab verwende, wird nur das Einzel-Click-Event ausgeführt.
> Wenn ich dessen Bind auskommentiere, funktioniert der Doppelklick.

wie wäre es, wenn du den Code posten würdest?

von Rahul D. (rahul)


Lesenswert?

Jens K. schrieb:
> wie wäre es, wenn du den Code posten würdest?
Nö. Das Thema ist für mich erledigt (mir ist einfach die Lust vergangen 
- vielleicht melde ich mich noch mal).
Die Doppel-Funktion war eh nur ein nettes Nice-To-Have.

von Ein T. (ein_typ)


Lesenswert?

Rahul D. schrieb:
> Windows-

Sic!

> Tipp meinerseits: Sollte ich (den Ersteller sieht man ja in der
> Übersicht) noch mal einen Thread zum Thema python o. dergl. eröffnen,
> einfach überlesen und gar nicht erst darüber nachdenken, deine Hilfe
> anzubieten.

War bereits um 10:58 entschieden, sei unbesorgt.

> Danke, dass der Thread aufgrund deines Egos jetzt endgültig OT ist.

Wessen Ego? Beitrag "Re: Click-Callbacks in python / tkinter"

> Schönes Restleben.

Danke, Dir auch.

von Rahul D. (rahul)


Lesenswert?

Ein T. schrieb:
> Wessen Ego?

Deins. Akzeptier doch einfach, dass es Menschen gibt, die machen Sachen 
nicht mögen, aber trotzdem damit arbeiten (müssen).

Ein T. schrieb:
> War bereits um 10:58 entschieden, sei unbesorgt.

Sieht nicht danach aus. Dein letzter Beitrag vor 11:00 Uhr war um 10:59 
- da hättest du ja auch einfach meinen Tipp vorhersehen können.

Eigentlich hätte ich gedacht, dass du mir schon nach unserer letzten 
"Begegnung" aus dem Weg gehen würdest. Hab ich mich getäuscht.

Was erwratest du eigentlich, wenn die jemanden als ""Fachmann"" 
(doppelte Anführungszeichen als Zitat-Markierung) oder "Dummschwätzer" 
bezeichnest? Dass man sich darüber freut?

Wenn du der Meinung bist, dass python toll ist, dann akzeptiere ich das. 
Ich muss es weder mögen, noch dir zustimmen.

: Bearbeitet durch User
von Sheeva P. (sheevaplug)


Lesenswert?

Rahul D. schrieb:
> Es wird auch beim Doppelclick immer der Eventhandler der linken
> Maustaste ausgeführt.

So steht es auch im feinen Manuel [1]. Kann man natürlich verhindern.

[1] 
https://dafarry.github.io/tkinterbook/tkinter-events-and-bindings.htm

von Rahul D. (rahul)


Lesenswert?

Sheeva P. schrieb:
> So steht es auch im feinen Manuel

Danke, aber ich wollte Manuel nicht unbedingt sezieren ;) (Nice typo)
Mir fehlte wohl der passende Suchbegriff.

von Rahul D. (rahul)


Lesenswert?

Sheeva P. schrieb:
> Kann man natürlich verhindern.
Nur wie? Das war ja auch die ursprüngliche Frage.

von Rahul D. (rahul)


Lesenswert?

Rahul D. schrieb:
> Sheeva P. schrieb:
>> Kann man natürlich verhindern.
> Nur wie? Das war ja auch die ursprüngliche Frage.

Ich antworte mir mal selber, da ich das Problem selber beheben konnte:
Bei einem Doppelklick wird das Einzelklick-Event und das Release-Event 
ausgelöst.1
Wenn das Release-Event in der Quelllistbox auftritt, wird es quasi 
ignoriert (die Kopieraktion wird nur durchgeführt, wenn sich der 
Mauszeiger in der Ziellistbox befindet).
Das Doppelklick-Event ist noch in der Event-Queue und wird (anschließen) 
abgearbeitet.
Ob das Problem jetzt nur bei python / tkinter auftritt, dürfte ziemlich 
irrelevant sein.

Danke für hilfreiche Beiträge.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.