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