Tkinterにてボタンが押されるまで次の処理を待機したい


TkinterとSeleniumを使ったアプリケーションで，スタートを押すとChromeが起動し，スタートを押すと  
`input('>何かを入力すると，コンソールにp要素のテキストを表示')`  
が動作し，コンソールでエンターキーなりを押すまでp要素の取得を待ちます．  
次に  
`input('>何かを入力すると，コンソールにh2要素のテキストを表示')`  
が動作し，同じくh2要素の取得を待ちます．

このような動作の「コンソールでエンターキーなりを押す」を「次へボタンを押す」に対応させて，次へボタンを押すまで次の処理を待つといった処理を行いたいのですが，どのように実装すればよいでしょうか．

処理を止めたい理由は，出力を一つずつ，目視で確認した後に，次の処理へ進むようにしたいためです．

現状，next()は何も行いませんが，本来は次へボタンを押すとnext()が動作し，次の処理へ進めればと思っています．

  * 処理１  
next()が実行されるまで待つ

  * 処理2  
next()が実行されるまで待つ

  * 処理3  
︙

※処理のあとにウィンドウが閉じてしまうのを防ぎたいわけではありません．

ご教示くださいませ．

[![画像の説明をここに入力](https://i.stack.imgur.com/nvWXu.jpg)](https://i.stack.imgur.com/nvWXu.jpg)

[code]

    import ctypes
    import tkinter as tk
    import tkinter.ttk as ttk
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.chrome.service import Service
    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.chrome.options import Options
    
    try:
        ctypes.windll.shcore.SetProcessDpiAwareness(True)
    except BaseException:
        pass
    
    
    def next():
        pass
    
    
    def start():
        global driver
    
        chrome_options = Options()
        chrome_options.add_experimental_option("detach", True)
    
        driver = webdriver.Chrome(
            service=Service(ChromeDriverManager().install()),
            options=chrome_options
        )
    
        driver.get('https://scrape-b276b.web.app/')
        input('>何かを入力すると，コンソールにp要素のテキストを表示')
        print(driver.find_element(By.CSS_SELECTOR, '#app > div > main > div > div > div > div > section > div.text > p').text)
        input('>何かを入力すると，コンソールにh2要素のテキストを表示')
        print(driver.find_element(By.CSS_SELECTOR, 'h2').text)
        input('>何かを入力すると，終了')
    
    
    def main():
        frame = tk.Tk()
        frame.title('title')
        frame.geometry("230x60+400+440")
    
        button1 = ttk.Button(frame, text='次へ', command=next)
        button1.place(x=10, y=10, width=100)
        button2 = ttk.Button(frame, text='スタート', command=start)
        button2.place(x=120, y=10, width=100)
    
        frame.mainloop()
    
    
    if __name__ == '__main__':
        main()
    
[/code]




「Tkinterにてボタンが押されるまで次の処理を待機する方法」というのはTkinterの基本的な機能として備わっているもので、ユーザーの作成するプログラム上で後から追加するものではありません。

質問のプログラムで言えば`frame.mainloop()`の行が実行されることで開始し、これが実行されている間はボタンや他のウィジェット・マウス・キーボード等のイベント発生を待ち、発生したイベントに対応する処理がデフォルトで存在したりユーザープログラムから登録されていればそれを呼び出す動作をしています。  
こんな記事に解説があります。  
[【Python】tkinterのmainloopについて解説](https://daeudaeu.com/mainloop/)

なので質問のようなプログラムで「`def
start():`関数の中でサイトを表示させかつボタンのクリックを待って処理を進めて行く」というのはGUI的には行儀の悪い振る舞いであり、Tkinterを使う意味が無いようなやり方です。

GUI的には前の質問の回答やこの質問のコメントで示したように、以下のようにすれば良いでしょう。

  * `def start():`関数はサイト表示を行うだけ
  * サイト内の要素を検索して表示する作業にはそれぞれ専用のボタンと関数を必要な数だけ用意して個々に呼び出す
  * 処理順番が決まっているならボタンのテキストに対応する数値を表示しておく

それでもボタンを1個で済ませたいならば、処理を何処まで行ったかを示す変数を用意して以下のように変数を判定して処理を変えるといった方法が考えられます。  
変更する部分だけ提示して前後は省略します。

[code]

    import traceback
    phase = -1  #### 処理の段階を保存する変数：-1はブラウザが起動していない状態
    def next():
        global phase  #### グローバル変数を使用する宣言
    
        #### 以下は処理の段階を保存する変数の値に従ってそれぞれの処理を行い、変数を次の段階に進める
        try:
            if phase == 0:
                print('最初の「次へ」がクリックされたので，コンソールにp要素のテキストを表示')
                print(driver.find_element(By.CSS_SELECTOR, '#app > div > main > div > div > div > div > section > div.text > p').text)
                phase += 1  #### 変数を次の段階へ
            elif phase == 1:
                print('２回目の「次へ」がクリックされたので，コンソールにh2要素のテキストを表示')
                print(driver.find_element(By.CSS_SELECTOR, 'h2').text)
                phase += 1  #### 変数を次の段階へ
            elif phase == 2:
                print('３回目の「次へ」がクリックされたので，ブラウザを終了')
                phase = -1  #### 変数をブラウザ起動前の段階へ
                driver.quit()
        except Exception as e:
            print(f'{phase}段階の処理で {e.__class__.__name__}例外が発生')
            print(traceback.format_exc())
            phase += 1  #### 変数を次の段階へ
            if phase > 2:
                phase = -1  #### 範囲オーバーなので変数をブラウザ起動前の段階へ
            pass
    
    def start():
        global driver
        global phase  #### グローバル変数を使用する宣言
    
        chrome_options = Options()
        chrome_options.add_experimental_option("detach", True)
    
        driver = webdriver.Chrome(
            service=Service(ChromeDriverManager().install()),
            options=chrome_options
        )
        driver.get('https://scrape-b276b.web.app/')
    
        print('ブラウザが起動し，サイトが表示されて準備完了')
        phase = 0  #### 変数を最初の段階に設定
    
[/code]

