Seite 1 von 1

Gliederung erstellen

Verfasst: Mittwoch 5. August 2009, 10:24
von Pascal
Hallo,

Ich brauche lediglich einen Ratschlag! So viel vorweg. In letzter Zeit bin ich ziemlich aktiv mit fragenstellen :roll:
Da ich am Freitag in den Urlaub fahre und dort kein Internet haben werde, allerdings meinen Laptop, wollt ich im Vorfeld lediglich um einen Ratschlag bitten.

Nun zum eigentlichen Thema:
ich würde gerne eine Gliederung erstellen.
Das ganze hätte ungefähr dieses Schema:

Überschrift

1.   Thema a
1.1  Unterthema

2. Thema b
2.1 Unterthema zu b
2.1.1 Ein weiteres Unterthema
2.2 Unterthema zu Thema b
2.3 Noch mehr zu Thema b

3. Und noch das letzte Thema
3.1 und.. fertig
(Die Einrückungen sollen natürlich gleich sein. )

Ich würde das ganze jetzt auf ein Canvas schreiben. (mit create_text)
Ich muss bzw. würde gerne die Events <Enter>, <Leave>, <Button-1> für jeden Text haben.


Nach meiner Meinung ist das der einfachste Weg.
Zumindest der einfachste, der mir bekannt ist.

Ich würde ganz gerne ein paar Ratschläge dazu lesen.
Vielleicht gibt es ja ein Modul, das das unterstützt, oder ...
Man weiß ja nie. Python hat mich schon oft genug mit neuen Möglichkeiten überrascht.

Pascal

Verfasst: Mittwoch 5. August 2009, 10:51
von numerix
Ich verstehe noch nicht so richtig, was das werden soll. :roll:

Verfasst: Mittwoch 5. August 2009, 12:00
von Pascal
numerix hat geschrieben:Ich verstehe noch nicht so richtig, was das werden soll. :roll:
Das ganze soll eine Gliederung innerhalb eines Programmes sein.
Das ganze ist ein bisschen so wie ein Menu, wo der Anwender sein Thema wählen kann.
Bei Klick auf Thema a soll der Anwender zu Thema a kommen (wahrscheinlich durch öffnen eines "Toplevel"-Fensters)

Ich versuche mal ein bisschen Quellcode zu liefern :wink:

Verfasst: Mittwoch 5. August 2009, 12:50
von numerix
Aha, verstanden.

Es gab mal einen Thread zu einer ähnlichen Sache - dabei ging es darum, in einem Textwidget Hyperlinks zu simulieren:
http://www.python-forum.de/topic-17371.html

Meine abschließende Lösung dazu - die sowohl mit Python 2.x als auch 3.x läuft - sah so aus:

Code: Alles auswählen

# -*- coding: iso-8859-15 -*-
# Hyperlinks im Textwidget

if __import__("sys").version_info[0] == 3:
    import tkinter as tk
else:
    import Tkinter as tk
from bisect import bisect

def handler(e):
    tagpositions = [str(pos) for pos in text.tag_ranges("link")]
    mouseposition = text.index(tk.CURRENT)
    index = bisect([tuple(map(int,pos.split("."))) for pos in tagpositions], tuple(map(int,mouseposition.split("."))))
    linkposition = tagpositions[index-1:index+1]
    if e.type == "7": # <Enter>
        text.config(cursor="hand1")
        text.tag_add("tmp", *linkposition)
        text.tag_config("tmp", underline=True)
    elif e.type == "8": # <Leave>
        text.config(cursor="")
        text.tag_delete("tmp")
    elif e.type == "4": # <Button-1>
        print(text.get(*linkposition))

root = tk.Tk()
text = tk.Text(root)
text.pack(padx=5, pady=5)
text.insert("0.0","Das ist ein Mustertext, man kann auf Klick drücken!")
text.config(bg="white", state="disabled")
text.tag_add("link","1.37","1.42")
text.tag_add("link","1.12","1.22")
text.tag_config("link",foreground="blue")
text.tag_bind("link","<Button-1>", handler)
text.tag_bind("link","<Enter>", handler)
text.tag_bind("link","<Leave>", handler)
root.mainloop()
Vielleicht kannst du das für deine Bedürfnisse anpassen.

Verfasst: Mittwoch 5. August 2009, 14:04
von Pascal
So ein Mist! Gerade als ich die ANtwort abschicken wollte, ich mein Com. abgestürtzt :evil:
Also tipp ich halt noch einmal:
An ein TextWidget hatte ich auch schon gedacht, allerdings war ich mir nicht schlüssig, wie ich einzelne Wörter an ein Event binden kann.
Ich werde mich mal in deinen Code einlesen und auch den Theard dazu mal lesen.

Hier ist mal der Ansatz, den ich mir gedacht hatte.

Code: Alles auswählen

import Tkinter as tk

class Menu:

    def __init__(self, canvas):
        
        self.canv = canvas
        self.position='1'

    def write_headline(self, titel):
        '''Ueberschrift schreiben'''
        self.canv.create_text(50, 50, text=self.position+'.'+titel, font=('Verdana', 13))

    def write_subheadline(self, titel):
        '''Unterpunkt schreiben'''
        self.canv.create_text(75, 80, text=self.position+'.1'+titel, font=('Verdana', 12))


if __name__ == '__main__':

    win = tk.Tk()
    canvas = tk.Canvas(win, width=400, height=400, bg='white')
    canvas.pack()

    test=Menu(canvas)
    test.write_headline('Thema a')
    test.write_subheadline('Unterpunkt')

    win.mainloop()
Allerdings wird das nur recht schwer umsetzbar sein, da es bei den Koordinaten zu viele Faktoren gibt.