Seite 1 von 1
Zwischenablage per Maus einfügen
Verfasst: Donnerstag 2. März 2017, 14:10
von ottto
Hallo,
ich würde gern den Inhalt der Zwischenablage per Maus in ein Entry-Widget einfügen.
Das Einfügen per [Str] + [V] funktioniert. Was ist nötig um diese Funktionalität per <Einfügen> aus dem Kontextmenü der RechtenMausTaste verfügbar zu machen? Hat jemand einen Tipp?
Danke.
Gruß.
ottto
Re: Zwischenablage per Maus einfügen
Verfasst: Donnerstag 2. März 2017, 14:50
von BlackJack
@ottto: Dazu müsstest Du Dir ein Kontextmenü mit den entsprechenden Menüpunkten basteln. Menüs kann man mit der `post()`-Methode im Fenster platzieren, also zum Beispiel dort wo der Benutzer geklickt hat. Dokumentation:
http://effbot.org/tkinterbook/menu.htm
Für die Zwischenablageschichten würde ich dann in den entsprechenden Handlern für die Menüpunkte einfach die Tastenkombinationen ”synthetisch” erzeugen (`event_generate()` auf dem betroffenen Widget).
Re: Zwischenablage per Maus einfügen
Verfasst: Donnerstag 9. März 2017, 16:05
von ottto
Vielen Dank für die Tipps! Funktioniert!
Code: Alles auswählen
import tkinter as tk
class VerzeichnisGUI:
def __init__(self, master):
self.master=master
master.title("+++ Fehler +++")
self.eingabe1=tk.Entry(master, bd=3, width=80)
self.eingabe1.grid(row=0,column=0)
self.eingabe1.bind("<ButtonPress-3>", self.event_rmt)
self.eingabe2=tk.Entry(master, bd=3, width=80)
self.eingabe2.grid(row=1,column=0)
self.eingabe2.bind("<ButtonPress-3>", self.event_rmt)
self.kontextmenu = tk.Menu(master)
self.menu_baustein = tk.Menu(self.kontextmenu)
self.menu_baustein.add_command(label="Einfügen", command=self.menu_einfuegen)
self.menu_baustein.add_command(label="Kopieren", command=self.menu_kopieren)
def event_rmt(self, event):
self.menu_baustein.post(self.eingabe1.winfo_rootx()+event.x, self.eingabe1.winfo_rooty()+event.y)
def menu_einfuegen(self):
self.eingabe1.event_generate("<<Paste>>")
def menu_kopieren(self):
self.eingabe1.event_generate("<<Copy>>")
def main():
root = tk.Tk()
mein_gui=VerzeichnisGUI(root)
root.mainloop()
if __name__ == '__main__':
main()
Aaaaaber:
Ich würde das Prog jetzt gern noch so umbauen, dass das Kontektmenü für mehrere Felder (eingabe1 und eingabe2) genutzt werden kann.
Kann man dazu dem event entlocken von welchem Widget es ausgelöst wurde? Also z.B. in Zeile 19 /22 /25 eingabe1 ersetzen durch event.widget.name??? Hat jemand einen Link, mit dem man sich die event -Attribute ansehen kann?
Danke.
Gruß.
ottto
Re: Zwischenablage per Maus einfügen
Verfasst: Donnerstag 9. März 2017, 16:16
von BlackJack
@ottto: In Zeile 19 sollte das möglich sein und in den anderen beiden Fällen eigentlich nicht nötig, zumindest dann nicht wenn man das Tastaturereignis nicht auf dem konkreten Widget erzeugt, sondern für das Fenster. Dann müsste das Widget dafür den Fokus haben. Ansonsten würde ich alles zusammen in eine Klasse kapseln die ein Kontextmenü für ein gegebenes Widgets erstellt, oder vielleicht auch gleich vom Widget ein Widget mit Menü ableiten.
Re: Zwischenablage per Maus einfügen
Verfasst: Donnerstag 9. März 2017, 16:41
von ottto
BlackJack hat geschrieben:@ottto: In Zeile 19 sollte das möglich sein ....
Hallo BlackJack,
wie meist Du das? Gibt es die Möglichkeit aus dem event den Namen des Widget zu ziehen?
Danke.
Gruß.
ottto
Re: Zwischenablage per Maus einfügen
Verfasst: Donnerstag 9. März 2017, 17:45
von BlackJack
@ottto: Was ist denn bitte in diesem Fall der Name des Widgets und was willst Du damit anfangen? Event-Objekte haben das Widget als Attribut.
Re: Zwischenablage per Maus einfügen
Verfasst: Freitag 10. März 2017, 08:22
von ottto
BlackJack hat geschrieben:@ Event-Objekte haben das Widget als Attribut.
Der Hinweis hat's gebracht....
Mit event.widget und einer zusätzlichen Variablen funktioniert es.
Vielen Dank.
Gruß.
ottto
Code: Alles auswählen
import tkinter as tk
class VerzeichnisGUI:
def __init__(self, master):
self.master=master
master.title("+++ Fehler +++")
self.eingabe1=tk.Entry(master, bd=3, width=80)
self.eingabe1.grid(row=0,column=0)
self.eingabe1.bind("<ButtonPress-3>", self.event_rmt)
self.eingabe2=tk.Entry(master, bd=3, width=80)
self.eingabe2.grid(row=1,column=0)
self.eingabe2.bind("<ButtonPress-3>", self.event_rmt)
self.kontextmenu = tk.Menu(master)
self.menu_baustein = tk.Menu(self.kontextmenu)
self.menu_baustein.add_command(label="Einfügen", command=self.menu_einfuegen)
self.menu_baustein.add_command(label="Kopieren", command=self.menu_kopieren)
def event_rmt(self, event):
self.event_name=event.widget
self.menu_baustein.post(self.event_name.winfo_rootx()+event.x, self.event_name.winfo_rooty()+event.y)
def menu_einfuegen(self):
self.event_name.event_generate("<<Paste>>")
def menu_kopieren(self):
self.event_name.event_generate("<<Copy>>")
def main():
root = tk.Tk()
mein_gui=VerzeichnisGUI(root)
root.mainloop()
if __name__ == '__main__':
main()
Re: Zwischenablage per Maus einfügen
Verfasst: Freitag 10. März 2017, 10:53
von BlackJack
@ottto: `event_name` ist ein doppelt falscher Name weil der Wert der daran gebunden wird weder ein Event noch ein Name ist, das ist das Widget.
Re: Zwischenablage per Maus einfügen
Verfasst: Freitag 10. März 2017, 13:22
von ottto
hab's geändert.
Vielen Dank für den Hinweis!
Gruß.
ottto