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

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

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

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

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

Q&A

1回答

5799閲覧

PySimpleGUIにてMultilineに文字を連続していれる方法

yamato-3

総合スコア0

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

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

0グッド

1クリップ

投稿2021/07/18 14:07

編集2021/07/19 04:18

前提・実現したいこと

python(PySimpleGUI)にて、Twitter関連のデスクトップアプリを個人で作成しています。
TwitterAPIでTwitter側から来た内容を、順次テキストボックス(Multiline)に入れたいと思っているのですが、上手く入りません。

sg.Multilineに文字を入れる機能を実装中に以下のエラーメッセージが発生しました。

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

ERROR Key Error line 112 win[''].update("") Problem finding your key Closest match=None

該当のソースコード

「PYTHON 3.9.4」

ソースコード

python

1import PySimpleGUI as sg 2import time 3import tweepy 4 5from PySimpleGUI.PySimpleGUI import Window, popup 6 7 8frame1 = sg.Frame('検索', [[sg.Text('キーワード', size=(15,1))], 9 [sg.InputText(key='keyword'),sg.Submit(button_text='開始')], 10 [sg.Multiline(default_text='',size=(42,9),border_width=2, key='tx1'),sg.Submit(button_text='停止')], 11 ],) 12 13 14# 画面レイアウトを指定 15layout = [ 16 [sg.Text('*****')], 17 18 [frame1], 19 [sg.Button('終了')] 20 21 ] 22 23# ウィンドウを表示する関数 24def show_window(): 25 26 win = sg.Window('Twitter AUTO', layout) 27 text = "" 28 29# イベントループ 30 while True: 31 event, values = win.read() 32 33 if event is None: break 34 35if event == '開始': 36 37auth = tweepy.OAuthHandler(CK, CKS) 38 auth.set_access_token(AT, ATS) 39 api = tweepy.API(auth) 40 41 query = values['keyword'] 42 results = api.search(q=query, count=100) 43 44 45 for result in results: 46 screen_name = result.user.screen_name 47 48 49 text = screen_name + "\n" + text 50 win['tx1'].update(text) 51 win[''].update("") 52 53 54 55 for i in range(3): 56 try: 57 api.create_friendship(screen_name) 58 59 60 print('成功') 61 except tweepy.RateLimitError as e: 62 print(e) 63 time.sleep(15 * 60) 64 except tweepy.TweepError as e: 65 print(e) 66 break 67 else: 68 time.sleep(5) 69 break 70 71show_window()

試したこと

エラー発生個所

text = screen_name + "\n" + text win['tx1'].update(text) win[''].update("")

■win[''].update("")
このコードは苦肉の策といいますか、このコードはいらないはずなのですが、これを入れると理由は分かりませんが、エラー(ERROR Key Error)が表示され、エラーが出るたびにCloseボタンを押すと、sg.Multilineに、順次文字(文字)が入っていきます。

アドバイス頂けたら有難いです。

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

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

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

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

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

y_waiwai

2021/07/18 15:17

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答1

0

Multiline に文字列を追加するには、printメソッドを使います。

diff

1- win['tx1'].update(text) 2+ win['tx1'].print(text)

後、別問題ですが、イベントループ内での「時間の掛かるfor文」 「time.sleep による待機」は、
イベントループが停止する(GUIが一時的に応答なし)為、スレッドを使いましょう。

sleep でイベントループに処理が戻ってない間は、
GUI への描画も反映もされませんし、操作も受け付けなくなります。

win[''].update("") で別のエラーを出すことで、
後半の問題のあるコードを実行せずに飛ばしてるだけなので、これだけでは完全な問題解決にはなりません。

解決策: 「開始」ボタンを押したときの処理、tweepy を使ったコード全体を別スレッドで処理するように、プログラムを変更する。

参考: 公式のデモコード

  • (Do Long Task ボタンを押した時) Thread を使い、時間のかかる処理は別スレッドで行う。

 long_operation_thread 関数を別スレッドで実行。

  • 別スレッド内では時間のかかる処理、待機処理を行っても、

 GUIのイベントループを阻害しないため、問題有りません。

  • 別スレッドでGUIを直接変更はスレッドセーフな操作ではないので、

 GUIへの反映はイベントループ側で行う。→ write_event_value で独自のイベントを通知。

質問のケースに適応すると、

  1. tweepy での処理を別スレッドで行う。

(long_operation_thread関数に当たる部分、関数名は何でも良い)

  1. tweepy での検索結果は、別スレッド側で直接 Multiline へは反映させない。

(マルチスレッドで安全な操作ではない為、稀に問題がおきる可能性がある。)
write_event_value を使い、イベントとしてメインスレッドのイベントループに送ります、

  1. 別スレッドから write_event_value で送られたイベントを受けて、

メッセージを Multiline へ反映させる。

投稿2021/07/18 17:12

編集2021/07/19 06:18
teamikl

総合スコア8679

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

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

yamato-3

2021/07/18 23:37

返信ありがとうございます。 >sleep でイベントループに処理が戻ってない間は、 >GUI への描画も反映もされませんし、操作も受け付けなくなります。 ですよね、、有難うございます、理解出来ました。 >tweepy を使ったコード全体を別スレッドで処理する すみません、ここの別スレッドで処理するがイマイチ理解できていません。 ご教授頂けたら有難いです。
teamikl

2021/07/19 04:17

具体的にどの部分の何が理解できないのでしょうか? - 別スレッドで処理する方法(コード)がわからない → デモコード参照 - 別スレッドで処理しなければならない理由がわからない  → 回答参照: イベントループ内で時間のかかる処理は、GUIが応答なしになるため
yamato-3

2021/07/20 01:29

有難うございます。 いろいろ試して、また質問させてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問