Python 围绕鼠标拖动Pyglet绘制矩形
我正在尝试创建一个围绕鼠标拖动形成的正方形(例如,在桌面上拖动时出现的正方形)。这是我尝试过的代码:Python 围绕鼠标拖动Pyglet绘制矩形,python,python-2.7,opengl,pyglet,Python,Python 2.7,Opengl,Pyglet,我正在尝试创建一个围绕鼠标拖动形成的正方形(例如,在桌面上拖动时出现的正方形)。这是我尝试过的代码: import pyglet from pyglet.window import mouse window = pyglet.window.Window() @window.event def on_draw(): window.clear() @window.event def on_mouse_drag(x, y, dx, dy, buttons, modifiers):
import pyglet
from pyglet.window import mouse
window = pyglet.window.Window()
@window.event
def on_draw():
window.clear()
@window.event
def on_mouse_drag(x, y, dx, dy, buttons, modifiers):
pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2f', [x, y, dx, y, dx, dy, x, dy]))
pyglet.app.run()
然而,它不起作用,我不明白为什么。有什么建议吗?既然没有答案,我就是这样解决问题的:
import pyglet
from pyglet.window import mouse
window = pyglet.window.Window()
@window.event
def on_draw():
pass
@window.event
def on_mouse_drag(x, y, dx, dy, buttons, modifiers):
pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2f', [x, y, x-dx, y, x-dx, y-dy, x, y-dy]))
print x, y, dx, y, dx, dy, x, dy
pyglet.app.run()
现在我只需要解决如何破坏矩形…我从您的解决方案开始,并对其进行了一些改进。矩形伪影问题通过添加on_draw函数得到解决,在该函数中,您清除窗口,然后重新绘制每个对象。Pyglet(OpenGL)使用双缓冲,因此其工作速度比听起来快得多
import pyglet
# rectangle class
class Rect:
def __init__(self, x, y, w, h):
self.set(x, y, w, h)
def draw(self):
pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, self._quad)
def set(self, x=None, y=None, w=None, h=None):
self._x = self._x if x is None else x
self._y = self._y if y is None else y
self._w = self._w if w is None else w
self._h = self._h if h is None else h
self._quad = ('v2f', (self._x, self._y,
self._x + self._w, self._y,
self._x + self._w, self._y + self._h,
self._x, self._y + self._h))
def __repr__(self):
return f"Rect(x={self._x}, y={self._y}, w={self._w}, h={self._h})"
# main function
def main():
r1 = Rect(10, 10, 100, 100)
window = pyglet.window.Window()
@window.event
def on_draw():
window.clear()
r1.draw()
@window.event
def on_mouse_press(x, y, button, modifiers):
r1.set(x=x, y=y)
print(r1)
@window.event
def on_mouse_drag(x, y, dx, dy, buttons, modifiers):
r1.set(x=x, y=y)
print(r1)
pyglet.app.run()
if __name__ == '__main__':
main()
导入pyglet
从pyglet导入形状
从pyglet.shapes导入BorderedRectangle
从pyglet.window导入密钥
def init():
display=pyglet.canvas.get\u display()
#对于显示中的屏幕。获取屏幕()
#打印(屏幕)
屏幕=显示。获取屏幕()[0]
config=pyglet.gl.config(双缓冲区=True)
返回pyglet.window.window(screen=screen,config=config,resizeable=True)
window=init()
batch=pyglet.graphics.batch()
方框列表=[]
绘图框=假
矩形=无
方框位置=[0,0,0,0]
X=0
Y=1
W=2
H=3
def getSelected(x,y):
通过
@窗口事件
def on_draw():
window.clear()
batch.draw()
pyglet.gl.glFlush()
@窗口事件
def on_调整大小(宽度、高度):
打印(f“窗口大小调整宽度:{width}和高度:{height}”)
@窗口事件
def on_键按(符号、修改器):
打印(f“键:{chr(symbol)}用修饰符按:{modifiers}”)
返回真值
@窗口事件
钥匙释放时的def(符号、修改器):
全局绘图框
全局矩形
#打印(f“不再按此键:{chr(symbol)}和修改器:{modifiers}”)
如果(绘图框==真):
绘图框=假
如果方框位置[W]<0:
箱位[X]=箱位[X]+箱位[W]
箱位[W]=-箱位[W]
如果方框位置[H]<0:
箱位[Y]=箱位[Y]+箱位[H]
箱位[H]=-箱位[H]
矩形=形状。带边框的矩形(长方体位置[0],长方体位置[1],长方体位置[2],长方体位置[3],
边框=3,颜色=(200200200),
边框颜色=(255,255,255),批次=批次)
矩形。不透明度=100
框\列表。追加(矩形)
矩形=无
@窗口事件
按鼠标上的def键(x、y、按钮、修改器):
#打印(f“按钮:{button}位于({x},{y})修饰符:{modifiers}”)
全局绘图框
全局框位置
如果(修饰符==key.MOD_SHIFT):
绘图框=真
箱位[0]=x
箱位[1]=y
其他:
已选定=已选定(x,y)
进口检验
@窗口事件
鼠标拖动时的def(x、y、dx、dy、按钮、修改器):
#打印(f“鼠标拖动x:{x},y:{y}按钮:{buttons}和修改器:{modifiers}被按下”)
全局绘图框
全局框位置
全局矩形
如果绘图框==真:
盒子位置[2]=x盒位置[0]
盒子位置[3]=y-盒子位置[1]
矩形=形状。带边框的矩形(长方体位置[0],长方体位置[1],长方体位置[2],长方体位置[3],
边框=3,颜色=(200200),边框颜色=(255,255,255),批次=批次)
矩形。不透明度=100
如果名称=“\uuuuu main\uuuuuuuu”:
pyglet.app.run()文件
#属性=变量(矩形)
#{'kids':0,'name':'Dog','color':'Spotted','age':10,'legs':2,'嗅觉':'Alot'}
#现在以某种方式把它扔掉
#打印(“,”.join(“%s:%s”%item用于attrs.items()中的项)
#打印(inspect.getmembers(BorderedRectangle,predicate=inspect.isfunction))
当我运行脚本时,我得到:return f“Rect(x={self.\ux},y={self.\uy},w={self.\uw},h={self.\uh})”语法错误:无效语法这是Python2对Python3的事情吗?如果我对它进行注释,脚本运行正常。另外,我不明白您是如何将类矩形传递给窗口的。也就是说,pyglet.graphics.draw(4,pyglet.gl.gl\u QUADS,self.\u quad)知道它必须在window=pyglet.window.window()中绘制矩形。(因为它是活动窗口?)
import pyglet
from pyglet import shapes
from pyglet.shapes import BorderedRectangle
from pyglet.window import key
def init():
display = pyglet.canvas.get_display()
# for screen in display.get_screens():
# print(screen)
screen = display.get_screens()[0]
config = pyglet.gl.Config(double_buffer=True)
return pyglet.window.Window(screen = screen, config=config, resizable=True)
window = init()
batch = pyglet.graphics.Batch()
box_list = []
drawing_box = False
rectangle = None
box_position = [0,0,0,0]
X = 0
Y = 1
W = 2
H = 3
def getSelected(x, y):
pass
@window.event
def on_draw():
window.clear()
batch.draw()
pyglet.gl.glFlush()
@window.event
def on_resize(width, height):
print(f"window resized width: {width} and height: {height}")
@window.event
def on_key_press(symbol, modifiers):
print(f"key: {chr(symbol)} pressed with modifier: {modifiers}")
return True
@window.event
def on_key_release(symbol, modifiers):
global drawing_box
global rectangle
#print(f"this keys: {chr(symbol)} and modifiers: {modifiers} are no longer pressed")
if (drawing_box == True):
drawing_box = False
if box_position[W] < 0:
box_position[X] = box_position[X] + box_position[W]
box_position[W] = -box_position[W]
if box_position[H] < 0:
box_position[Y] = box_position[Y] + box_position[H]
box_position[H] = -box_position[H]
rectangle = shapes.BorderedRectangle(box_position[0], box_position[1], box_position[2], box_position[3],
border=3, color=(200, 200, 200),
border_color=(255, 255, 255), batch=batch)
rectangle.opacity = 100
box_list.append(rectangle)
rectangle = None
@window.event
def on_mouse_press(x, y, button, modifiers):
#print(f"button : {button} at ({x},{y}) modifiers: {modifiers}")
global drawing_box
global box_position
if(modifiers == key.MOD_SHIFT):
drawing_box = True
box_position[0] = x
box_position[1] = y
else:
selected = getSelected(x, y)
import inspect
@window.event
def on_mouse_drag(x, y, dx, dy, buttons, modifiers):
#print(f"mouse dragging at x: {x}, y: {y} button: {buttons} and modifier: {modifiers} are pressed")
global drawing_box
global box_position
global rectangle
if drawing_box == True:
box_position[2] = x-box_position[0]
box_position[3] = y -box_position[1]
rectangle = shapes.BorderedRectangle(box_position[0], box_position[1], box_position[2], box_position[3],
border=3,color=(200,200,200),border_color=(255, 255, 255), batch=batch)
rectangle.opacity = 100
if __name__ == "__main__":
pyglet.app.run()
#attrs = vars(rectangle)
# {'kids': 0, 'name': 'Dog', 'color': 'Spotted', 'age': 10, 'legs': 2, 'smell': 'Alot'}
# now dump this in some way or another
#print(', '.join("%s: %s" % item for item in attrs.items()))
#print(inspect.getmembers(BorderedRectangle, predicate=inspect.isfunction))