質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

947閲覧

python 1分おきに関数が定期実行されるボタンを作成したい

hitohira

総合スコア6

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2022/12/29 07:17

前提

題名通りですが、ボタンをクリックすると、設定された関数が1分おきに定期実行されるようにしたいです。

発生している問題・エラーメッセージ

fnc_do_1() missing 1 required positional argument: 'event'

該当のソースコード

python

1import tkinter as tk 2from tkinter import ttk 3 4import pyautogui as pg 5import pygetwindow as gw 6import time 7import schedule 8 9# ウインドウの作成 10root = tk.Tk() 11root.title("グラフ") 12 13# ウインドウのサイズ 14root.geometry("100x100") 15 16# 起動ボタン 17button = ttk.Button(root, text = "起動") 18button.place(x = 10, y = 10) 19 20def fnc_do_1(event): 21 #---------------------------------------------------------------- 22 # グラフ更新 23 window = gw.getWindowsWithTitle("web")[0] 24 window.activate() 25 window.maximize() 26 for pause_num in range(10): 27 try: 28 if pg.locateOnScreen("web.png", confidence=.6): 29 break 30 except Exception as e: 31 time.sleep(5.0) 32 pg.click(135, 1000, button="left") 33 for pause_num in range(10): 34 try: 35 if pg.locateOnScreen("web.png", confidence=.6): 36 break 37 except Exception as e: 38 time.sleep(5.0) 39 pg.moveTo(823, 333) 40 pg.drag(200, 60, duration=1.0, button="left") 41 pg.hotkey("ctrl", "c") 42 graph = gw.getWindowsWithTitle("Excel")[0] 43 graph.activate() 44 graph.maximize() 45 pg.click(75, 500, button="left") 46 pg.hotkey("ctrl", "v") 47 48 #---------------------------------------------------------------- 49 50# 1分ごとに定期実行 51schedule.every(1).minutes.do(fnc_do_1) 52while True: 53 schedule.run_pending() 54 time.sleep(1.0) 55 56# 起動 57button.bind("<Button-1>", fnc_do_1) 58 59#ウインドウ状態の維持 60root.mainloop() 61

試したこと

https://di-acc2.com/programming/python/4574/
上記サイトを参考にしたのですが、解決に至りませんでした…

補足情報(FW/ツールのバージョンなど)

python python3.x Jupyter

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Demerara

2022/12/29 12:11

fnc_do_1(event) とありますが、event という引数は使ってないようなので、削除すればいいと思います。
guest

回答2

0

ベストアンサー

エラーが出ている原因は、 schedule モジュールから fnc_do_1 関数を呼び出そうとするときに、引数無しで呼び出そうとしているからです。
これを回避するには、スケジュールの登録時に、たとえば

py

1schedule.every(5).seconds.do(fnc_do_1, None)

というように、適当な引数(上記の例ではNone)を与えてやれば、エラーはなくなります。

しかし、これを行っても、「1分おきに関数が定期実行されるボタンを作成したい」という要件は満たされません。

なぜなら、元のコードでは while で永久ループしているため、その下の

py

1button.bind("<Button-1>", on_button_click) 2root.mainloop()

に到達しません。したがってウィンドウ自体表示されていないのではないのでしょうか。(仮にJupyter上で実行していて、分割したセルの実行によってウィンドウを表示しているというような場合は、そのウィンドウを閉じ、Jupyterを再起動して上から順番にコードを実行してみて下さい)

ボタンをクリックしたら 定期的に関数を実行させるだけであれば、schedule モジュールと組み合わせる必要はなく、下記のように、after 関数を使って実現できます。

py

1import tkinter as tk 2from tkinter import ttk 3 4import pyautogui as pg 5import pygetwindow as gw 6import time 7# import schedule # 不要なので削除 8import threading 9# ウインドウの作成 10root = tk.Tk() 11root.title("グラフ") 12 13# ウインドウのサイズ 14root.geometry("100x100") 15 16# 起動ボタン 17button = ttk.Button(root, text = "起動") 18button.place(x = 10, y = 10) 19 20# 追加:ボタンクリック時に実行される。 21def on_button_click(event): 22 print("起動ボタンがクリックされました") 23 fnc_do_1() 24 25def fnc_do_1(): #引数「event」は不要なので削除。 26 27 # ---------------------------------------------------------------- 28 # グラフ更新 29 window = gw.getWindowsWithTitle("web")[0] 30 window.activate() 31 window.maximize() 32 for pause_num in range(10): 33 try: 34 if pg.locateOnScreen("web.png", confidence=.6): 35 break 36 except Exception as e: 37 time.sleep(5.0) 38 pg.click(135, 1000, button="left") 39 for pause_num in range(10): 40 try: 41 if pg.locateOnScreen("web.png", confidence=.6): 42 break 43 except Exception as e: 44 time.sleep(5.0) 45 pg.moveTo(823, 333) 46 pg.drag(200, 60, duration=1.0, button="left") 47 pg.hotkey("ctrl", "c") 48 graph = gw.getWindowsWithTitle("Excel")[0] 49 graph.activate() 50 graph.maximize() 51 pg.click(75, 500, button="left") 52 pg.hotkey("ctrl", "v") 53 # 1分ごとに定期実行 54 root.after(60*1000, fnc_do_1) # 追加 55 56# 削除 57# schedule.every(5).seconds.do(fnc_do_1, None) 58 59# 削除 60# while True: 61# schedule.run_pending() 62# time.sleep(1.0) 63 64# 起動ボタンクリック時に実行する関数をバインド 65button.bind("<Button-1>", on_button_click) 66 67#ウインドウ状態の維持 68root.mainloop() 69

上記のように

py

1def fnc_do_1(): 2 ... 3 ...処理 4 ... 5 root.after(60*1000, fnc_do_1)

とすることで、1分ごとに処理を繰り返すことができます。(after 関数の第一引数はミリ秒単位で指定)

投稿2022/12/30 01:31

編集2022/12/30 01:35
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hitohira

2022/12/30 01:45

解決しました!ありがとうございます!
teamikl

2022/12/30 06:10 編集

定期実行の内容次第では、遅延が積み重なるので タイマーの登録と定期処理のコードは分離して、 一度に数回分の処理を登録という風にした方が良いかもしれません。 「毎分実行」と「1分間隔で実行」では、若干挙動が異なり、 後者では定期処理自体にかかる時間が考慮されないので、1時間に60回の実行は保証されません。 例えば、ループ内に time.sleep があるので、100秒程の遅延が入る可能性があります。 そして、オフトピかもしれないけど、 もし jupyter lab での実行なら scheduler 系の拡張機能があり、 jupyter notebook 上のボタン設置等には、ipywidgets が使えます。
guest

0

google翻訳
fnc_do_1() 必要な位置引数が 1 つありません: 'event'

とおっしゃってます。

def fnc_do_1(event):

event という引数にはなにが入る(つもり)なんでしょうか

投稿2022/12/29 12:46

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問