Seite 1 von 1

Scrollbar + Text Widget

Verfasst: Samstag 6. Dezember 2008, 20:29
von pysq
Hi,
zwei Fragen:

a) Gibt es eine Möglichkeit einen vertikalen Scrollbalken (Tkinter Scrollbar) ganz nach unten zu setzen?
b) Gibt es eine Möglichkeit, dass ein Benutzer nur ganz am Ende eines Tkinter Textwidget Text eingeben kann

mfg pysq

Re: Scrollbar + Text Widget

Verfasst: Samstag 6. Dezember 2008, 20:53
von numerix
pysq hat geschrieben:Hi,
zwei Fragen:

a) Gibt es eine Möglichkeit einen vertikalen Scrollbalken (Tkinter Scrollbar) ganz nach unten zu setzen?
b) Gibt es eine Möglichkeit, dass ein Benutzer nur ganz am Ende eines Tkinter Textwidget Text eingeben kann

mfg pysq
Damit ich es richtig verstehe: Der Scrollbalken an sich soll vermutlich rechts (oder links) sein, du möchtest aber, dass die Marke (Slider) ganz nach unten gezogen ist Richtig?

"Ganz am Ende" soll heißen: Es ist schon Text drin und nach dem der Text drin ist (z.B. aus einer Datei geladen), soll der Eingabe-Cursor ans Ende dieses Textes gesetzt werden. Richtig?

Re: Scrollbar + Text Widget

Verfasst: Samstag 6. Dezember 2008, 20:59
von pysq
ja exakt das ist mein Ziel!

Verfasst: Samstag 6. Dezember 2008, 21:14
von numerix

Code: Alles auswählen

import Tkinter as tk
from random import randrange

root = tk.Tk()
editor = tk.Text(root)
editor.pack(side=tk.LEFT,fill=tk.BOTH,expand=True)
scroll_y = tk.Scrollbar(root,command=editor.yview)
scroll_y.pack(side=tk.LEFT,fill=tk.Y)
editor.config(width=30,padx=5,pady=5,yscrollcommand=scroll_y.set)
for k in range(200):
    editor.insert("end",str(randrange(1000))*randrange(20)+"\n")
editor.see("end")
editor.focus_set()
root.mainloop()

Verfasst: Montag 8. Dezember 2008, 10:24
von pysq
ich will wie gesagt die Texteingabe nur am Ende des Textwidgets ermöglichen. Ich habe mittlerweile auch eine Idee, wie ich das realisieren könnte:
Eingabe über eine Tkinter StringVar kontrollieren, und mit deren trace Methode eine Funktion, die die Eingabe (also ob am Ende) kontrolliert, einbinden. Das Problem ist allerdings, das der Text in Tkinter.Text sich standardmäßig nicht über eine StringVar kontrollieren lässt. Gibt es eine Möglichkeit das zusammenzubasteln?

mfg pysq

Verfasst: Montag 8. Dezember 2008, 11:04
von numerix
ich will wie gesagt die Texteingabe nur am Ende des Textwidgets ermöglichen.
Ich dachte, ich hätte verstanden, was du meinst ...

Neuer Versuch: Mein Codeschnipsel unterscheidet sich in seiner Funktionalität von dem, was du willst, allein dadurch, dass du verhindern möchtest, dass an dem schon vorhandenen Text irgendetwas geändert wird, und nur noch Inhalte - am Ende - hinzugefügt werden können.
Oder soll das ganze Textfenster leer sein und man soll (nur) in die letzte Zeile schreiben können?

Vielleicht ist ein Text-Widget auch nicht der richtige Ansatz.
Beschreib doch mal, was du damit erreichen/realisieren willst.

Verfasst: Montag 8. Dezember 2008, 11:17
von pysq
kurzum, so eine Art Idle nachprogrammieren.
das einzige was mir noch fehlt ist, dass die Benutzereingaben nur am Ende stattfinden können, und der restliche text darf nicht mehr editierbar sein.
Ich habe mir die PyShell.py angeguckt, seh aber ehrlich gesagt an dieser Stelle nicht durch.

mfg

Verfasst: Montag 8. Dezember 2008, 15:36
von numerix
Dann wirst du entsprechende Tastatur- und auch Mausereignisse abfangen und wie gewünscht behandeln müssen.

Ein anderer Ansatz wäre dieser:

Code: Alles auswählen

import Tkinter as tk

def enter(event):
    shell.config(state=tk.NORMAL)
    shell.insert("end",inline.get()+"n")
    shell.config(state=tk.DISABLED)
    inline.delete("0","end")

root = tk.Tk()
shell = tk.Text(root,bd=0,highlightthickness=0,state=tk.DISABLED)
shell.pack(expand=True,fill=tk.BOTH)
inline = tk.Entry(root,bd=0,highlightthickness=0)
inline.pack(fill=tk.X)
inline.bind("<KeyRelease-Return>",enter)
inline.focus_set()
root.mainloop()
Wenn du dich damit begnügen könntest, wäre die Umsetzung um einiges einfacher, als wenn du alles in einem Text-Widget abfängst.

Verfasst: Montag 8. Dezember 2008, 17:36
von pysq
okay, ich werd mir daraus was basteln ^^