Scrollbar + Text Widget

Fragen zu Tkinter.
Benutzeravatar
pysq
User
Beiträge: 31
Registriert: Samstag 29. November 2008, 17:48

Scrollbar + Text Widget

Beitragvon pysq » Samstag 6. Dezember 2008, 20:29

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Re: Scrollbar + Text Widget

Beitragvon numerix » Samstag 6. Dezember 2008, 20:53

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?
Benutzeravatar
pysq
User
Beiträge: 31
Registriert: Samstag 29. November 2008, 17:48

Re: Scrollbar + Text Widget

Beitragvon pysq » Samstag 6. Dezember 2008, 20:59

ja exakt das ist mein Ziel!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Samstag 6. Dezember 2008, 21:14

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()
Benutzeravatar
pysq
User
Beiträge: 31
Registriert: Samstag 29. November 2008, 17:48

Beitragvon pysq » Montag 8. Dezember 2008, 10:24

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Montag 8. Dezember 2008, 11:04

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.
Benutzeravatar
pysq
User
Beiträge: 31
Registriert: Samstag 29. November 2008, 17:48

Beitragvon pysq » Montag 8. Dezember 2008, 11:17

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Montag 8. Dezember 2008, 15:36

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.
Benutzeravatar
pysq
User
Beiträge: 31
Registriert: Samstag 29. November 2008, 17:48

Beitragvon pysq » Montag 8. Dezember 2008, 17:36

okay, ich werd mir daraus was basteln ^^

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder