Seite 1 von 1

PanedWindow und Sash

Verfasst: Donnerstag 24. September 2015, 16:19
von Alfons Mittelmeyer
Bei mehr als einem Pane hat man einen Sash - bei noch mehr Panes mehrere. Den kann man mit der Maus ziehen.

Würde beim GUI Designer mit der Maus ziehen reichen? Das geht ja sowieso. Oder braucht man auch pixelgenaue Eingaben?
Dann müsste ich dafür etwas implementieren, etwa eine Liste mit x,y Koordinaten, die sich bei Sash Bewegung aktualisiert.
Bzw. dass die Position der Sashes sich nach der Eingabe verändert.

Braucht man das?

Re: PanedWindow und Sash

Verfasst: Donnerstag 24. September 2015, 19:51
von Alfons Mittelmeyer
Eine Frage: wie binde ich ein Maus Event an einen PanedWindow Sash. Ich hätte gerne so etwas wie <B1-Motion>. Wenn der Sash bewegt wird, möchte ich die Koordinaten wissen.

Re: PanedWindow und Sash

Verfasst: Freitag 25. September 2015, 00:27
von wuf
Hi Alfons

Kannst du das folgende Snippet einmal anschauen?:

Code: Alles auswählen

#!/usr/bin/env python
# coding: UTF-8

import os
try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk

def paned_win_event(event):
    widget = event.widget
    xpos = event.x
    ypos = event.y
    
    identify_data = event.widget.identify(xpos, ypos)
    try:
        index = identify_data[0]
        tag = identify_data[1]
    except IndexError:
        return
        
    print("Tag:{}, Index:{}, Coords:{}".format(
        tag, index, widget.sash_coord(index)))
    
app_win = tk.Tk()
app_win.title("PanedWindow")
app_win.geometry('300x200+100+100')

panes = tk.PanedWindow(app_win, orient='horizontal', showhandle=1, handlepad=1,
        handlesize=8, sashwidth=2, opaqueresize=1, sashrelief='sunken')
panes.pack(fill="both", expand="yes")
panes.bind('<Button1-Motion>', paned_win_event)

left = tk.Label(panes, text="Left Pane")
left.pack()

center = tk.Label(panes, text="Center Pane")
center.pack()

right = tk.Label(panes, text="Right Pane")
right.pack()

panes.add(left)
panes.add(center)
panes.add(right)

app_win.mainloop()
Gruss wuf :wink:

Re: PanedWindow und Sash

Verfasst: Freitag 25. September 2015, 12:44
von Alfons Mittelmeyer
@wuf Danke, das ist eine saubere Lösung, die haargenau passt. Wollte es gestern abend noch mit after und Sashlistenvergleich machen, aber das wäre aufwändig geworden. Und so ist es dann einfach.

Re: PanedWindow und Sash

Verfasst: Freitag 25. September 2015, 13:25
von Alfons Mittelmeyer
@wuf Ist irgendwo spezifiziert, welche Werte identify zurückliefert für verschiedene Objekte? Hab mal hier einfach 'sash' eingefügt:

Code: Alles auswählen

    def paned_win_event(event):
        widget = event.widget
        xpos = event.x
        ypos = event.y

        identify_data = event.widget.identify(xpos, ypos)
        try:
            index = identify_data[0]
            tag = identify_data[1]
            if tag != 'sash': return
        except IndexError:
            return
Kann aber in dieser Doku nur finden:
identify(x, y) [#]

Identifies the widget element at the given position.
Quelle: http://effbot.org/tkinterbook/panedwind ... ify-method

Re: PanedWindow und Sash

Verfasst: Freitag 25. September 2015, 13:47
von BlackJack
@Alfons Mittelmeyer: Die Tk-Dokumantation sagt 'sash' und 'handle': http://www.tcl.tk/man/tcl8.4/TkCmd/panedwindow.htm#M22

Re: PanedWindow und Sash

Verfasst: Freitag 25. September 2015, 16:16
von Alfons Mittelmeyer
@BlackJack Danke, jetzt muss und kann ich diese Zeile wieder entfernen:

Code: Alles auswählen

if tag != 'sash': return
Denn wenn man am Handle zieht, bekomme ich dann kein Sash Koordinaten Update.

Dann muss ich noch die Save Routine dafür machen und dabei die Reihenfolge der add Kommandos berücksichtigen. before und after habe ich allerdings nicht realisiert, die Reihenfolge kann man ja mit remove und add ändern.

Ach so, was ist mit diesem proxy?. Ist das interessant für das Layout oder nur für die Programmierung?