2016-11-19 35 views
-1

私はオートクリッカーを書いています。マウスダウンとマウスアップの間の時間間隔、およびクリック間の時間(これらの時間はcsvファイルに保存されます)。基本的なアイデアは、私は、プログラムを実行したいウィンドウが開始と停止ボタン(達成)をポップアップ。私は開始を打つことができ、一時停止を押すまでクリックの「ループ」(時間を保存したリストを「反復」する)を実行できるようにしたい。私はあなたがtkinterのメインループの中で別のループを走らせることができないことを知っているので、 'loop'と 'iterate'と言っています。私はクリック間の時間を待つためにroot.afterを使用してみましたが、クリックを実行する関数を呼び出しましたが、root.afterは必要な時間だけ時間をとりません。何か案は?完全なスクリプトを得て、csvファイルのサンプルも提供します。 Tkinterの/他の言語以外の他のモジュールを使用するオープンImは、何もこのエラーが与えられているpython tkinter:かなり時間をかけて反復する方法(root.after not working)

import csv 
import time 
from tkinter import * 
from PyWinMouse import * 


root = Tk() 
start_button = Button(root, text="start", width="7") 
pause_button = Button(root, text="pause", width="7") 
start_button.pack() 
pause_button.pack() 

# holds times for clicks[time_between_up_down, time_between_clicks] 
click_info = [] 
info_length = 0 
clicker = Mouse() 
paused = True 
iterateVar = 0 


def get_csv(): 
    global click_info, info_length 
    file = open("times.csv", 'r') 
    reader = csv.reader(file, delimiter=",") 
    for row in reader: 
     click_info.append(row) 
    info_length = len(click_info) 


def click(): 
    global iterateVar 
    if iterateVar < (info_length - 1) and paused is False: 
     clicker.left_down() 
     time.sleep(click_info[iterateVar][0]) 
     clicker.left_up() 
     iterateVar += 1 


def pause_button_function(event): 
    global paused 
    paused = True 


def start_button_function(event): 
    global paused 
    paused = False 


get_csv() 
pause_button.bind("<Button-1>", pause_button_function) 
start_button.bind("<Button-1>", start_button_function) 
root.after(float(click_info[iterateVar][1]), click) 
root.mainloop() 

あなたの心の中に表示された場合:csvファイルがどのように見えるかの

Traceback (most recent call last): 
    File 
"C:/Users/Owner/PycharmProjects/NaturalHumanBehaviorClickInfoGatherer/ActualClic ker.py", line 52, in <module> 
    root.after(float(click_info[iterateVar][1]), click) 
    File  "C:\Users\Owner\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py",  line 604, in after 
    return self.tk.call('after', ms, name) 
_tkinter.TclError: bad argument "1.0223703384399414": must be cancel, idle,  info, or an integer 

スナップショット(「偽を無視」、それは)他のもののための:

0.0948493480682373,1.0223703384399414,False 
0.09569144248962402,0.17647409439086914,False 
0.06346511840820312,0.14343690872192383,False 
0.09652972221374512,0.08008456230163574,False 
0.07996273040771484,0.07998061180114746,False 
0.09551239013671875,0.0805819034576416,False 
0.08001160621643066,0.04780721664428711,False 

答えて

1

after方法は、ミリ秒単位の整数フォーム()のように時間を受け付けます。あなたは(ミリ秒を意味するために1000年を掛けた)intに値を変換する必要があります。

ms = int(click_info[iterateVar][1] * 1000) 
root.after(ms, click) 

NOTE

  1. afterは一度と呼ばれるfucntionを作ります。繰り返し呼び出す場合は、もう一度呼び出す必要があります(コールバックclick内)。
  2. コールバック関数内でtime.sleepにコールしないでください。 UIがフリーズする。
関連する問題