Tkinter: Maus-ziehen Sie ein Fenster, ohne Grenzen, zB. overridedirect(1)
Irgendwelche Vorschläge, wie könnte man das anlegen von event-Bindungen erlauben würde, dass ein Benutzer durch ziehen mit der Maus ein Fenster ohne Grenzen, zB. ein Fenster erstellt, mit overridedirect(1)
?
Anwendungsfall: Wir möchten zum erstellen einer unverankerten Symbolleiste/palette-Fenster (ohne Grenzen), dass unsere Benutzer können ziehen Sie, um auf Ihren desktop.
Hier, wo ich bin in meinem denken (pseudo-code):
-
window.bind( '<Button-1>', onMouseDown )
zum erfassen der anfänglichen position der Maus. -
window.bind( '<Motion-1>', onMouseMove )
zu verfolgen, die position der Maus, wenn es beginnt, sich zu bewegen. -
Berechnen, wie viel die Maus bewegt hat, und berechnen Sie
newX
,newY
Positionen. -
Verwenden
window.geometry( '+%d+%d' % ( newX, newY ) )
zu Fenster bewegen.
Tut Tkinter auszusetzen genug Funktionalität, um mir zu erlauben, Umsetzung der Aufgabe zur hand? Oder gibt es einfachere/höhere Ebene Möglichkeiten, das zu erreichen, was ich will zu tun?
- Das klingt genau das Gegenteil von dem, was Sie Fragen, in Ihrer vorherigen Frage, d.h. ein Fenster erstellen, das nicht verschoben werden kann oder angepasst wird. Wenn Sie wollen einfach nur ein Fenster, das können Sie nicht Größe, und befestigen Sie anschließend das Fenster " min-und max-Größe und damit der Benutzer das Fenster verschieben über die Titelleiste. Oder bin ich nicht verstehen, was Sie versuchen zu erreichen?
- Der Einsatz bei der letzten Frage war es, erstellen Sie ein angedocktes Fenster Wirkung, zB. wo ein Fenster angedockt war, um eine bestimmte position auf dem desktop des Benutzers. Tkinter stellt .minsize() und .maxsize() window-Methoden, aber es gibt keine gleichwertige Methoden für die Steuerung von Fenster x -, y-Positionen auf dem desktop. Sie sind richtig - die Frage oben ist fast das Gegenteil meiner früheren Frage. Der Unterschied ist der Anwendungsfall, wie zB. meine neue Frage ist, basierend auf die Notwendigkeit für die Nutzer zu ziehen kleine schwebende Symbolleiste ("palette") windows auf Ihren desktop ...
- ... Fortsetzung von oben: Diesen schwebenden Symbolleisten müssen nicht sein position eingeschränkt. Aus ästhetischen Gründen wollen wir diese schwebende Symbolleiste windows/Paletten werden windows-ohne-Grenzen " (wir fügen die Grenze Erscheinungen selbst). Danke für Eure Hilfe!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Tkinter stellt genug Funktionalität, um dies zu tun, und Nein, es gibt keine einfachere/höhere Ebene Wege zu erreichen, was Sie wollen zu tun. Sie ziemlich viel haben die richtige Idee.
hier ein Beispiel:
self.overrideredirect(True)
indef __init__(self):
. Ob es einen Unterschied macht, ich bin mit Python 3.4.Versuchen Sie dieses, und es sicher funktioniert;
Erstellen Sie eine Ereignis-Funktion, um Fenster verschieben:
def movewindow(event):
root.geometrie('+{0}+{1}'.format(event.x_root, event.y_root))
Binden-Fenster:
root.bind(", movewindow)
Können Sie jetzt berühren Sie das Fenster und ziehen Sie
Dieser code ist der gleiche wie Bryan ' s Lösung gibt es aber nicht verwenden overridedirect.
Getestet wurde es mit: - python-3.7 Debian GNU/Linux 10 (buster), Gnome 3.30
Die Idee von Loïc Faure-Lacroix ist nützlich, das folgende ist meine eigene einfache code-snippets Python ist3.7.3, hoffe es wird helfen:
Aber die position der Maus wird immer in der oberen linken Ecke des Fensters. Wie kann ich es behalten unverändert? Freuen sich auf eine bessere Antwort!
Dank Bryan Oakley, weil am Anfang konnte ich nicht ausführen von code auf meinem computer, die ich nicht zahlen Aufmerksamkeit auf Sie. Gerade jetzt nach der änderung, es war sehr gut zu laufen, und die oben beschriebene situation würde nicht passieren (die Maus ist immer in der linken oberen Ecke), um Den aktualisierten code vor kurzem wie folgt: