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))