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

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

ただいまの
回答率

90.62%

  • Python

    7439questions

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

  • Python 3.x

    5848questions

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

  • Tkinter

    135questions

    Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

tkinterのLabelのテキストが変更されない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 165

ryota_adr

score 9

 前提・実現したいこと

tkinterでtwitterの自動いいねとRTをするbotを作っています。
テキストファイルから自動いいね、RTをするアカウントのリストを読み込んで、Textで作ったリストに表示させる時に、ファイルの読み込み状況を表示しようとしているのですが、うまく動きません。

add_like_list_from_file()を実行してから、リストにアカウントが追加されるまでに、少し時間がかかるので、読み込んでいる間はLabelに「読込状況:リストに追加中」と表示させ、リストへの追加が終わったら、「読込状況:リストに追加しました」と表示されるようにしようと思っています。

ですが、add_like_list_from_file()でアカウントをいいねリストに追加しようとすると、「読込状況:リストに追加中」が表示されず、いいねリストにアカウントが表示されると同時に「読込状況:リストに追加しました」と表示されます。

threadingを使えばいいのかと思ってMyThreadクラスを作り、self.state_label.configure(text="読込状況:リストに追加中")をself.mt.start()に変えてみたのですが、今度はアカウントがリストに表示されると同時に「読込状況:リストに追加中」が表示され、「読込状況:リストに追加しました」は表示されませんでした。

add_like_list_from_file()を実行すると、「読込状況:リストに追加中」が表示され、アカウントがリストに追加されたら、「読込状況:リストに追加しました」が表示されるにはどうすればいいでしょうか?

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

エラーメッセージ

 該当のソースコード

from tkinter import *
import tkinter.messagebox as messagebox
import tkinter.filedialog as filedialog
import tweepy
import pickle
import os.path
import threading



