我知道如何使用overrideredirect
从Tkinter窗口中删除边框,但每当我这样做时,窗口就会无法响应。我无法使用 alt 和拖动或任何其他方法移动它。
我想创建一个看起来像其中一个" riced"应用程序只是一个光秃秃的窗口,显然,如果它只是在左上角没有响应,我就无法走得太远。那么,我该怎么做呢?
答案 0 :(得分:8)
要使窗口可拖动,请在窗口上放置<Button-1>
(鼠标单击)和<B1-Motion>
(鼠标移动)的绑定。
您需要做的就是存储鼠标按下事件的x和y值,然后在鼠标移动事件期间,根据当前指针 x和y定位窗口,将原始值增加事件 x和y。
鼠标单击绑定的处理程序存储原始事件x和y。
鼠标移动绑定的处理程序调用TopLevel方法geometry()
以根据当前鼠标位置和最近鼠标单击存储的偏移量重新定位窗口。您为几何方法提供几何字符串。
这是一个非常小的例子,没有考虑到屏幕的边缘:
import tkinter
class Win(tkinter.Tk):
def __init__(self,master=None):
tkinter.Tk.__init__(self,master)
self.overrideredirect(True)
self._offsetx = 0
self._offsety = 0
self.bind('<Button-1>',self.clickwin)
self.bind('<B1-Motion>',self.dragwin)
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
self._offsety = event.y
win = Win()
win.mainloop()
答案 1 :(得分:0)
此解决方案适用于我:
from tkinter import *
import mouse
global x, y
def standard_bind():
root.bind('<B1-Motion>', lambda e: event(e, Mode=True))
def event(widget, Mode=False):
global x, y
if Mode:
x = widget.x
y = widget.y
root.bind('<B1-Motion>', lambda e: event(e))
root.geometry('+%d+%d' % (mouse.get_position()[0]-x, mouse.get_position()[1]-y))
root = Tk()
root.overrideredirect(True)
root.bind('<B1-Motion>', lambda e: event(e, Mode=True))
root.bind('<ButtonRelease-1>', lambda e: standard_bind())
root.geometry('%dx%d+%d+%d' % (600, 60, 50, 50))
mainloop()