タイトルに書いてある動きを再現したいのですがなかなかうまくいきません。
例えばメインのフレームにtextとボタンだけがあってボタンのイベント内容は
python
1def mozi_test(event): 2 print('こんにちは') 3 time.sleep(2) 4 print('ありがとう')
のようなイベントだとして、この状態でボタンを押してもコマンドプロンプトに
こんにちはの2秒後にありがとうが表示されるだけだと思います。
この表示をtkinter内にプリントする事は可能でしょうか?
ご存知の方いらっしゃいましたらよろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
Tkinterに限らず一般に典型的なGUIアプリは、
- まず決まった画面構成を作り初期表示
- ユーザーの操作によって画面を構成する部品の状態(表示内容だの色だのの見栄え)を変化させる
という具合に設計します。tkinter.Entry、tkinter.Text、tkinter.Labelなどのウィジェットがテキストを表示できますのでそれらを使うとよいでしょう。また一定時間経過後になにかしたいならafterメソッドを用います。sleepは通常使いません。理由はsleepしてしまうとその間ユーザーの操作を受け付けなくなってしまうからです。ということでTextを用いた簡単なサンプルを書いてみました。
Python
1import tkinter as tk 2 3 4class App(tk.Frame): 5 def __init__(self, master, *args, **kwargs): 6 super().__init__(master, *args, **kwargs) 7 self.pack(side=tk.TOP, fill=tk.BOTH, expand=True) 8 9 self.text = tk.Text(self, width=40, height=10) 10 self.text.pack(side=tk.TOP) 11 self.text.insert(tk.END, 'hello\n') 12 13 self.button = tk.Button(self, text='button', command=self.on_click) 14 self.button.pack(side=tk.TOP) 15 16 def on_click(self): 17 self.text.insert(tk.END, 'clicked\n') 18 self.after(2000, self.on_expired) 19 20 def on_expired(self): 21 self.text.insert(tk.END, 'expired\n') 22 23 24if __name__ == '__main__': 25 root = tk.Tk() 26 App(root) 27 root.mainloop()
このサンプルで2回連続してボタンをクリックしてみてください。sleepを使うとこういう動きができないということを覚えておくと良いと思います。
投稿2018/06/02 22:51
総合スコア18394
0
おはようございます。
問題文読ませていただきました。
こんな感じでいかがでしょうか?
python
1import tkinter as tk 2 3 4class App(tk.Frame): 5 # text Widgetの末尾に「こんにちは」を追記する関数 6 def onClick(self): 7 # text Widgetの末尾に「こんにちは」を追記する。 8 # tk.End : 末尾 9 self.text.insert(tk.END, 'こんにちは\n') 10 # after関数を利用して、2秒後にonExpired関数を実行する。 11 # 第一引数 : どのくらい遅らせて第二引数を実行するのか、時間設定する(単位はミリ秒) 12 # 第二引数 : 実行する関数名 13 # afterについて : https://kuroro.blog/python/ngQRGzqfuyK8WaCwkGid/ 14 self.after(2000, self.onExpired) 15 16 # text Widgetの末尾に「ありがとう」を追記する関数 17 def onExpired(self): 18 # text Widgetの末尾に「ありがとう」を追記する。 19 # tk.End : 末尾 20 self.text.insert(tk.END, 'ありがとう\n') 21 22 def __init__(self, master): 23 super().__init__(master) 24 25 # Windowを親要素として、frame Widget(Frame)を作成する。 26 # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/ 27 frame = tk.Frame(self.master) 28 # Windowを親要素として、frame Widget(Frame)をどのように配置するのか? 29 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 30 frame.grid() 31 32 # frame Widget(Frame)を親要素として、text Widgetを作成する。 33 # width : 幅の設定 34 # height : 高さの設定 35 # Textについて : https://kuroro.blog/python/bK6fWsP9LMqmER1CBz9E/ 36 self.text = tk.Text(frame, width=40, height=10) 37 # frame Widget(Frame)を親要素として、text Widgetをどのように配置するのか? 38 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 39 self.text.grid() 40 # text Widgetの初期値として、piyoの値を格納する。 41 self.text.insert(tk.END, 'piyo\n') 42 43 # frame Widget(Frame)を親要素として、button Widgetを作成する。 44 # text : テキスト情報 45 # command : ボタンをクリックした場合に、実行する関数を設定 46 # Buttonについて : https://kuroro.blog/python/oFju6EngDtcYtIiMIDf1/ 47 button = tk.Button(frame, text='button', command=self.onClick) 48 # frame Widget(Frame)を親要素として、button Widgetをどのように配置するのか? 49 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 50 button.grid() 51 52 53if __name__ == '__main__': 54 # Windowを描画する。 55 root = tk.Tk() 56 App(root) 57 # Windowをループさせて、継続的にWindow表示させる。 58 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/ 59 root.mainloop()
ご確認のほど、よろしくお願いいたします。????♂️
投稿2021/06/12 01:52
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
tkinterで文字を出力は'print'では無いのでは?
例えばtextboxならば
tkinter
1 Editbox.insert()
とか
labelならば
tkinter
1 tkinter.label(text=u"出したい文字")
など。(Editboxとかtkinter.labelなどは任意の物を使って)
投稿2018/06/02 20:50
総合スコア3747
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/02 23:16