PanedWindow und Sash

Fragen zu Tkinter.
Antworten
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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?
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@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.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@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
BlackJack

@Alfons Mittelmeyer: Die Tk-Dokumantation sagt 'sash' und 'handle': http://www.tcl.tk/man/tcl8.4/TkCmd/panedwindow.htm#M22
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@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?
Antworten