PythonでGUI作成 tkinterの使い方

標準ライブラリのtkinterの使い方です。

基本のコード


import tkinter as tk

def say_hello():
    print("Hello, world!")

root = tk.Tk() # メインウィンドウの作成

# ウインドウサイズを指定
root.geometry("300x200")

button = tk.Button(root, text="Say Hello", command=say_hello) # ボタンの作成
button.pack() # ボタンをウィンドウに配置

root.mainloop() # イベントループの開始



ウィンドウのテキストやボタンの位置設定


import tkinter as tk

root = tk.Tk()
root.geometry('300x200') # ウィンドウのサイズを指定

# スクレイピング関数は省略

button = tk.Button(root, text="スクレイピング開始", command=scrape_website)
button.place(relx=0.5, rely=0.5, anchor='center') # ボタンをウィンドウの中央に配置

label = tk.Label(root, text="ボタンを押してスクレイピングを開始します")
label.place(relx=0.5, rely=0.6, anchor='center') # ラベルをボタンの下側に配置

root.mainloop()




テキストのサイズを指定したい場合


import tkinter as tk
from tkinter import font

root = tk.Tk() # メインウィンドウの作成

# フォントの作成 (フォント名, サイズ, オプション)
my_font = font.Font(family="Helvetica", size=20)

label = tk.Label(root, text="Hello, world!", font=my_font) # ラベルの作成
label.pack() # ラベルをウィンドウに配置

root.mainloop() # イベントループの開始




ファイルを分けてボタンをクリックするとスクレイピングプログラムを実行する方法


[main.py]
tkinter GUI を初期化し、スクレイピングのトリガーを設定

[scrape.py]
実際のスクレイピングのモジュール

# main.py
import tkinter as tk
import scrape # scrape.pyから関数をインポート

root = tk.Tk()
root.geometry('300x200')

button = tk.Button(root, text="スクレイピング開始", command=scrape.scrape_website)
button.pack()

root.mainloop()


# scrape.py
def scrape_website():
  # 実際のスクレイピングのコード
  pass



scrapyで作成したプログラムをtkinterで実行


import tkinter as tk
from scrapy.crawler import CrawlerProcess
from scrapy.spiders import Spider

class MySpider(Spider):
  # ScrapyのSpiderクラスを継承してカスタムスパイダーを作成
  name = 'myspider'
  start_urls = ['http://example.com']


  def parse(self, response):
    # Scrapyの処理結果を表示するためのコードを記述
    # 例えば、HTML要素の抽出やデータの加工、表示などを行う

    # ここでは、スクレイピング結果をターミナルに表示するだけの簡単な例を示します
    print(response.css('h1::text').get())


def start_scraping():
  # Scrapyの処理を開始する関数
  process = CrawlerProcess()
  process.crawl(MySpider)
  process.start()

# TkinterのGUIを作成する
root = tk.Tk()
root.title('Scrapy GUI')

start_button = tk.Button(root, text='Start Scraping', command=start_scraping)
start_button.pack()

root.mainloop()




Tkinterのウィンドウ内にコンソールログを表示させる方法


import tkinter as tk
import sys

class ConsoleUI:
  def __init__(self, root):
    self.text_area = tk.Text(root)
    self.text_area.pack()
    sys.stdout = self

  def write(self, msg):
    self.text_area.insert(tk.END, msg)

  def flush(self):
    # this flush method is needed for file like object
    pass

root = tk.Tk()
console = ConsoleUI(root)

print('This will be output to the Text widget')

root.mainloop()


sys.stdoutをオブジェクトにリダイレクトすることでprint関数の出力をこのオブジェクトに送るようになっています。
このConsoleUIクラスのインスタンスが作られると、Textウィジェットを作成し、そこにメッセージを書き込むことでそのメッセージがTextウィジェットに表示されます。


ログイン入力を求める場合


import tkinter as tk
from tkinter import messagebox

def check_credentials():
  user = user_entry.get()
  password = pass_entry.get()
  if user == 'admin' and password == 'password':
    messagebox.showinfo("ログイン情報", "ログイン成功")
  else:
    messagebox.showerror("ログイン情報", "ユーザ名かパスワードが間違っています")

# GUI作成
root = tk.Tk()
root.title("ログインフォーム")

# ユーザ名エントリー
user_label = tk.Label(root, text="ユーザ名:")
user_label.pack()
user_entry = tk.Entry(root)
user_entry.pack()

# パスワードエントリー
pass_label = tk.Label(root, text="パスワード:")
pass_label.pack()
pass_entry = tk.Entry(root, show="*")
pass_entry.pack()

# ログインボタン
login_button = tk.Button(root, text="ログイン", command=check_credentials)
login_button.pack()

root.mainloop()




Scrapyでログイン入力を求めるサンプルコード


import tkinter as tk
import scrapy
from scrapy.crawler import CrawlerProcess

# あなたのScrapy Spider
class MySpider(scrapy.Spider):
  name = 'myspider'
  start_urls = ['http://example.com'] # 起点となるURLを指定します。

  def __init__(self, username=None, password=None, *args, **kwargs):
    super(MySpider, self).__init__(*args, **kwargs)
    self.username = username
    self.password = password

  def start_requests(self):
    return [scrapy.Request(url=self.start_urls[0], callback=self.login)]

  def login(self, response):
    # ここでログイン処理を実装します。以下は一例です。
    return scrapy.FormRequest.from_response(
      response,
      formdata={'username': self.username, 'password': self.password},
      callback=self.after_login
    )

  def after_login(self, response):
    # ログイン成功後の処理をここに書きます。
    pass


def start_crawler(username, password):
  process = CrawlerProcess({
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
  })
  process.crawl(MySpider, username=username, password=password)
  process.start()


def get_credentials():
  username = user_entry.get()
  password = pass_entry.get()
  start_crawler(username, password)


root = tk.Tk()

# ユーザー名入力フィールド
user_label = tk.Label(root, text="Username")
user_label.pack()
user_entry = tk.Entry(root)
user_entry.pack()

# パスワード入力フィールド
pass_label = tk.Label(root, text="Password")
pass_label.pack()
pass_entry = tk.Entry(root, show="*")
pass_entry.pack()

# スタートボタン
start_button = tk.Button(root, text="Start Crawler", command=get_credentials)
start_button.pack()

root.mainloop()