python - 拖动时按钮强制鼠标进入窗口的左上角
问题描述
我已经设置了一个基本代码,可以制作一个可拖动的 overrideredirect tkinter 窗口,但是当我添加自己的自定义按钮时,窗口不会随按钮一起拖动,而是将鼠标轻弹到左上角并从那里拖动窗口。
#Imports
import sqlite3,tkinter
#Connects to the database
with sqlite3.connect("apc.db") as db:
cursor = db.cursor()
#Interface Class
class login_UI(tkinter.Tk):
#Main Interface Function
def __init__(self, master=None):
tkinter.Tk.__init__(self, master)
self.title("Apex Companion")
self.geometry()
self.geometry("250x400")
self.overrideredirect(True)
self.config(bg="#1e1e1e")
#Tob Bar Frame
tb = tkinter.Frame(self,height=20,width=250,bg="#0f0f0f")
tb.pack_propagate(False)
#Top Bar Text
tb_text = tkinter.Label(tb, text="Apex Companion",bg="#0f0f0f",fg="#b4b4b4")
tb_text.config(font=("Trebuchet",10, "bold"))
#Top Bar Close
tb_close = tkinter.Button(tb, height=2, width=3,
text="✕", bg="#0f0f0f", fg="#ffffff",
activebackground="#c94343",activeforeground="#ffffff",
command=self.destroy, bd=0)
#Top Bar Minimize
tb_min = tkinter.Button(tb, height=2, width=2,
text="—", bg="#0f0f0f",fg="#ffffff"
,bd=0,activeforeground="#ff4e1d",activebackground="#0f0f0f")
#Top Bar Logo
self.tb_img = tkinter.PhotoImage(file="logo_apc.gif")
tb_logo = tkinter.Label(tb,image=self.tb_img,bd=0,justify=tkinter.RIGHT)
#Top Bar Packing
tb.pack()
tb_close.pack(side=tkinter.RIGHT)
tb_min.pack(side=tkinter.RIGHT)
tb_logo.pack(side=tkinter.LEFT)
tb_text.pack()
#Make Window Draggable
self._offsetx = 200
self._offsety = 200
self.bind('<Button-1>', self.clickwin)
self.bind('<B1-Motion>', self.dragwin)
#Window Dragging Events
def dragwin(self,event):
x = self.winfo_pointerx() - self._offsetx
y = self.winfo_pointery() - self._offsety
self.geometry('+{x}+{y}'.format(x=x,y=y))
def clickwin(self,event):
self._offsetx = event.x_root
self._offsety = event.y_root
def login_db(self,event):
print("E")
#Initilize the Interface
login_UI = login_UI()
login_UI.mainloop()
我更新了代码以显示我的整个文件。希望这会有所帮助。
解决方案
当你点击按钮然后event.x
,event.y
给出相对于左上角的位置Button
,而不是窗口的左上角,所以稍后它会给出错误的结果。
这给出了正确的偏移量
def clickwin(self, event):
self._offsetx = self.winfo_pointerx() - self.winfo_rootx()
self._offsety = self.winfo_pointery() - self.winfo_rooty()
现在我什至可以通过拖动 Button 来移动,但稍后拖动按钮会出现其他问题 - 当我停止拖动时,按钮会单击并关闭窗口:)
完整代码
import tkinter
class Win(tkinter.Tk):
def __init__(self, master=None):
tkinter.Tk.__init__(self, master)
#self.geometry()
self.geometry("250x400")
self.overrideredirect(True)
self.config(bg="#1e1e1e")
#Tob Bar Frame
tb = tkinter.Frame(self, height=20, width=250, bg="#0f0f0f")
tb.pack_propagate(False)
tb.pack()
#Top Bar Close
tb_close = tkinter.Button(tb, height=2, width=3,
text="✕", bg="#0f0f0f", fg="#ffffff",
activebackground="#c94343",activeforeground="#ffffff",
command=self.destroy, bd=0)
tb_close.pack()
#Make Window Draggable
self._offsetx = 0
self._offsety = 0
self.bind('<B1-Motion>', self.dragwin)
self.bind('<Button-1>', self.clickwin)
#Window Dragging Events
def dragwin(self,event):
x = self.winfo_pointerx() - self._offsetx
y = self.winfo_pointery() - self._offsety
self.geometry('+{x}+{y}'.format(x=x,y=y))
def clickwin(self, event):
self._offsetx = self.winfo_pointerx() - self.winfo_rootx()
self._offsety = self.winfo_pointery() - self.winfo_rooty()
print('1.', event.x, event.y)
print('2.', event.x_root, event.y_root)
print('3.', self._offsetx, self._offsety)
root = Win()
root.mainloop()
推荐阅读
- excel - 如何在 Excel 中使用条件或 if 语句计算折扣?
- c - 编译器删除的配置变量
- java - 即使满足条件也不会抛出异常
- python - Python:如何比较大型一维数组?
- javascript - 在表格内隐藏几个 td
- python - 在给定起始均值和标准差的情况下,如何在 Python 中从相关矩阵中采样
- kotlin - kotlin.NotImplementedError: An operation is not implemented: not implemented AlertDialog
- python - Pandas - 将贴现因子数据框转换为债券等价面值收益率
- php - 通过 ssh 连接到 mysql db 时出错:“数据包乱序。得到:45 预期:0”
- three.js - Three.js 后处理:如何保持多遍的深度纹理?