copy und paste in textbox

Fragen zu Tkinter.
Antworten
coethen25
User
Beiträge: 13
Registriert: Freitag 5. August 2016, 13:21

Hallo, ich habe erst vor kurzem angefangen, in Python zu programmieren. Jetzt habe ich mir ein kleines Programm gebastelt, in welchem die Umlaute und einige andere Zeichen von normalem Text in HTML-Zeichen (ä ... usw.) oder in Unicode Dezimal umgewandelt werden. Die Eingabe und Ausgabe erfolgt in Textboxen. Komisch ist nur, dass ich in der Textbox nicht mit der rechten Maustaste kopieren und einfügen kann. Dazu muss ich Strg+C und Strg+V nehmen. Beim markieren des Textes ist es genau umgedreht: Das geht nur mit der Maus und nicht über Strg+A.
Woran könnte das liegen? :K
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Hallo coethen25, willkommen im Forum und bei Python!

Es hilft bei der Fehlersuche ungemein, wenn du uns den Code zeigst.

Am besten ist es, nicht den kompletten Code hier einzustellen, sondern nur ein möglichst kurzes aber lauffähiges Beispiel, das das gleiche Problem verursacht.

Möglicherweise fällt dir beim Reduzieren deines Codes schon etwas auf, das dich selbst zur Lösung führt. Das passiert zumindest oft so.

Viel Spaß noch beim Programmieren! :mrgreen:
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
coethen25
User
Beiträge: 13
Registriert: Freitag 5. August 2016, 13:21

Naja, da reicht eigentlich eine ganz einfache Textbox, um mein Problem darzustellen.

Code: Alles auswählen

#!/usr/bin/env python3.5

from tkinter import *

root = Tk()
root.title("Test")

f1 = Frame(root, bg="moccasin", bd="4", relief=GROOVE)
f1.pack()

tb = Text(f1, width=60, height=15, bg="white", fg="black", font="Helvetia 12")
tb.pack()

root.mainloop()
Führ das Programm aus und schreib oder kopier mal Text in die textbox und dann versuch mal über die rechte Maustaste zu kopieren bzw. mit der Tastatur über Strg+A alles zu markieren.
Mein Programm läuft ja super, aber eben copy und paste geht nicht über die rechte Maustaste und markieren nicht mit der Tastatur.
BlackJack

@coethen25: Tk ist halt Tk. Das stammt aus einer anderen Zeit als die GUI-Elemente die Du von anderen GUI-Rahmenwerken gewohnt bist. Strg+A bringt den Cursor an den Anfang und markiert nicht den Inhalt und ein Kontextmenü gibt es nicht.

Guckst Du hier: http://www.tcl.tk/man/tcl8.4/TkCmd/entry.htm#M63 unter Punkt [10] (Strg+A - Cursor an den Anfang) und [13] (Strg+/ - alles selektieren).
coethen25
User
Beiträge: 13
Registriert: Freitag 5. August 2016, 13:21

Danke, sieht wohl so aus, als ob ich damit leben muss :wink: und mit der Tastatur kopieren und einfügen muss. Halbsoschlimm!! :lol: :lol:
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Damit leben, naja. Wenn es dir wichtig ist, es gibt auch andere GUI-Frameworks neben TK, die etwas "mehr" Funktionalität anbieten.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
coethen25
User
Beiträge: 13
Registriert: Freitag 5. August 2016, 13:21

Danke für diesen Hinweis! Wie gesagt, ich habe erst vor kurzem mit Python begonnen. Dann werd ich mal schauen, was es noch so außer tkinter gibt.
Flano
User
Beiträge: 43
Registriert: Sonntag 5. September 2004, 14:13

Code: Alles auswählen

import tkinter as tk

def cut():
	tb.event_generate("<<Cut>>")
	return "break"
		
def copy():
	tb.event_generate("<<Copy>>")
	return "break"
		
def paste():
	tb.event_generate("<<Paste>>")
	return "break"
		
def popup(event):
	menu_edit.post(event.x_root, event.y_root) 

root = tk.Tk()
root.title("Test")

menubar = tk.Menu(root)
menu_edit = tk.Menu(menubar)

menu_edit.add_command(label='Cut', command=cut)
menu_edit.add_command(label='Copy', command=copy)
menu_edit.add_command(label='Paste', command=paste)

f1 = tk.Frame(root, bg="moccasin", bd="4", relief=tk.GROOVE)
f1.pack()
 
tb = tk.Text(f1, width=60, height=15, bg="white", fg="black", font="Helvetia 12")
tb.pack()

tb.bind("<Button-3>", popup)

root.mainloop()
So funktioniert "copy, cut, paste" bei mir, mit der rechten Maustaste. Bei Windows markiert <Strg+A> den ganzen Text, bei Linux bringt es den Cursor an den Anfang. Leider nicht einheitlich Plattformübergreifend.

Viele Grüße
Flano
Zuletzt geändert von Anonymous am Montag 8. August 2016, 19:58, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
coethen25
User
Beiträge: 13
Registriert: Freitag 5. August 2016, 13:21

@Fiano Danke Dir, so klappt es wunderbar! Nur muss ich aufpassen, weil ich ja zwei Textboxen habe (Eingabe u. Ausgabe), dass ich für die Eingabebox (eg) nur die paste-funktion benutze und für die Ausgabe(ag) nur die copy-funktion. Packe ich beide Funktionen in beide Boxen, wird auch, wenn ich den Text in die Eingabe einfüge, der Text in die Ausgabe eingefügt.

Code: Alles auswählen

def cut():
    eg.event_generate("<<Cut>>")
    ag.event_generate("<<Cut>>")
    return "break"
       
def copy(): 
    ag.event_generate("<<Copy>>")
    return "break"
       
def paste():
    eg.event_generate("<<Paste>>")
    return "break"
 
Die Funktion cut habe ich in beide Boxen geschrieben.Das ist ganz gut so. Nochmals Danke!
Zuletzt geändert von Anonymous am Dienstag 9. August 2016, 10:59, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@coethen25: Es wäre wohl eher sinnvoll die Funktionen zu parametrisieren und das jeweilige `Text`-Exemplar als Argument zu übergeben. Also am ehesten eine eigene Klasse von `Text` abzuleiten. Das alles als ”Funktionen” auf Modulebene zu haben und auf globalen Variablen zu operieren ist sowieso total unsauber. Zu GUI-Programmierung gehört in Python objektorientierte Programmierung (OOP).
coethen25
User
Beiträge: 13
Registriert: Freitag 5. August 2016, 13:21

@BlackJack Deine Anregungen helfen mir echt weiter beim Python lernen! Habs jetzt geschafft, wie gesagt als totaler Anfänger, das ganze Konstrukt in eine Klasse zu schreiben, so dass es auch funktioniert. Eigene Klassen von den Textboxen zu schreiben, wird wohl nun mein nächstes Ziel sein.
Antworten