【问题标题】:python pyautogui.write() accelerating and messing up what it is supposed to writepython pyautogui.write() 加速并弄乱它应该写的东西
【发布时间】:2022-10-18 05:03:06
【问题描述】:

我的一个朋友遇到了这个难题。
他基本上有一个巨大的字符串,并试图使用 pyautogui 的 .write() 函数将此字符串写入任何文本字段(在本例中为 Windows 记事本)。
他使用的代码如下:

import pyautogui
import time

# The string to which all numbers are being added
x = ""

# Some time to switch to notepad before pyautogui spams a bunch of characters
time.sleep(5)

# Add numbers to the string along with a space
for i in range(1, 2001):
    x += str(i) + " "

# "Simulate" the keyboard writing out the entire string
pyautogui.write(x)

请注意,pyautogui.write() 有一个可选参数 interval,默认设置为 0。 pyautogui 的源代码使用time.sleep(interval) 创建一个区间。

现在有两个有趣的异常现象表明:

  • 打字速度似乎加快了。
  • 就在字符串中的 1250 附近,它似乎失去了控制,并发送了一堆乱七八糟的数字和空格。

混乱的示例如下所示:

1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 12   66662662621   728822111  1  3  599933331   21612222333111111  73444433111 24686066663971117777773331413311111  3599944441   11111111  802222444623444411144441111179511155555754444444444111     2    68024      024  68  0    6 02    680324  65511111155511155555555555555555555666466772468088868     16000009135     111666661663666344446668     1111166666666766677357   111111116666699924911771777007111111216 1177722777333335   111111777440   111111176357779   11788828888 1777999903 188811111111168   1111888228833335 1118 4148 468 41 511828 85 51 588 5108128141 61 68 718 28 715 768 719 8188 8138 158 8888 991118 381 91781900111913901 017 0199 19 1291194111691118 11021 23915997

在混乱之前输入的所有内容都如您所料,只是自然数在上升。

有谁知道为什么它会陷入混乱?提前致谢!

编辑:我知道这可以很容易地通过添加一些间隔来规避,但我们的问题首先关注为什么会发生这种情况。

【问题讨论】:

    标签: python pyautogui


    【解决方案1】:

    我建议使用:

        pyautogui.write(x, interval=0.25)
    

    这样,打字速度是一致的。

    我怀疑你朋友的情况是 pyautogui 输入太快并且字符丢失了。添加延迟间隔应该可以解决问题;我遇到过同样的问题。

    我建议关注他们的文档页面以了解有关其用法的更多信息: https://pyautogui.readthedocs.io/en/latest/keyboard.html

    【讨论】:

    • 是的,但我们的问题首先是为什么会出现这种行为。绕过它确实很容易,至少给它一个间隔。
    【解决方案2】:

    关于您关于为什么会发生此错误的问题,我不知道行为。

    我不知道会发生什么导致以下情况:

    91781900111913901 017 0199 19 1291194111691118 
    

    但我想问一下,每次跑步结束时,它是否意味着从头开始?我的意思是我修改了你朋友的代码来测试它,如下所示:

    from time import sleep
    import keyboard
    import pyautogui
    
    x = ""
    
    # Some time to switch to notepad before pyautogui spams a bunch of characters
    sleep(5)
    
    # Add numbers to the string along with a space
    while True:
        if keyboard.is_pressed('1'):
            for i in range(1, 2001):
                x += str(i) + " "
                if keyboard.is_pressed('2'):
                    break
    
    # "Simulate" the keyboard writing out the entire string
                pyautogui.write(x, interval=0.2)
    

    输出是在我第一次按 1 激活它时,它会打印 "" 内部的任何内容并完成并需要我再次按 1 来激活它,这次它就像这个示例:

    1 #as u guess this is the first time that print nothing# 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 11 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4 5 6 7 8 9 10 11 12 
    

    我的意思是,如果您想从0 打印到2000,为什么不这样做:

    if keyboard.is_pressed('r'):
            for i in range(1, 2001):
                newI=str(i).rjust(6)
                keyboard.write(newI,delay=0.0002)
    

    它给出了这样的:

    996   997   998   999  1000  1001  1002  1003  1004  1005  1006  1007  1008  1009  1010  1011  1012  1013  1014  1015  1016  1017  1018  1019  1020  1021  1022  1023  1024  1025  1026  1027  1028  1029  1030  1031  1032  1033  1034  1035  1036  1037  1038  1039  1040  1041  1042  1043  1044  1045  1046  1047  1048  1049  1050  1051  1052  1053  1054  1055  1056  1057  1058  1059  1060  1061  1062  1063  1064  1065  1066  1067  1068  1069  1070  1071  1072  1073  1074  1075  1076  1077  1078  1079  1080  1081  1082  1083  1084  1085  1086  1087  1088  1089  1090  1091  1092  1093  1094  1095  1096  1097  1098  1099  1100  1101  1102  1103  1104  1105  1106  1107  1108  1109  1110  1111  1112  1113  1114  1115  1116  1117  1118  1119  1120  1121  1122  1123  1124  1125  1126  1127  1128  1129  1130  1131  1132  1133  1134  1135  1136  1137  1138  1139  1140  1141  1142  1143  1144  1145  1146  1147  1148  1149  1150  1151  1152  1153  1154  1155  1156  1157  1158  1159  1160  1161  1162  1163  1164  1165  1166  1167  1168  1169  1170  1171  1172  1173  1174  1175  1176  1177  1178  1179  1180  1181  1182  1183  1184  1185  1186  1187  1188  1189  1190  1191  1192  1193  1194  1195  1196  1197  1198  1199  1200  1201  1202  1203  1204  1205  1206  1207  1208  1209  1210  1211  1212  1213  1214  1215  1216  1217  1218  1219  1220  1221  1222  1223  1224  1225  1226  1227  1228  1229  1230  1231  1232  1233  1234  1235  1236  1237  1238  1239  1240  1241  1242  1243  1244  1245  1246  1247  1248  1249  1250  1251  1252  1253  1254  1255  1256
    

    并继续正常工作我只是没有复制那么多 但是关于您关于为什么会发生此错误的问题,我不知道这种行为。

    【讨论】:

    • 谢谢,我可以弄清楚如何打印 0 到 2000 大声笑。我专门问这个是为了了解它失去对输入内容的控制的原因。
    猜你喜欢
    • 2020-10-21
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多