Gliederung erstellen

Fragen zu Tkinter.
Antworten
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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

Ich verstehe noch nicht so richtig, was das werden soll. :roll:
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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

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.
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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.
Antworten