個人プロジェクト 演劇×デジファブ

自分の過去のツイートから特定の舞台のハッシュタグだけ登録して観劇感想ツイート検索できないか

イメージ画像 (身バレ防止であえて個人アカウント名表示しないようにしています)
chat GPTの助けを借りてpythonでシステムを作ってみる
好きなハッシュタグのボタンを作って、押したら自分の投稿からリンクに飛べる段階まではできた
日本語入力ができない → 日本語入力可にする必要がある

初期コード▽

  1. import kivy
  2. from kivy.app import App
  3. from kivy.uix.boxlayout import BoxLayout
  4. from kivy.uix.textinput import TextInput
  5. from kivy.uix.button import Button
  6. import webbrowser
  7. kivy.require('1.11.1')
  8. class LinkOpenerApp(App):
  9.     def __init__(self, **kwargs):
  10.         super().__init__(**kwargs)
  11.         self.links = []
  12.     def build(self):
  13.         self.layout = BoxLayout(orientation='vertical')
  14.         self.input_text1 = TextInput(
  15.             hint_text='enter your account name without "@"')
  16.         self.input_text2 = TextInput(
  17.             hint_text='enter a hashtag without "#"')
  18.         self.add_button = Button(text='create')
  19.         self.add_button.bind(on_press=self.add_link)
  20.         self.remove_button = Button(text='remove')
  21.         self.remove_button.bind(on_press=self.remove_link)
  22.         self.layout.add_widget(self.input_text1)
  23.         self.layout.add_widget(self.input_text2)
  24.         self.layout.add_widget(self.add_button)
  25.         self.layout.add_widget(self.remove_button)
  26.         return self.layout
  27.     def add_link(self, instance):
  28.         hashtag = self.input_text2.text.strip()
  29.         if hashtag:
  30.             link_button = Button(text=f'#{hashtag}')
  31.             link_button.bind(on_press=lambda x, link=hashtag: self.open_link(link))
  32.             self.links.append(link_button)
  33.             self.layout.add_widget(link_button)
  34.         self.input_text2.text = ''
  35.     def remove_link(self, instance):
  36.         if self.links:
  37.             last_link_button = self.links.pop()
  38.             self.layout.remove_widget(last_link_button)
  39.     def open_link(self, hashtag):
  40.         acn = self.input_text1.text.strip()
  41.         if hashtag:
  42.             search_url = f'https://twitter.com/search?q=from%3A{acn}%20%23{hashtag}&src=typed_query&f=top'
  43.             webbrowser.open(search_url)
  44. if __name__ == '__main__':
  45.     LinkOpenerApp().run()

イメージ画像

閉じる△

