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

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

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

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

Q&A

解決済

3回答

294閲覧

Python for文の変数の使い方

hato_robo55

総合スコア12

Python

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

0グッド

0クリップ

投稿2019/12/08 14:35

前提・実現したいこと

Pythonでニュースを表示するアプリを作っています。
スレッド処理で回しているためStringVarにニュースを書き込んでいるのですが、
下記ソースコードのfor文の部分をもう少し簡略化したいです。
配列等使用できるのでしょうか?できるなら方法教えていただきたいです。

該当のソースコード

Python3

1from tkinter import * 2import urllib.request 3from bs4 import BeautifulSoup 4import threading 5 6NewsURL = "https://news.yahoo.co.jp/pickup/rss.xml" 7def get_news(): 8 response = urllib.request.urlopen(NewsURL) 9 html = BeautifulSoup(response, 'html.parser') 10 topics = html.find_all("title") 11 link = html.find_all("link") 12 i = 0 13 for item in topics: 14 if i > 5: 15 break 16 if i == 1: 17 news1.set(" {0}".format(item.string)) 18 if i == 2: 19 news2.set(" {0}".format(item.string)) 20 if i == 3: 21 news3.set(" {0}".format(item.string)) 22 if i == 4: 23 news4.set(" {0}".format(item.string)) 24 if i == 5: 25 news5.set(" {0}".format(item.string)) 26 if i == 0: 27 news_title.set(item.string) 28 i+=1 29 time.sleep(3600) 30 31flg = threading.Event() 32flg.set() 33root = Tk() 34root.attributes("-fullscreen", True) 35 36 37news_title = StringVar() 38news_title.set("") 39news1 = StringVar() 40news1.set("取得中") 41news2 = StringVar() 42news2.set("取得中") 43news3 = StringVar() 44news3.set("取得中") 45news4 = StringVar() 46news4.set("取得中") 47news5 = StringVar() 48news5.set("取得中") 49Label(root,textvariable = news_title).pack() 50Label(root,textvariable = news1).pack() 51Label(root,textvariable = news2).pack() 52Label(root,textvariable = news3).pack() 53Label(root,textvariable = news4).pack() 54Label(root,textvariable = news5).pack() 55 56t2 = threading.Thread(target = get_news) 57t2.start() 58 59root.mainloop()

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

Python3.6.8

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

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

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

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

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

guest

回答3

0

配列等使用できるのでしょうか?

とりあえず、ここの連番が諸悪の根源。

python

1news1 = StringVar() 2news1.set("取得中") 3news2 = StringVar() 4news2.set("取得中") 5news3 = StringVar() 6news3.set("取得中") 7news4 = StringVar() 8news4.set("取得中") 9news5 = StringVar() 10news5.set("取得中")

なので、リスト化します(変数名適当)。

python

1news_list = [StringVar() for _ in range(5)] 2for news in news_list: 3 news.set("取得中")

下のラベルはこんなもんか。

python

1for news in news_list: 2 Label(root, textvariable=news).pack()

そうすると上のコールバックはこの程度で済みます。

python

1 news_title.set(topics[0].string) 2 for news, item in zip(news_list, topics[1:]): 3 news.set(item.string)

ベストではないかもしれませんが、だいぶマシになった感のあるコード全体が以下です。

python

1import time 2from tkinter import * 3import urllib.request 4from bs4 import BeautifulSoup 5import threading 6 7NewsURL = "https://news.yahoo.co.jp/pickup/rss.xml" 8def get_news(): 9 response = urllib.request.urlopen(NewsURL) 10 html = BeautifulSoup(response, 'html.parser') 11 topics = html.find_all("title") 12 link = html.find_all("link") 13 14 news_title.set(topics[0].string) 15 for news, item in zip(news_list, topics[1:]): 16 news.set(item.string) 17 18 time.sleep(3600) 19 20flg = threading.Event() 21flg.set() 22root = Tk() 23root.attributes("-fullscreen", True) 24 25 26news_title = StringVar() 27news_list = [StringVar() for _ in range(5)] 28for news in news_list: 29 news.set("取得中") 30 31Label(root,textvariable = news_title).pack() 32for news in news_list: 33 Label(root, textvariable=news).pack() 34 35t2 = threading.Thread(target = get_news) 36t2.start() 37 38root.mainloop()

投稿2019/12/08 14:59

編集2019/12/08 15:00
hayataka2049

総合スコア30933

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

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

hato_robo55

2019/12/08 16:00

わかりやすい説明ありがとうございます。勉強になりました。
guest

0

if i != 0:
news[i].set(" {0}".format(item.string))

とゆーふーに

投稿2019/12/08 14:54

y_waiwai

総合スコア87719

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

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

0

ベストアンサー

python

1 for i, item in enumerate(topics): 2 if i > 5: 3 break 4 if i == 0: 5 news_title.set(item.string) 6 else: 7 news = (news1, news2, news3, news4, news5)[i] 8 news.set(" " + item.string)

あるいは、

python

1from tkinter import * 2import urllib.request 3from bs4 import BeautifulSoup 4import threading 5import time 6 7NewsURL = "https://news.yahoo.co.jp/pickup/rss.xml" 8def get_news(): 9 response = urllib.request.urlopen(NewsURL) 10 html = BeautifulSoup(response, 'html.parser') 11 topics = html.find_all("title") 12 link = html.find_all("link") 13 for i, item in enumerate(topics): 14 if i > 5: 15 break 16 if i == 0: 17 values[i].set(item.string) 18 else: 19 values[i].set(" " + item.string) 20 time.sleep(3600) 21 22flg = threading.Event() 23flg.set() 24root = Tk() 25root.attributes("-fullscreen", True) 26 27values = [StringVar() for _ in range(6)] 28values[0].set("") 29for value in values[1:]: 30 value.set("取得中") 31 Label(root, textvariable=value).pack() 32 33t2 = threading.Thread(target=get_news) 34t2.start() 35 36root.mainloop()

投稿2019/12/08 14:44

編集2019/12/08 15:10
shiracamus

総合スコア5406

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

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

hato_robo55

2019/12/08 15:59

2通りの回答ありがとうございます。下のやつ自分のイメージ通りでした。 無事解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問