Zwischenablage per Maus einfügen

Fragen zu Tkinter.
Antworten
ottto
User
Beiträge: 15
Registriert: Donnerstag 9. Februar 2017, 16:36

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
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).
ottto
User
Beiträge: 15
Registriert: Donnerstag 9. Februar 2017, 16:36

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
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.
ottto
User
Beiträge: 15
Registriert: Donnerstag 9. Februar 2017, 16:36

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
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.
ottto
User
Beiträge: 15
Registriert: Donnerstag 9. Februar 2017, 16:36

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()


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.
ottto
User
Beiträge: 15
Registriert: Donnerstag 9. Februar 2017, 16:36

hab's geändert.
Vielen Dank für den Hinweis!
Gruß.
ottto
Antworten