Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python的控制台窗口上按下鼠标_Python_Console_Window_Cmd - Fatal编程技术网

在python的控制台窗口上按下鼠标

在python的控制台窗口上按下鼠标,python,console,window,cmd,Python,Console,Window,Cmd,在python中是否有某种方法可以在控制台窗口上按下鼠标?我知道你可以这样做,因为如果你在运行windows,你可以打开cmd并键入“edit”。例如,您将如何在python中实现这一点?谢谢。是的,但工作量相当大 它的工作原理就像从C代码与Win32API对话一样 如果你在MSDN上搜索函数名,微软的文档就相当不错了 pywin32包含一个名为win32console_demo.py的文件 添加以下行以启用鼠标输入。就在conin创建之后 conin.SetConsoleMode(ENABL

在python中是否有某种方法可以在控制台窗口上按下鼠标?我知道你可以这样做,因为如果你在运行windows,你可以打开cmd并键入“edit”。例如,您将如何在python中实现这一点?谢谢。

是的,但工作量相当大

它的工作原理就像从C代码与Win32API对话一样

如果你在MSDN上搜索函数名,微软的文档就相当不错了

pywin32包含一个名为win32console_demo.py的文件

添加以下行以启用鼠标输入。就在conin创建之后

conin.SetConsoleMode(ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT)
win32console_demo.py已编辑以启用鼠标输入

import win32con
import win32file
from win32console import *
import traceback, time


virtual_keys={}
for k,v in win32con.__dict__.items():
    if k.startswith('VK_'):
        virtual_keys[v]=k 

free_console=True
try:
    AllocConsole()
except error, exc:
    if exc.winerror!=5:
        raise
    ## only free console if one was created successfully
    free_console=False

stdout=GetStdHandle(STD_OUTPUT_HANDLE)

conin=PyConsoleScreenBufferType( win32file.CreateFile( "CONIN$", win32con.GENERIC_READ|win32con.GENERIC_WRITE, win32con.FILE_SHARE_READ, None, win32con.OPEN_EXISTING, 0, 0))

conin.SetConsoleMode(ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT)

newbuffer=CreateConsoleScreenBuffer()
newbuffer.SetConsoleActiveScreenBuffer()
newbuffer.SetConsoleTextAttribute(FOREGROUND_RED|FOREGROUND_INTENSITY
        |BACKGROUND_GREEN|BACKGROUND_INTENSITY)
newbuffer.WriteConsole('This is a new screen buffer\n')

newbuffer.SetConsoleTextAttribute(FOREGROUND_RED|FOREGROUND_INTENSITY
        |BACKGROUND_GREEN|BACKGROUND_INTENSITY)
newbuffer.WriteConsole('Press some keys, click some characters with the mouse\n')

newbuffer.SetConsoleTextAttribute(FOREGROUND_BLUE|FOREGROUND_INTENSITY
        |BACKGROUND_RED|BACKGROUND_INTENSITY)
newbuffer.WriteConsole('Hit "Esc" key to quit\n')


breakout=False
while not breakout:
    input_records=conin.ReadConsoleInput(10)
    for input_record in input_records:
        if input_record.EventType==KEY_EVENT:
            if input_record.KeyDown:
                if input_record.Char=='\0':
                    newbuffer.WriteConsole(virtual_keys.get(input_record.VirtualKeyCode, 'VirtualKeyCode: %s' %input_record.VirtualKeyCode))
                else:
                    newbuffer.WriteConsole(input_record.Char)
                if input_record.VirtualKeyCode==win32con.VK_ESCAPE:
                    breakout=True
                    break
        elif input_record.EventType==MOUSE_EVENT:
            if input_record.EventFlags==0:  ## 0 indicates a button event
                if input_record.ButtonState!=0:   ## exclude button releases
                    pos=input_record.MousePosition
                    # switch the foreground and background colors of the character that was clicked
                    attr=newbuffer.ReadConsoleOutputAttribute(Length=1, ReadCoord=pos)[0]
                    new_attr=attr
                    if attr&FOREGROUND_BLUE:
                        new_attr=(new_attr&~FOREGROUND_BLUE)|BACKGROUND_BLUE
                    if attr&FOREGROUND_RED:
                        new_attr=(new_attr&~FOREGROUND_RED)|BACKGROUND_RED
                    if attr&FOREGROUND_GREEN:
                        new_attr=(new_attr&~FOREGROUND_GREEN)|BACKGROUND_GREEN

                    if attr&BACKGROUND_BLUE:
                        new_attr=(new_attr&~BACKGROUND_BLUE)|FOREGROUND_BLUE
                    if attr&BACKGROUND_RED:
                        new_attr=(new_attr&~BACKGROUND_RED)|FOREGROUND_RED
                    if attr&BACKGROUND_GREEN:
                        new_attr=(new_attr&~BACKGROUND_GREEN)|FOREGROUND_GREEN
                    newbuffer.WriteConsoleOutputAttribute((new_attr,),pos)
        else:
            newbuffer.WriteConsole(str(input_record))
    time.sleep(0.1)

newbuffer.Close()

if free_console:
     FreeConsole()

是的,但工作量相当大

它的工作原理就像从C代码与Win32API对话一样

如果你在MSDN上搜索函数名,微软的文档就相当不错了

pywin32包含一个名为win32console_demo.py的文件

添加以下行以启用鼠标输入。就在conin创建之后

conin.SetConsoleMode(ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT)
win32console_demo.py已编辑以启用鼠标输入

import win32con
import win32file
from win32console import *
import traceback, time


virtual_keys={}
for k,v in win32con.__dict__.items():
    if k.startswith('VK_'):
        virtual_keys[v]=k 

free_console=True
try:
    AllocConsole()
except error, exc:
    if exc.winerror!=5:
        raise
    ## only free console if one was created successfully
    free_console=False

stdout=GetStdHandle(STD_OUTPUT_HANDLE)

conin=PyConsoleScreenBufferType( win32file.CreateFile( "CONIN$", win32con.GENERIC_READ|win32con.GENERIC_WRITE, win32con.FILE_SHARE_READ, None, win32con.OPEN_EXISTING, 0, 0))

conin.SetConsoleMode(ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT)

newbuffer=CreateConsoleScreenBuffer()
newbuffer.SetConsoleActiveScreenBuffer()
newbuffer.SetConsoleTextAttribute(FOREGROUND_RED|FOREGROUND_INTENSITY
        |BACKGROUND_GREEN|BACKGROUND_INTENSITY)
newbuffer.WriteConsole('This is a new screen buffer\n')

newbuffer.SetConsoleTextAttribute(FOREGROUND_RED|FOREGROUND_INTENSITY
        |BACKGROUND_GREEN|BACKGROUND_INTENSITY)
newbuffer.WriteConsole('Press some keys, click some characters with the mouse\n')

newbuffer.SetConsoleTextAttribute(FOREGROUND_BLUE|FOREGROUND_INTENSITY
        |BACKGROUND_RED|BACKGROUND_INTENSITY)
newbuffer.WriteConsole('Hit "Esc" key to quit\n')


breakout=False
while not breakout:
    input_records=conin.ReadConsoleInput(10)
    for input_record in input_records:
        if input_record.EventType==KEY_EVENT:
            if input_record.KeyDown:
                if input_record.Char=='\0':
                    newbuffer.WriteConsole(virtual_keys.get(input_record.VirtualKeyCode, 'VirtualKeyCode: %s' %input_record.VirtualKeyCode))
                else:
                    newbuffer.WriteConsole(input_record.Char)
                if input_record.VirtualKeyCode==win32con.VK_ESCAPE:
                    breakout=True
                    break
        elif input_record.EventType==MOUSE_EVENT:
            if input_record.EventFlags==0:  ## 0 indicates a button event
                if input_record.ButtonState!=0:   ## exclude button releases
                    pos=input_record.MousePosition
                    # switch the foreground and background colors of the character that was clicked
                    attr=newbuffer.ReadConsoleOutputAttribute(Length=1, ReadCoord=pos)[0]
                    new_attr=attr
                    if attr&FOREGROUND_BLUE:
                        new_attr=(new_attr&~FOREGROUND_BLUE)|BACKGROUND_BLUE
                    if attr&FOREGROUND_RED:
                        new_attr=(new_attr&~FOREGROUND_RED)|BACKGROUND_RED
                    if attr&FOREGROUND_GREEN:
                        new_attr=(new_attr&~FOREGROUND_GREEN)|BACKGROUND_GREEN

                    if attr&BACKGROUND_BLUE:
                        new_attr=(new_attr&~BACKGROUND_BLUE)|FOREGROUND_BLUE
                    if attr&BACKGROUND_RED:
                        new_attr=(new_attr&~BACKGROUND_RED)|FOREGROUND_RED
                    if attr&BACKGROUND_GREEN:
                        new_attr=(new_attr&~BACKGROUND_GREEN)|FOREGROUND_GREEN
                    newbuffer.WriteConsoleOutputAttribute((new_attr,),pos)
        else:
            newbuffer.WriteConsole(str(input_record))
    time.sleep(0.1)

newbuffer.Close()

if free_console:
     FreeConsole()

我个人不喜欢上一个答案中的PyWin32,因为它只在第一次导入时起作用,之后无法导入其主pyd模块。
还有一个事实是它不是跨平台的

诅咒是一个更好的选择,虽然它与python27并不完全友好,但我已经设法让它在葡萄酒中工作:

import _curses # _curses.pyd supplied locally for python27 win32
import curses 

screen = curses.initscr() 
#curses.noecho() 
curses.curs_set(0) 
screen.keypad(1) 
curses.mousemask(curses.ALL_MOUSE_EVENTS)

screen.addstr("This is a Sample Curses Script\n\n") 

key=0
while key!=27: # Esc to close
    key = screen.getch() 
    #screen.erase()
    if key == curses.KEY_MOUSE:
        _, mx, my, _, _ = curses.getmouse()
        y, x = screen.getyx()
        screen.addstr('mx, my = %i,%i                \r'%(mx,my))
    screen.refresh()

curses.endwin()
在本例中,您需要单击、拖动和释放以注册事件,但我认为有一种方法可以解决这一问题

我只是自己在玩这个(我不想让PyQt或PyGLFW变得复杂)

编辑:
设法使其按预期工作并更新了代码。
您无需再拖动即可注册事件。

我个人不喜欢上一个答案中的PyWin32,因为它只在第一次导入时起作用,之后无法导入其主pyd模块。
还有一个事实是它不是跨平台的

诅咒是一个更好的选择,虽然它与python27并不完全友好,但我已经设法让它在葡萄酒中工作:

import _curses # _curses.pyd supplied locally for python27 win32
import curses 

screen = curses.initscr() 
#curses.noecho() 
curses.curs_set(0) 
screen.keypad(1) 
curses.mousemask(curses.ALL_MOUSE_EVENTS)

screen.addstr("This is a Sample Curses Script\n\n") 

key=0
while key!=27: # Esc to close
    key = screen.getch() 
    #screen.erase()
    if key == curses.KEY_MOUSE:
        _, mx, my, _, _ = curses.getmouse()
        y, x = screen.getyx()
        screen.addstr('mx, my = %i,%i                \r'%(mx,my))
    screen.refresh()

curses.endwin()
在本例中,您需要单击、拖动和释放以注册事件,但我认为有一种方法可以解决这一问题

我只是自己在玩这个(我不想让PyQt或PyGLFW变得复杂)

编辑:
设法使其按预期工作并更新了代码。
您无需再拖动即可注册事件。

前面的两个答案都是正确的:您可以在Windows上使用pywin32或在Linux上使用curses来处理鼠标输入。不过,在另一个平台上两者都不起作用


如果您想要同时处理这两个方面的东西,或者只是一个更简单的API,那么可以使用我最近编写的包—Ascimatics。通过包装上述两种解决方案,以跨平台方式为控制台创建Screen类。

前面的两个答案都是正确的:您可以在Windows上使用pywin32或在Linux上使用curses来处理鼠标输入。不过,在另一个平台上两者都不起作用

如果您想要同时处理这两个方面的东西,或者只是一个更简单的API,那么可以使用我最近编写的包—Ascimatics。通过包装上述两种解决方案,以跨平台的方式为控制台创建Screen类。

请参见SO问答。您可能必须用C语言创建一个模块,因为我怀疑标准Python是否有用于此目的的本机模块。您可能必须用C语言创建一个模块,因为我怀疑标准Python是否为此提供了本机模块。