gpt4 book ai didi

python - Tkinter:鼠标拖动一个没有边框的窗口,例如。覆盖直接(1)

转载 作者:可可西里 更新时间:2023-11-01 14:41:02 48 4
gpt4 key购买 nike

关于如何创建允许用户用鼠标拖动无边框窗口的事件绑定(bind)的任何建议,例如。用 overridedirect(1) 创建的窗口?

用例:我们想创建一个 float 的工具栏/调色板窗口(无边框),我们的用户可以在他们的桌面上拖动它。

这是我的想法(伪代码):

  1. window.bind( '<Button-1>', onMouseDown )捕捉鼠标的初始位置。

  2. window.bind( '<Motion-1>', onMouseMove )在鼠标开始移动时跟踪鼠标的位置。

  3. 计算鼠标移动了多少并计算newX , newY职位。

  4. 使用 window.geometry( '+%d+%d' % ( newX, newY ) )移动窗口。

Tkinter 是否公开了足够的功能来让我实现手头的任务?或者是否有更简单/更高级别的方法来实现我想做的事情?

最佳答案

是的,Tkinter 公开了足够的功能来执行此操作,不,没有更简单/更高级别的方法来实现您想要做的事情。您的想法几乎是正确的。

这是一个例子,虽然这不是唯一的方法:

import tkinter as tk

class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.floater = FloatingWindow(self)

class FloatingWindow(tk.Toplevel):
def __init__(self, *args, **kwargs):
tk.Toplevel.__init__(self, *args, **kwargs)
self.overrideredirect(True)

self.label = tk.Label(self, text="Click on the grip to move")
self.grip = tk.Label(self, bitmap="gray25")
self.grip.pack(side="left", fill="y")
self.label.pack(side="right", fill="both", expand=True)

self.grip.bind("<ButtonPress-1>", self.start_move)
self.grip.bind("<ButtonRelease-1>", self.stop_move)
self.grip.bind("<B1-Motion>", self.do_move)

def start_move(self, event):
self.x = event.x
self.y = event.y

def stop_move(self, event):
self.x = None
self.y = None

def do_move(self, event):
deltax = event.x - self.x
deltay = event.y - self.y
x = self.winfo_x() + deltax
y = self.winfo_y() + deltay
self.geometry(f"+{x}+{y}")

app=App()
app.mainloop()

关于python - Tkinter:鼠标拖动一个没有边框的窗口,例如。覆盖直接(1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4055267/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com