3

Linuxを使用していて、Web開発用にNattywareのPixieツールを再作成してみたいと思っています。gPickは大丈夫ですが、Pixieの方が優れています。

マウスポインタの周囲を検出して表示できるようにしたい。Pythonでズームインして、マウスポインタの周りの領域を表示する方法を見つけようとしています。

どこから始めたらいいのかわからない。画像を保存したくありません。ウィンドウ内のマウスの位置を拡大した領域を表示するだけです。

編集:私は何かが潜在的に機能することができるようになりました。これを実行しないでください、それはクラッシュします!

import sys, evdev
from Xlib import display, X
from PyQt4 import QtGui
from PyQt4.QtGui import QPixmap, QApplication, QColor

class printImage():
def __init__(self):
    self.window = QtGui.QMainWindow()
    self.window.setGeometry(0,0,400,200)

    self.winId = QApplication.desktop().winId()
    self.width = 150
    self.height = 150

    self.label = QtGui.QLabel('Hi')
    self.label.setGeometry(10, 10, 400, 100)
    self.label.show()

def drawView(self, x, y):
    self.label.setText('abc')
    pix = self.getScreenArea(x, y)
    self.pic.setPixmap(pix)

def render(self):
    self.window.show()

def getScreenArea(self, areaX, areaY):
    image = QPixmap.grabWindow(
        self.winId,
        x = areaX,
        y = areaY,
        width = self.width,
        height = self.height
    )

    return image

if __name__ == '__main__':
    app = QApplication(sys.argv)
    view = printImage()

    view.render()

    display = display.Display(':0')
    root = display.screen().root

    root.grab_pointer(
       True, 
       X.PointerMotionMask | X.ButtonReleaseMask, 
       X.GrabModeAsync, 
       X.GrabModeAsync, 
       0, 0, 
       X.CurrentTime
   )

    while True:
        ev = display.next_event()
        view.drawView(ev.event_x, ev.event_y)

    app.exec_()

なぜそれが自分自身を破壊するのか、何か考えはありますか?grabWindow()関数でクラッシュします。他に使用できるものはありますか?

4

2 に答える 2

2

これはLinuxで動作しますが、おそらくクロスプラットフォームです。

import wx
ff=wx.App()
screen = wx.ScreenDC()
size = screen.GetSize()
bmp = wx.EmptyBitmap(size[0], size[1])
mem = wx.MemoryDC(bmp)
mem.Blit(0, 0, size[0], size[1], screen, 0, 0)
del mem
#bmp.SaveFile('screenshot.png', wx.BITMAP_TYPE_PNG)
im = bmp.ConvertToImage()

からhelp

ConvertToImage

Creates a platform-independent image from a platform-dependent
bitmap. This preserves mask information so that bitmaps and images can
be converted back and forth without loss in that respect.
于 2012-06-11T22:59:30.877 に答える
0

わかった。while ループを使用する代わりに、QTimer に切り替えました。これにより大量のメモリ使用量が解放され、grabWindow() は非常にうまく機能します。

import sys, pymouse
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class printImage(QWidget):
    def __init__(self, *args):
        apply(QWidget.__init__,(self, ) + args)
        QWidget.__init__(self)

        self.winId = QApplication.desktop().winId()
        self.mouse = pymouse.PyMouse()
        self.timer = QTimer()

        self.x = self.y = self.cX = self.cY = 0

        self.createLabel()
        self.show()
        self.startListening()

    def createLabel(self):
        self.label = QLabel(self)
        self.label.move(10, 15)
        self.label.resize(150, 130)

    def startListening(self):
        self.timer.connect(self.timer, SIGNAL('timeout()'), self.sendData)
        self.timer.start(0)

    def sendData(self):
        pos = self.mouse.position()
        x = pos[0]
        y = pos[1]

        if (self.cX != x) and (self.cY != y):
            self.x = self.cX = x
            self.y = self.cY = y

            self.label.setPixmap(
                self.cropScreenArea()
            )

    def cropScreenArea(self):
        return QPixmap.grabWindow(
            self.winId,
            x = self.x - 80,
            y = self.y - 60,
            width = 150,
            height = 130
        )

    def keyPressEvent(self, e):
        if e.key() == Qt.Key_Escape:
            self.close()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    view = printImage()

    sys.exit(app.exec_())
于 2012-06-12T19:32:16.223 に答える