Seite 1 von 1

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

Verfasst: Montag 27. Dezember 2010, 15:45
von Python 47
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!

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

Verfasst: Mittwoch 29. Dezember 2010, 14:25
von yipyip
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

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

Verfasst: Mittwoch 29. Dezember 2010, 15:04
von Python 47
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.