在 python 中构造一个从大到小的整数列表
Construct a list of integers from bigger to smaller in python
我正在尝试开发一个小鼠标控制器应用程序。它应该得到 (X, Y) 坐标并使光标移动到那里。
问题在于,当它尝试转到小于当前坐标的 X 坐标时。
import win32con
from win32api import GetCursorPos, SetCursorPos, mouse_event, GetSystemMetrics
from time import sleep
def clickWithCursor(xDesired, yDesired):
xCurrent, yCurrent = GetCursorPos()
slope = float(yDesired - yCurrent) / float(xDesired - xCurrent)
def goAhead(x, y):
for x in range(min(xCurrent, xDesired), max(xDesired, xCurrent), 2):
y = int(slope * (x - xCurrent) + yCurrent)
SetCursorPos((int(x), y))
sleep(0.002)
mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)
return goAhead(0, 0)
def main():
clickWithCursor(243, 184)
main()
以上只是一个非常糟糕的尝试,它没有给我想要的结果。我一直在寻找如何去做,就是找不到正确的方法。
简而言之,我想构造一个列表,以便根据参数顺序从逻辑上从大到小,或从小到大。
所以,如果我给出我想要得到的范围 (4, 1):[4, 3, 2] 或范围(1, 4),它不会介意并正确构造它方式...
编辑:
我根据答案重构了代码,并使其更具可读性以供其他用户查看。注意 class MouseController 中的 "sequence" 方法:
from win32con import MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_LEFTUP
from win32api import GetCursorPos, SetCursorPos, mouse_event
from time import sleep
class CursorPositionPrinter(object):
"""docstring for CursorPositionPrinter"""
def print_cursor_pos(self):
print GetCursorPos()
def __init__(self):
super(CursorPositionPrinter, self).__init__()
class AutoClicker(object):
"""docstring for AutoClicker"""
def click(self, times):
xCurrent, yCurrent = GetCursorPos()
for i in xrange(times):
self.simple_click(xCurrent, yCurrent)
def simple_click(self, x, y):
mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0)
mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0)
def __init__(self):
super(AutoClicker, self).__init__()
class MouseController(CursorPositionPrinter, AutoClicker):
"""docstring for MouseController
Controlls your mouse magically!!!"""
def sequence(self, a, b, n):
mn, mx = a, b
step = -n if mn > mx else n
for value in xrange(mn, mx, step):
yield value
def click_with_cursor(self, xDesired, yDesired):
self.go_to_coordinates(xDesired, yDesired)
self.simple_click(xDesired, yDesired)
def go_to_coordinates(self, xDesired, yDesired):
xCurrent, yCurrent = GetCursorPos()
slope = float(yDesired - yCurrent) / float(xDesired - xCurrent)
for x in self.sequence(xCurrent, xDesired, 2):
y = int(slope * (x - xCurrent) + yCurrent)
SetCursorPos((int(x), y))
sleep(self.latency)
SetCursorPos((xDesired, yDesired))
def __init__(self, latency=0.02):
super(MouseController, self).__init__()
self.latency = latency
根据您获得最小值和最大值后哪个值更大,选择 -1 或 1 步:
def up_down(a, b):
mn, mx = min(a), max(b)
step = -1 if mn > mx else 1
return range(mn, mx, step)
输出:
In [9]: list(up_down([4,5,5,7],[0,1]))
Out[9]: [4, 3, 2]
In [10]: list(up_down([0,1],[4,5,5,7] ))
Out[10]: [0, 1, 2, 3, 4, 5, 6]
如果最小值更大,我们需要负步长,如果不是,就使用 1 步长。
为了更清楚地说明如何在您自己的代码中使用逻辑,您只需使用 if/else:
def goAhead(x, y,n=1):
step = -n if xCurrent > xDesired else n
for x in range(xCurrent, xDesired, step):
y = int(slope * (x - xCurrent) + yCurrent)
SetCursorPos((int(x), y))
sleep(0.002)
如果你想改变步长,你可以传递任何你想要的n
lim1, lim2 = 10, 2
step = 1 if lim1<lim2 else -1
lst = list(range(lim1, lim2, step))
print(lst)
=> [10, 9, 8, 7, 6, 5, 4, 3]
与:
lim1, lim2 = 2, 10
=> [2, 3, 4, 5, 6, 7, 8, 9]
此表单允许:
列表(范围(lim1,lim2,1 如果 lim1
range(a, b, -1 if a > b else 1)
我正在尝试开发一个小鼠标控制器应用程序。它应该得到 (X, Y) 坐标并使光标移动到那里。
问题在于,当它尝试转到小于当前坐标的 X 坐标时。
import win32con
from win32api import GetCursorPos, SetCursorPos, mouse_event, GetSystemMetrics
from time import sleep
def clickWithCursor(xDesired, yDesired):
xCurrent, yCurrent = GetCursorPos()
slope = float(yDesired - yCurrent) / float(xDesired - xCurrent)
def goAhead(x, y):
for x in range(min(xCurrent, xDesired), max(xDesired, xCurrent), 2):
y = int(slope * (x - xCurrent) + yCurrent)
SetCursorPos((int(x), y))
sleep(0.002)
mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)
return goAhead(0, 0)
def main():
clickWithCursor(243, 184)
main()
以上只是一个非常糟糕的尝试,它没有给我想要的结果。我一直在寻找如何去做,就是找不到正确的方法。
简而言之,我想构造一个列表,以便根据参数顺序从逻辑上从大到小,或从小到大。
所以,如果我给出我想要得到的范围 (4, 1):[4, 3, 2] 或范围(1, 4),它不会介意并正确构造它方式...
编辑: 我根据答案重构了代码,并使其更具可读性以供其他用户查看。注意 class MouseController 中的 "sequence" 方法:
from win32con import MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_LEFTUP
from win32api import GetCursorPos, SetCursorPos, mouse_event
from time import sleep
class CursorPositionPrinter(object):
"""docstring for CursorPositionPrinter"""
def print_cursor_pos(self):
print GetCursorPos()
def __init__(self):
super(CursorPositionPrinter, self).__init__()
class AutoClicker(object):
"""docstring for AutoClicker"""
def click(self, times):
xCurrent, yCurrent = GetCursorPos()
for i in xrange(times):
self.simple_click(xCurrent, yCurrent)
def simple_click(self, x, y):
mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0)
mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0)
def __init__(self):
super(AutoClicker, self).__init__()
class MouseController(CursorPositionPrinter, AutoClicker):
"""docstring for MouseController
Controlls your mouse magically!!!"""
def sequence(self, a, b, n):
mn, mx = a, b
step = -n if mn > mx else n
for value in xrange(mn, mx, step):
yield value
def click_with_cursor(self, xDesired, yDesired):
self.go_to_coordinates(xDesired, yDesired)
self.simple_click(xDesired, yDesired)
def go_to_coordinates(self, xDesired, yDesired):
xCurrent, yCurrent = GetCursorPos()
slope = float(yDesired - yCurrent) / float(xDesired - xCurrent)
for x in self.sequence(xCurrent, xDesired, 2):
y = int(slope * (x - xCurrent) + yCurrent)
SetCursorPos((int(x), y))
sleep(self.latency)
SetCursorPos((xDesired, yDesired))
def __init__(self, latency=0.02):
super(MouseController, self).__init__()
self.latency = latency
根据您获得最小值和最大值后哪个值更大,选择 -1 或 1 步:
def up_down(a, b):
mn, mx = min(a), max(b)
step = -1 if mn > mx else 1
return range(mn, mx, step)
输出:
In [9]: list(up_down([4,5,5,7],[0,1]))
Out[9]: [4, 3, 2]
In [10]: list(up_down([0,1],[4,5,5,7] ))
Out[10]: [0, 1, 2, 3, 4, 5, 6]
如果最小值更大,我们需要负步长,如果不是,就使用 1 步长。
为了更清楚地说明如何在您自己的代码中使用逻辑,您只需使用 if/else:
def goAhead(x, y,n=1):
step = -n if xCurrent > xDesired else n
for x in range(xCurrent, xDesired, step):
y = int(slope * (x - xCurrent) + yCurrent)
SetCursorPos((int(x), y))
sleep(0.002)
如果你想改变步长,你可以传递任何你想要的n
lim1, lim2 = 10, 2
step = 1 if lim1<lim2 else -1
lst = list(range(lim1, lim2, step))
print(lst)
=> [10, 9, 8, 7, 6, 5, 4, 3]
与:
lim1, lim2 = 2, 10
=> [2, 3, 4, 5, 6, 7, 8, 9]
此表单允许:
列表(范围(lim1,lim2,1 如果 lim1
range(a, b, -1 if a > b else 1)