python - 移动 tkinter 窗口
问题描述
我正在尝试通过删除其标题栏来创建一个窗口。当用户使用鼠标单击并拖动时,我使窗口移动。现在,如果我在任何小部件内单击并拖动,窗口就会移动。但我想让它只有在用户点击小部件外部时才移动。任何建议都会有所帮助。这是我的代码。
from tkinter import *
win = Tk()
win.geometry('200x200')
win.overrideredirect(True)
offsetx = 0
offsety = 0
lst = ['Sample 1', 'Sample 2', 'Sample 3', 'Sample 4']
def drag(event):
x = win.winfo_pointerx() - win.offsetx
y = win.winfo_pointery() - win.offsety
win.geometry('+{x}+{y}'.format(x=x,y=y))
def click(event):
win.offsetx = event.x
win.offsety = event.y
win.bind('<Button-1>', click)
win.bind('<B1-Motion>', drag)
lb1 = Listbox(win)
lb1.pack()
b1 = Button(win, text='Close', command=win.destroy).pack()
for i in range(len(lst)):
lb1.insert(i, lst[i])
win.mainloop()
解决方案
似乎最简单的事情就是在拖动功能中检查哪个窗口接收到事件,并且只有在它是根窗口时才进行拖动:
def drag(event):
if event.widget == win:
x = win.winfo_pointerx() - win.offsetx
y = win.winfo_pointery() - win.offsety
win.geometry('+{x}+{y}'.format(x=x,y=y))
或者,如果您希望能够在单击中间窗口时进行拖动,您可以检查小部件的类:
def drag(event):
window_class = event.widget.winfo_class()
if window_class in ("Tk", "Toplevel", "Frame"):
x = win.winfo_pointerx() - win.offsetx
y = win.winfo_pointery() - win.offsety
win.geometry('+{x}+{y}'.format(x=x,y=y))
推荐阅读
- javascript - 数组映射和过滤 ReactJs
- c# - 如何在 ASP.NET 中的特定时间运行代码
- javascript - 为什么不能使用 let 声明一个与一个函数参数同名的变量,即使参数 get 设置默认值?
- google-bigquery - 基于字段位置而非名称的 BigQuery 联合架构
- linux - 如何通过shell脚本在没有密码的情况下通过su切换服务器中的用户?
- elasticsearch - 将新字段添加到现有嵌套
- css - 如何在 Betheme Masonry 博客样式中设置和显示原始尺寸(未裁剪)的图像?
- c++ - Visual Studio 2017 不断向我的 Resource.h 添加 IDC_STATIC 导致编译警告
- gradle - 如何在 RAD websphere 中安装 gradle 插件?
- python - 就地替换完整的 Pandas DataFrame