class TwitterApp(Frame):
    def __init__(self, master, ck, cs, at, ats):
        self.seconds = 60
        self.minutes = 10
        self.list_height = 200

        Frame.__init__(self, master)

        self.auth = tweepy.OAuthHandler(ck, cs)
        self.auth.set_access_token(at, ats)
        self.api = tweepy.API(self.auth)
        self.mt = MyThread()

        self.master = master
        self.master.title("TwitterApp")
        self.master.geometry("400x300")
        self.frame = Frame(self.master, width=400, height=350)
        self.frame.place(x=0, y=0)
        self.frame_search_and_file = Frame(self.frame, width=400, height=100)
        self.frame_search_and_file.place(x=0, y=0)

        self.autolike_set = set()

        #読み込み状況
        self.state_label = Label(self.frame, text="読込状況:")
        self.state_label.place(x=200, y=30)
        #いいねリスト
        self.label_like = Label(self.frame, text="いいねリスト")
        self.label_like.place(x=60, y=55)
        self.canvas_like = Canvas(self.frame, width=200, height=200, bd=2, bg='white',\
            highlightthickness=0)
        self.frame_like = Frame(self.canvas_like, width=180, height=self.list_height, \
            bg='white')
        self.scrollbar_like = Scrollbar(self.frame, orient="vertical", \
            command=self.canvas_like.yview)
        self.canvas_like.configure(yscrollcommand=self.scrollbar_like.set)
        self.scrollbar_like.place(x=172, y=75, height=self.list_height+4)
        self.canvas_like.place(x=5, y=75)
        self.canvas_like.create_window((0,0), window=self.frame_like, anchor='nw')
        self.frame_like.bind("<Configure>", self.canvas_like_config)

        #RTリスト
        self.label_rt = Label(self.frame, text="RTリスト")
        self.label_rt.place(x=260, y=55)
        self.canvas_rt = Canvas(self.frame, width=200, height=200, bd=2, bg='white', \
            highlightthickness=0)
        self.frame_rt = Frame(self.canvas_rt, width=180, height=self.list_height, bg='white')
        self.scrollbar_rt = Scrollbar(self.frame, orient="vertical", \
            command=self.canvas_rt.yview)
        self.canvas_rt.configure(yscrollcommand=self.scrollbar_rt.set)
        self.scrollbar_rt.place(x=367, y=75, height=self.list_height+4)
        self.canvas_rt.place(x=200, y=75)
        self.canvas_rt.create_window((0,0), window=self.frame_rt, anchor='nw')
        self.frame_rt.bind("<Configure>", self.canvas_rt_config)

        #テキストファイルからユーザーを追加
        self.file = None
        self.filename = StringVar()
        self.filename.set("ファイル名")
        self.label_file = Label(self.frame_search_and_file, textvariable=self.filename, \
            font=("", 12), width=12, bg="white", bd=1, relief=RIDGE)
        self.label_file.bind("<Button-3>", self.occur_menu)
        self.label_file.place(x=200, y=3)
        self.button_file = Button(self.frame_search_and_file, text="ファイルを選択", \
            command=self.select_file)
        self.button_file.place(x=310, y=0)
        self.select_file_menu = Menu(self.frame_search_and_file, tearoff=False)
        self.select_file_menu.add_cascade(label="いいねリストに追加", \
            command=self.add_like_list_from_file)
        self.select_file_menu.add_cascade(label="RTリストに追加", \
            command=self.add_rt_list_from_file)
        self.select_file_menu.add_cascade(label="両方に追加する", \
            command=self.add_both_list_from_file)

    #Canvasにスクロールバーを設置
    def canvas_like_config(self, event):
        self.canvas_like.configure(scrollregion=self.canvas_like.bbox("all"), width=180, \
            height=self.list_height)

    def canvas_rt_config(self, event):
        self.canvas_rt.configure(scrollregion=self.canvas_rt.bbox("all"), width=180, \
            height=self.list_height)

    #ユーザーが存在しないときのエラーメッセージ
    def user_not_found(self):
        self.m = messagebox.showerror('showerror','そのユーザーは存在しません')

    #ファイルを選択
    def select_file(self):
        self.filetype = [("","*")]
        self.iDir = os.path.abspath(os.path.dirname(__file__))
        self.file = filedialog.askopenfilename(filetypes=self.filetype, initialdir=self.iDir)
        self.filename.set(os.path.basename(self.file))

    #メニューを表示
    def occur_menu(self, event):
        self.select_file_menu.post(event.x_root, event.y_root)

    #テキストファイルからいいねリストにユーザーを追加
    def add_like_list_from_file(self):
        if self.file is not None and os.path.splitext(self.file)[1] == '.txt':
            self.state_label.configure(text="読込状況:リストに追加中")
            with open(self.file, 'r', encoding='utf-8') as f:
                self.like_name_list = f.readlines()
            for likename in self.like_name_list:
                likename = likename.replace('\ufeff', '')
                likename = likename.replace('\n', '')
                if likename not in self.autolike_set:
                    try:
                        self.api.get_user(screen_name=likename)
                        self.autolike_set.add(likename)
                        LikeNameText(self.frame_like, likename)
                    except tweepy.error.TweepError:
                        pass
            self.state_label.configure(text="読込状況:リストに追加しました")

    #テキストファイルからRTリストにユーザーを追加
    def add_rt_list_from_file(self):
        if self.file is not None and os.path.splitext(self.file)[1] == '.txt':
            self.mt.start()
            with open(self.file, 'r', encoding='utf-8') as f:
                self.rt_name_list = f.readlines()
            for rtname in self.rt_name_list:
                rtname = rtname.replace('\ufeff', '')
                rtname = rtname.replace('\n', '')
                if rtname not in self.autoRT_set:
                    try:
                        self.api.get_user(screen_name=rtname)
                        self.autoRT_set.add(rtname)
                        RTNameText(self.frame_rt, rtname)
                    except tweepy.error.TweepError:
                        pass
            self.state_label.configure(text="読込状況:リストに追加したました")

    #テキストファイルから両方のリストにユーザーを追加
    def add_both_list_from_file(self):
        if self.file is not None:
            self.add_like_list_from_file()
            self.add_rt_list_from_file()




#いいねリストのText
class LikeNameText():
    def __init__(self, master, name):
        self.master = master 
        self.name = name


        #tkinterで表示できない文字を消す
        self.chr_list =  [self.name[j] for j in range(len(self.name)) \
            if ord(self.name[j]) in range(65536)]
        self.name = ''
        for i,j in enumerate(self.chr_list):
            self.name = self.name + j

        self.text = Text(self.master, bd=0, width=20, height=1, \
            padx=5)
        self.text.insert('1.0', self.name)
        self.text.configure(state=DISABLED)
        self.text.bind("<Button-3>", self.occur_menu)
        self.text.pack()
        self.add_set()

        self.menu = Menu(self.master, tearoff=False)
        self.menu.add_cascade(label='リストから削除する', command=self.delete_text)

    def add_set(self):
        t.autolike_set.add(self.name)

    def delete_text(self):
        if len(t.autolike_set) > 0:
            t.autolike_set.remove(self.name)
            self.text.destroy()

    def occur_menu(self, event):
        self.menu.post(event.x_root, event.y_root)

#RTリストのText
class RTNameText(LikeNameText):
    def add_set(self):
        t.autoRT_set.add(self.name)

    def delete_text(self):
        if len(t.autoRT_set):
            t.autoRT_set.remove(self.name)
            self.text.destroy()

class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        t.state_label.configure(text="読込状況:リストに追加中")



if __name__ == '__main__':
    ck = ""
    cs = ""
    at = ""
    ats = ""

    master = Tk()
    t = TwitterApp(master, ck, cs, at, ats)
    t.pack()
    master.mainloop()

 試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7439questions

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

  • Python 3.x

    5848questions

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

  • Tkinter

    135questions

    Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。