次に取り組むこと

  1. 日本語入力・検索できない問題▽
    1. そもそもkivyは日本語対応していない。ネットで検索したらkivyで日本語表示できるモジュール「japanize_kivy」を作ってる方がいた。
      参考:Python: インポートするだけで Kivy が日本語を表示できるようになる japanize-kivy を作った(外部サイト)
    2. キーワードをウインドウに入力できるようになったが、キーワードをURLに変換するときに日本語が文字化けする
      日本語入力をうまくエンコードできていない
      ※全角日本語や特定の記号はURLで使用できないので符号化(エンコード)する必要がある。
    1. import japanize_kivy
    2. import urllib.parse
    3. import kivy
    4. from kivy.app import App
    5. from kivy.uix.boxlayout import BoxLayout
    6. from kivy.uix.textinput import TextInput
    7. from kivy.uix.button import Button
    8. import webbrowser
    9. kivy.require('1.11.1')
    10. class LinkOpenerApp(App):
    11.     def __init__(self, **kwargs):
    12.         super().__init__(**kwargs)
    13.         self.links = []
    14.     def build(self):
    15.         self.layout = BoxLayout(orientation='vertical')
    16.         self.input_text1 = TextInput(
    17.             hint_text='enter your account name without "@"')
    18.         self.input_text2 = TextInput(
    19.             hint_text='enter a hashtag without "#"')
    20.         self.add_button = Button(text='create')
    21.         self.add_button.bind(on_press=self.add_link)
    22.         self.remove_button = Button(text='remove')
    23.         self.remove_button.bind(on_press=self.remove_link)
    24.         self.layout.add_widget(self.input_text1)
    25.         self.layout.add_widget(self.input_text2)
    26.         self.layout.add_widget(self.add_button)
    27.         self.layout.add_widget(self.remove_button)
    28.         return self.layout
    29.     def add_link(self, instance):
    30.         hashtag = self.input_text2.text.strip()
    31.         if hashtag:
    32.             link_button = Button(text=f'#{hashtag}')
    33.             link_button.bind(on_press=lambda x, link=hashtag: self.open_link(link))
    34.             self.links.append(link_button)
    35.             self.layout.add_widget(link_button)
    36.         self.input_text2.text = ''
    37.     def remove_link(self, instance):
    38.         if self.links:
    39.             last_link_button = self.links.pop()
    40.             self.layout.remove_widget(last_link_button)
    41.     def open_link(self, hashtag):
    42.         hashtag = urllib.parse.quote(hashtag) # キーワードをエンコード
    43.         acn = self.input_text1.text.strip()
    44.         if hashtag and acn:
    45.             # エンコードされたキーワードとアカウント名を使用してURLを生成
    46.             search_url = f'https://twitter.com/search?q=from%3A{acn}%20%23{hashtag}&src=typed_query&f=top'
    47.             webbrowser.open(search_url)
    48. if __name__ == '__main__':
    49.     LinkOpenerApp().run()

    閉じる△
  2. ボタンの色付けや画面のレイアウト▽
    1. import japanize_kivy
    2. import urllib.parse
    3. import kivy
    4. from kivy.app import App
    5. from kivy.uix.boxlayout import BoxLayout
    6. from kivy.uix.textinput import TextInput
    7. from kivy.uix.button import Button
    8. from kivy.core.window import Window
    9. import webbrowser
    10. kivy.require('1.11.1')
    11. class LinkOpenerApp(App):
    12.     def __init__(self, **kwargs):
    13.         super().__init__(**kwargs)
    14.         self.links = []
    15.     def build(self):
    16.         # ウィンドウの背景色を白に設定
    17.         #Window.clearcolor = (1, 1, 1, 1)
    18.         self.layout = BoxLayout(orientation='vertical')
    19.         self.input_text1 = TextInput(
    20.             hint_text='"@"なしでアカウントIDを入力してください',
    21.             size_hint_y=None,
    22.             height=400
    23.         )
    24.         self.input_text2 = TextInput(
    25.             hint_text='"#"なしでハッシュタグ名を入力してください',
    26.             size_hint_y=None,
    27.             height=300
    28.         )
    29.         self.add_button = Button(
    30.             text='タグを追加',
    31.             background_color=(0, 0, 1, 1), # オレンジの背景色 rgbaで表示、ボタンはデフォルトでグレー設定
    32.             color=(1, 1, 1, 1), # 白の文字色
    33.             height = 300,
    34.         )
    35.         self.add_button.bind(on_press=self.add_link)
    36.         self.remove_button = Button(
    37.             text='タグを削除',
    38.             background_color=(1, 0.5, 0, 1), # オレンジの背景色
    39.             color=(1, 1, 1, 1), # 白の文字色
    40.             height = 400
    41.         )
    42.         self.remove_button.bind(on_press=self.remove_link)
    43.         # createボタンとremoveボタンを横に並べる
    44.         button_layout = BoxLayout(orientation='horizontal', size_hint_y=None, height=40)
    45.         button_layout.add_widget(self.add_button)
    46.         button_layout.add_widget(self.remove_button)
    47.         self.layout.add_widget(self.input_text1)
    48.         self.layout.add_widget(self.input_text2)
    49.         self.layout.add_widget(button_layout) # ボタンを追加
    50.         return self.layout
    51.     def add_link(self, instance):
    52.         hashtag = self.input_text2.text.strip()
    53.         if hashtag:
    54.             link_button = Button(
    55.                 text=f'#{hashtag}',
    56.                 background_color=(1, 0.5, 0, 1), # オレンジの背景色
    57.                 color=(1, 1, 1, 1), # 白の文字色
    58.                 height = 200
    59.             )
    60.             link_button.bind(on_press=lambda x, link=hashtag: self.open_link(link))
    61.             self.links.append(link_button)
    62.             self.layout.add_widget(link_button)
    63.         self.input_text2.text = ''
    64.     def remove_link(self, instance):
    65.         if self.links:
    66.             last_link_button = self.links.pop()
    67.             self.layout.remove_widget(last_link_button)
    68.     def open_link(self, hashtag):
    69.         hashtag = urllib.parse.quote(hashtag) # キーワードをエンコード
    70.         acn = self.input_text1.text.strip()
    71.         if hashtag and acn:
    72.             # エンコードされたキーワードとアカウント名を使用してURLを生成
    73.             search_url = f'https://twitter.com/search?q=from%3A{acn}%20%23{hashtag}&src=typed_query&f=top'
    74.             webbrowser.open(search_url)
    75. if __name__ == '__main__':
    76.     LinkOpenerApp().run()

    閉じる△
  3. ボタン登録画面と検索ボタン陳列画面を分ける▽
    kivy Screen Manage:複数の画面を管理するウィジェット。デフォルトだと一つの画面を表示した中で別の画面に切り替わることができる。

    python
    1. from kivy.app import App
    2. from kivy.uix.boxlayout import BoxLayout
    3. from kivy.uix.textinput import TextInput
    4. from kivy.uix.button import Button
    5. from kivy.uix.screenmanager import ScreenManager, Screen
    6. import webbrowser
    7. import japanize_kivy
    8. import urllib.parse
    9. class MyApp(App):
    10.     def build(self):
    11.         return MyBoxLayout()
    12. class MyBoxLayout(BoxLayout):
    13.     def __init__(self, **kwargs):
    14.         super(MyBoxLayout, self).__init__(**kwargs)
    15.         self.orientation = 'vertical'
    16.         self.button_create = Button(text='create', on_press=self.show_page_1)
    17.         self.button_showlist = Button(text='showlist', on_press=self.show_page_2)
    18.         self.button_close = Button(text='close', on_press=self.close_app)
    19.         self.add_widget(self.button_create)
    20.         self.add_widget(self.button_showlist)
    21.         self.add_widget(self.button_close)
    22.         self.screen_manager = ScreenManager()
    23.         self.page_1 = Page1(name='page_1')
    24.         self.page_2 = Page2(name='page_2')
    25.         self.screen_manager.add_widget(self.page_1)
    26.         self.screen_manager.add_widget(self.page_2)
    27.         self.add_widget(self.screen_manager)
    28.     def show_page_1(self, instance):
    29.         self.screen_manager.current = 'page_1'
    30.     def show_page_2(self, instance):
    31.         self.screen_manager.current = 'page_2'
    32.     def close_app(self, instance):
    33.         App.get_running_app().stop()
    34. class Page1(Screen):
    35.     def __init__(self, **kwargs):
    36.         super(Page1, self).__init__(**kwargs)
    37.         self.layout = BoxLayout(orientation='vertical')
    38.         self.text_input1 = TextInput(hint_text='enter your account name without "@"')
    39.         self.text_input2 = TextInput(hint_text='enter a hashtag without "#"')
    40.         self.button_add = Button(text='add', on_press=self.add_yellow_button)
    41.         self.layout.add_widget(self.text_input1)
    42.         self.layout.add_widget(self.text_input2)
    43.         self.layout.add_widget(self.button_add)
    44.         self.add_widget(self.layout)
    45.     def add_yellow_button(self, instance):
    46.         page_2 = self.manager.get_screen('page_2')
    47.         hashtag = self.text_input2.text
    48.         yellow_button = Button(text=f'{hashtag}', on_press=self.search_google)
    49.         page_2.layout.add_widget(yellow_button)
    50.     def go_to_page_1(self, instance):
    51.         self.manager.current = 'page_1'
    52.     def search_google(self, instance):
    53.         acn = self.text_input1.text
    54.         hashtag = self.text_input2.text
    55.         hst = urllib.parse.quote(hashtag) # キーワードをエンコード
    56.         webbrowser.open(f'https://twitter.com/search?q=from%3A{acn}%20%23{hst}&src=typed_query&f=top')
    57. class Page2(Screen):
    58.     def __init__(self, **kwargs):
    59.         super(Page2, self).__init__(**kwargs)
    60.         self.layout = BoxLayout(orientation='vertical')
    61.         self.add_widget(self.layout)
    62. if __name__ == '__main__':
    63.     MyApp().run()

    kivy
    1. <MyBoxLayout>:
    2.     orientation: 'vertical'
    3.     Button:
    4.         text: 'red'
    5.         on_press: root.show_page_1(self)
    6.     Button:
    7.         text: 'green'
    8.         on_press: root.show_page_2(self)
    9.     Button:
    10.         text: 'blue'
    11.         on_press: root.close_app(self)
    12.     ScreenManager:
    13.         id: screen_manager
    14.         Screen:
    15.             name: 'page_1'
    16.             BoxLayout:
    17.                 orientation: 'vertical'
    18.                 TextInput:
    19.                     hint_text: 'Enter memo here'
    20.                 Button:
    21.                     text: 'black'
    22.                     on_press: root.page_1.add_yellow_button(self)
    23.                 Button:
    24.                     text: 'white'
    25.                     on_press: root.page_1.go_to_page_1(self)
    26.         Screen:
    27.             name: 'page_2'
    28.             BoxLayout:
    29.                 orientation: 'vertical'
    閉じる△
  4. スマホアプリにするには▽
    Pythonアプリをスマホアプリに変換するには、apkファイルにパッケージ化する必要がある。パッケージ化はBuildozerというツールを使う。
    apkファイルをスマホにダウンロードしてインストールすればスマホアプリとして使える。
    参考サイト:Qiita PythonでAndroidアプリを作る。(外部サイト)

    サンプルアプリ(上記サイトから拝借)をPC上で表示

    ビルドしてapkファイルにした後、スマホで上記アプリを表示


    1. 手作りアプリなので、apkファイルをスマホにインストールしようとすると「安全で兄可能性があります」などとポップアップが出る
      →ガン無視してインストールする
    2. ホーム画面にkivyのマーク(モノクロのクロワッサンみたいなやつ)が出てくるので、それをタップするとアプリが開く

    閉じる△
  5. csvに入力データを残す・再起動後の復元▽
    1. from kivy.app import App
    2. from kivy.uix.boxlayout import BoxLayout
    3. from kivy.uix.textinput import TextInput
    4. from kivy.uix.button import Button
    5. from kivy.uix.screenmanager import ScreenManager, Screen
    6. import csv
    7. import webbrowser
    8. import japanize_kivy
    9. import urllib.parse
    10. class MyApp(App):
    11.     def build(self):
    12.         return MyBoxLayout()
    13. class MyBoxLayout(BoxLayout):
    14.     def __init__(self, **kwargs):
    15.         super(MyBoxLayout, self).__init__(**kwargs)
    16.         self.orientation = 'vertical'
    17.         self.button_create = Button(text='create', on_press=self.show_page_1)
    18.         self.button_showlist = Button(text='showlist', on_press=self.show_page_2)
    19.         self.button_close = Button(text='close', on_press=self.close_app)
    20.         self.add_widget(self.button_create)
    21.         self.add_widget(self.button_showlist)
    22.         self.add_widget(self.button_close)
    23.         self.screen_manager = ScreenManager()
    24.         self.page_1 = Page1(name='page_1')
    25.         self.page_2 = Page2(name='page_2')
    26.         self.screen_manager.add_widget(self.page_1)
    27.         self.screen_manager.add_widget(self.page_2)
    28.         self.add_widget(self.screen_manager)
    29.     def show_page_1(self, instance):
    30.         self.screen_manager.current = 'page_1'
    31.     def show_page_2(self, instance):
    32.         self.screen_manager.current = 'page_2'
    33.     def close_app(self, instance):
    34.         App.get_running_app().stop()
    35. class Page1(Screen):
    36.     def __init__(self, **kwargs):
    37.         super(Page1, self).__init__(**kwargs)
    38.         self.layout = BoxLayout(orientation='vertical')
    39.         self.text_input1 = TextInput(hint_text='enter your account name without "@"')
    40.         self.button_add_acn = Button(text='add', on_press=self.add_acn)
    41.         self.text_input2 = TextInput(hint_text='enter a hashtag without "#"')
    42.         self.button_add_ht = Button(text='green', on_press=self.add_green_button)
    43.         self.layout.add_widget(self.text_input1)
    44.         self.layout.add_widget(self.button_add_acn)
    45.         self.layout.add_widget(self.text_input2)
    46.         self.layout.add_widget(self.button_add_ht)
    47.         self.add_widget(self.layout)
    48.     def add_acn(self, instance):
    49.         acn = self.text_input1.text
    50.         # CSVファイルの読み込み
    51.         existing_data = []
    52.         try:
    53.             with open('list.csv', 'r') as csvfile:
    54.                 csv_reader = csv.reader(csvfile)
    55.                 existing_data = list(csv_reader)
    56.         except FileNotFoundError:
    57.             pass
    58.         # CSVファイルへの書き込み
    59.         with open('list.csv', 'w', newline='') as csvfile:
    60.             csv_writer = csv.writer(csvfile)
    61.             csv_writer.writerow([acn])
    62.             # 既存のデータを書き込む
    63.             for row in existing_data[1:]:
    64.                 csv_writer.writerow(row)
    65.     def add_green_button(self, instance):
    66.         page_2 = self.manager.get_screen('page_2')
    67.         hashtag = self.text_input2.text.strip()
    68.         # CSVファイルの読み込み
    69.         existing_data = []
    70.         try:
    71.             with open('list.csv', 'r') as csvfile:
    72.                 csv_reader = csv.reader(csvfile)
    73.                 existing_data = list(csv_reader)
    74.         except FileNotFoundError:
    75.             pass
    76.         # CSVファイルへの書き込み(追記)
    77.         with open('list.csv', 'a', newline='') as csvfile:
    78.             csv_writer = csv.writer(csvfile)
    79.             csv_writer.writerow(['', hashtag])
    80.         green_button = Button(text=f'{hashtag}', on_press=lambda instance: self.search_tweet(hashtag))
    81.         page_2.layout.add_widget(green_button)
    82.     def go_to_page_1(self, instance):
    83.         self.manager.current = 'page_1'
    84.     def search_tweet(self, hashtag):
    85.         try:
    86.             with open('list.csv', 'r') as csvfile:
    87.                 csv_reader = csv.reader(csvfile)
    88.                 existing_data = list(csv_reader)
    89.                 #アカウント名はcsvの1行め
    90.                 account_name = existing_data[0][0]
    91.         except FileNotFoundError:
    92.             account_name = ''
    93.         hst = urllib.parse.quote(hashtag) # キーワードをエンコード
    94.         webbrowser.open(f'https://twitter.com/search?q=from%3A{account_name}%20%23{hst}&src=typed_query&f=top')
    95. class Page2(Screen):
    96.     def __init__(self, **kwargs):
    97.         super(Page2, self).__init__(**kwargs)
    98.         self.layout = BoxLayout(orientation='vertical')
    99.         self.add_widget(self.layout)
    100.         # Load data from list.csv and create buttons
    101.         try:
    102.             with open('list.csv', 'r') as csvfile:
    103.                 csv_reader = csv.reader(csvfile)
    104.                 existing_data = list(csv_reader)
    105.                 # Assuming hashtags are in the second column (index 1) of the CSV file
    106.                 hashtags = [row[1] for row in existing_data[1:]]
    107.                 self.create_buttons(hashtags)
    108.         except FileNotFoundError:
    109.             pass # File not found, no buttons to create
    110.     def create_buttons(self, hashtags):
    111.         for hashtag in hashtags:
    112.             green_button = Button(text=f'{hashtag}', on_press=lambda instance, h=hashtag: self.search_tweet(h))
    113.             self.layout.add_widget(green_button)
    114.     def search_tweet(self, hashtag):
    115.         try:
    116.             with open('list.csv', 'r') as csvfile:
    117.                 csv_reader = csv.reader(csvfile)
    118.                 existing_data = list(csv_reader)
    119.                 account_name = existing_data[0][0] #アカウント名はcsvの1行目
    120.         except FileNotFoundError:
    121.             account_name = ''
    122.         hst = urllib.parse.quote(hashtag) # キーワードをエンコード
    123.         webbrowser.open(f'https://twitter.com/search?q=from%3A{account_name}%20%23{hst}&src=typed_query&f=top')
    124. if __name__ == '__main__':
    125.     MyApp().run()

    閉じる△
  6. jsonを用いて入力データを残す・再起動後の復元▽
    1. from kivy.app import App
    2. from kivy.uix.boxlayout import BoxLayout
    3. from kivy.uix.textinput import TextInput
    4. from kivy.uix.button import Button
    5. from kivy.uix.label import Label
    6. from kivy.uix.screenmanager import ScreenManager, Screen
    7. import webbrowser
    8. import japanize_kivy
    9. import urllib.parse
    10. import json
    11. from functools import partial
    12. class MyApp(App):
    13.     def build(self):
    14.         return MyBoxLayout()
    15. class MyBoxLayout(BoxLayout):
    16.     def __init__(self, **kwargs):
    17.         #選択画面
    18.         super(MyBoxLayout, self).__init__(**kwargs)
    19.         self.orientation = 'vertical'
    20.         # page1のラベル、動作
    21.         self.button_create = Button(text='create', on_press=self.show_page_1)
    22.         # page2のラベル、動作
    23.         self.button_showlist = Button(text='showlist', on_press=self.show_page_2)
    24.         # closeボタンのラベル、動作
    25.         self.button_close = Button(text='close', on_press=self.close_app)
    26.         # ボタンを配置
    27.         self.add_widget(self.button_create)
    28.         self.add_widget(self.button_showlist)
    29.         self.add_widget(self.button_close)
    30.         # スライドするレイアウト
    31.         self.screen_manager = ScreenManager()
    32.         self.page_1 = Page1(name='page_1')
    33.         self.page_2 = Page2(name='page_2')
    34.         self.screen_manager.add_widget(self.page_1)
    35.         self.screen_manager.add_widget(self.page_2)
    36.         self.add_widget(self.screen_manager)
    37.         # プログラム開始時に、過去に保存されたボタンを読み込む
    38.         self.load_buttons_from_file()
    39.     def show_page_1(self, instance):
    40.         self.screen_manager.current = 'page_1'
    41.     def show_page_2(self, instance):
    42.         self.screen_manager.current = 'page_2'
    43.     def close_app(self, instance):
    44.         self.save_buttons_to_file() # アプリを閉じる前にボタンを保存
    45.         App.get_running_app().stop()
    46.     def save_buttons_to_file(self):
    47.         # ボタンの情報をファイルに保存
    48.         buttons_data = []
    49.         for child in self.page_2.layout.children:
    50.             if isinstance(child, Button):
    51.                 buttons_data.append(child.text)
    52.         with open('buttons_data.json', 'w') as file:
    53.             json.dump(buttons_data, file)
    54.     def load_buttons_from_file(self):
    55.         # ファイルからボタンの情報を読み込んでPage2に表示
    56.         try:
    57.             with open('buttons_data.json', 'r') as file:
    58.                 buttons_data = json.load(file)
    59.                 for button_text in buttons_data:
    60.                     yellow_button = Button(text=button_text, on_press=self.search_twitter)
    61.                     self.page_2.layout.add_widget(yellow_button)
    62.         except FileNotFoundError:
    63.             pass # ファイルが存在しない場合は何もしない
    64.     def search_twitter(self, instance):
    65.         acn = self.page_1.text_input1.text
    66.         hashtag = instance.text
    67.         hst = urllib.parse.quote(hashtag) # キーワードをエンコード
    68.         webbrowser.open(f'https://twitter.com/search?q=from%3A{acn}%20%23{hst}&src=typed_query&f=top')
    69. class Page1(Screen):
    70.     def __init__(self, **kwargs):
    71.         super(Page1, self).__init__(**kwargs)
    72.         # レイアウト
    73.         self.layout = BoxLayout(orientation='vertical')
    74.         self.text_input1 = TextInput(hint_text='enter your account name without "@"')
    75.         self.button_add_acn = Button(text='add your account', on_press=self.add_acn_to_p2)
    76.         self.text_input2 = TextInput(hint_text='enter a hashtag without "#"')
    77.         self.button_add_hashtag = Button(text='add hashtag', on_press=self.add_hashtag_to_p2)
    78.         self.layout.add_widget(self.text_input1)
    79.         self.layout.add_widget(self.button_add_acn)
    80.         self.layout.add_widget(self.text_input2)
    81.         self.layout.add_widget(self.button_add_hashtag)
    82.         self.add_widget(self.layout)
    83.     def add_acn_to_p2(self, instance):
    84.         page_2 = self.manager.get_screen('page_2')
    85.         acn = self.text_input1.text
    86.         acn_label = Label(text=f'{acn}') # Label を使用するように修正
    87.         page_2.layout.add_widget(acn_label)
    88.     def add_hashtag_to_p2(self, instance):
    89.         page_2 = self.manager.get_screen('page_2')
    90.         hashtag = self.text_input2.text
    91.         hst_button = Button(text=f'{hashtag}')
    92.         hst_button.bind(on_press=partial(self.search_twitter, page_2))
    93.         page_2.layout.add_widget(hst_button)
    94.     def search_twitter(self, page_2, instance):
    95.         acn = self.text_input1.text
    96.         hashtag = instance.text
    97.         hst = urllib.parse.quote(hashtag) # キーワードをエンコード
    98.         webbrowser.open(f'https://twitter.com/search?q=from%3A{acn}%20%23{hst}&src=typed_query&f=top')
    99. class Page2(Screen):
    100.     def __init__(self, **kwargs):
    101.         super(Page2, self).__init__(**kwargs)
    102.         self.layout = BoxLayout(orientation='vertical')
    103.         self.add_widget(self.layout)
    104. if __name__ == '__main__':
    105.     MyApp().run()
    閉じる△
  7. Change Makers Community▽
    小劇場そのものを知ってもらうために、上の作成中のアプリの話+一緒に小劇場いくコミュニティを作ろうとする
    発表PDF
    閉じる△

前のページに戻る