Problem mit widget.bind("<Key-Return>", command)

Fragen zu Tkinter.
Antworten
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Hallo,

ich habe das Problem, dass bei drücken der Entertaste beim 1. mal auch ein "Enter" ausgeführt wird. Dadurch verschiebt sich der Cursor eine Zeile nach unten, wodurch sich dann beim nächsten Drücken der Enter-Taste eine Leerzeile im Output befindet. Wenn der Cursor sich dann in der 2. Zeile des Inputtextes befindet, verschiebt er sich aber nicht weiter nach unten. Wie kann ich das Problem lösen?

Code: Alles auswählen

import Tkinter as Tk
import ScrolledText

def write(event=None):
    text = input_text.get("@0,0", "end")
    output_text.insert("end", text)
    input_text.delete("@0,0", "end")
#--------------------------------------------------root----------------------------------------------------------
root = Tk.Tk()
root.wm_geometry("520x320")
root.resizable(0,0)
#-------------------------------------------------output---------------------------------------------------------
output_text_frame = Tk.Frame(root)
output_text_frame.pack(padx = 10, pady = 5)
output_text = ScrolledText.ScrolledText(output_text_frame, wrap = "word", width = 100, height = 14)
output_text.pack(padx = 10, pady = 5)
#-------------------------------------------------input----------------------------------------------------------
input_text_frame = Tk.Frame(root)
input_text_frame.pack(padx = 10, pady = 5)
send_button = Tk.Button(input_text_frame, text = "write", width = 7, height = 1, command = write)
send_button.pack(side = "right", padx = 10)
input_text = ScrolledText.ScrolledText(input_text_frame, wrap = "word", width = 80, height = 6)
input_text.bind("<Key-Return>", write)
input_text.pack(side = "left", padx = 10, pady = 5)

if __name__ == "__main__":
    root.mainloop()
P.S.: Das passt zwar nicht in den Thread aber bevor ich einen weiteren aufmache:

Gibt es eine Möglichkeit das Tk Logo in der Titelleiste verschwinden zu lassen?Beim durchlesen der Tkinter Reference habe ich zwar Möglichkeiten gefunden eigene .ico einzubinden, aber keine, dass kein Logo zu sehen ist. Hat da jemand eine Lösung?

Danke!
mfg

Thomas :-)
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Das Problem ist, daß das Event auslösende Widget wiederum vom Event manipuliert wird.
Da muß man immer etwas aufpassen. So sollte es wohl nach Deinen Vorstellungen laufen:

Code: Alles auswählen

import Tkinter as tk
import ScrolledText


def write(event=None):
  
    text = input_text.get(1.0, tk.END)
    output_text.config(state=tk.NORMAL)
    
    # kommt drauf an, wie man es haben will
    output_text.insert(tk.END, text.strip())
    output_text.insert(tk.END, "\n")
    
    output_text.see(tk.END)
    output_text.config(state=tk.DISABLED)
    input_text.after_idle(lambda : input_text.delete(1.0, tk.END))
    
    
root = tk.Tk()
root.wm_geometry("520x320")
root.resizable(0, 0)

output_text_frame = tk.Frame(root)
output_text_frame.pack(padx=10, pady=5)
output_text = ScrolledText.ScrolledText(output_text_frame, wrap="word",
                                        width=100, height=14)
output_text.pack(padx=10, pady=5)
output_text.config(state=tk.DISABLED)

input_text_frame = tk.Frame(root)
input_text_frame.pack(padx=10, pady=5)

send_button = tk.Button(input_text_frame, text="write", width=7, height=1, command=write)
send_button.pack(side="right", padx=10)

input_text = ScrolledText.ScrolledText(input_text_frame, wrap="word", width=80, height=6)
input_text.bind("<Key-Return>", write)
input_text.pack(side="left", padx=10, pady=5)


if __name__ == "__main__":
  
    root.mainloop()
Wie man das Icon komplett ausstellen kann, weiß ich auch nicht. Ein eigenes Icon sieht aber ja auch gleich viel professioneller aus. (Sonst einfach ein simples, einfarbiges Icon nehmen.)

:wink:
yipyip
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Hey,

ich hatte es dann mit win32api.keybd_event(0x08, 0, ) gelöst, was aber natürlich eine unsaubere Lösung war. Deine Lösung funktioniert und löst ab sofort meine Variante ab. :D

Danke.
mfg

Thomas :-)
Antworten