Docker for Windows 0
全130件 (130件中 1-50件目)
夕方の富士山。
2023.11.22
コメント(0)
「Pythonでデスクトップアプリを作ろう 後編」 その19結論から言いますと、プログラムの変更なしで、表紙の画像は表示できました。原因は、「Tkinter」の画像を扱う「PhotoImage」モジュールが表示できるのは、「png」ファイルなどで、私が用意した「JPEG」画像は表示できないためでした。また、用意された2件のデータの画像が表示されなかったのは、そのための画像ファイルをプログラムファイルと同じフォルダに入れていなかったためでした。
2023.10.22
コメント(0)
「Pythonでデスクトップアプリを作ろう 後編」 その18前回からだいぶ間隔が空いてしまいましたが、「蔵書管理アプリ」が一応動いたので、ここで一度載せることにします。まだ、写真が表示できるのかなどの確認ができていないので、確認ができたら、また載せたいと思います。# -*- coding: utf-8 -*-"""Created on Sat Jul 1 15:53:05 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その18# 標準の「Tkinter」+「SQLite3」を使って# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#Tkinter#Textウイジェット#collection_manager.py#蔵書管理アプリ#Menuウイジェット#Menu関数#「リサイズ不可」の設定#操作メニューの作成#add_cascade関数#add_command関数#フレームの作成#Frame関数# Menuウイジェットを使う際のコードの流れ# ①ウインドウに「Menu関数」でメニューバーを作る# ②メニューバーに「Menu関数」と「add_cascade関数」でメニューを作る# ③メニューに「add_command関数」で項目を作り、その項目が選択され# た時に事項する関数を設定する。# 併せて、その関数を設定する。## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト4●「collection_manager.py」は、ここから# 「蔵書管理アプリ」のプログラム# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# GUIライブラリーの「Tkinter」モジュールから「tkk」ノジュールをインポートする。from tkinter import ttk# 「Tkinter」モジュールから「messagebox」モジュールをインポートする。from tkinter import messagebox# データベースライブラリのインポート(「SQLite3」モジュール)import sqlite3books_list =[]# 登録者情報入力用のEntryin_entry = []sub_win = Nones = ('ISBN', 'タイトル', '著者', '出版社', '発売日', '価格(円)', '画像ファイル')# 書籍情報をデータベースから取得する関数def get_books(): # データベースの作成 # 「sqlite3.connect」関数でデータベースを作成する。 conn = sqlite3.connect('collection.db') # カーソルオブジェクトの作成 # カーソルオブジェクトでデータベースの操作を行う。 cur = conn.cursor() sql = 'SELECT * FROM books' cur.execute(sql) books_list = cur.fetchall() conn.close() return books_list# 一覧の書籍を選択すると呼び出される関数def view_select(event): global img global d_frame slct_items = list_view.selection() s = ('ISBN', 'タイトル', '著者', '出版社', '発売日', '価格(円)') for i in range(len(s)): item_view.item(i, values=(s[i], books_list[int(slct_items[0])][i+1])) try: img = \ tk.PhotoImage(file=books_list[int(slct_items[0])][7]) except tk.TclError: img = '' panel = tk.Label(d_frame, image=img) panel.grid(row=0, column=1)# 登録ボタンをクリックすると呼び出される関数def register(): global sub_win global in_entry # データベースの作成 # 「sqlite3.connect」関数でデータベースを作成する。 conn = sqlite3.connect('collection.db') cur = conn.cursor() sql = """INSERT INTO books(isbn, title, author, publisher, release, price, image) VALUES(?, ?, ?, ?, ?, ?, ?)""" ele = [] for i in range(len(in_entry)): ele.append(in_entry[i].get()) cur.execute(sql, ele) conn.commit() conn.close() messagebox.showinfo('メッセージ', '新規登録しました。') sub_win.destroy() disp()# 新規登録メニューがクリックされると呼び出される関数def save(): global sub_win global in_entry # 書籍情報入力用ウインドウの作成 sub_win = tk.Toplevel() sub_win.geometry("250x250") in_label = [] in_entry.clear() print('for i in range(len(s)):') for i in range(len(s)): in_label.append(tk.Label(sub_win, text=s[i])) in_entry.append(tk.Entry(sub_win, width=20)) register_button = tk.Button(sub_win, text='登録', command=register) for i in range(3): sub_win.columnconfigure(i, weight=1) for i in range(9): sub_win.rowconfigure(i, weight=1) for i in range(7): in_label[i].grid(column=0, row=i) in_entry[i].grid(column=1, row=i, columnspan=2) register_button.grid(column=1, row=8, rowspan=2, sticky=tk.N)# 削除メニューがクリックされると呼び出される関数def delete(): conn = sqlite3.connect('collection.db') cur = conn.cursor() sql = 'DELETE FROM books WHERE id = ?' slct_items = list_view.selection() cur.execute(sql, (books_list[int(slct_items[0])][0],)) conn.commit() conn.close() messagebox.showinfo('メッセージ', 'データを削除しました。') disp()# ウインドウの作成(リサイズ不可) # 「Tk」関数を使って、ウインドウ「(トップレベルtk」ウイジェット)を生成し、 「root」という名前を付ける。# 「Tk」関数は、「Tk」クラスから、ウインドウ(「トップレベルtk」ウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('400x300')は、横サイズ=400ピクセル、縦サイズ=300ピクセルを表しているroot.geometry('400x300') # ウインドウの表示タイトルを「蔵書管理アプリ」にする。root.title('蔵書管理アプリ')# 「リサイズ不可」の設定root.resizable(0, 0)root.grid_rowconfigure(0, weight=1) root.grid_rowconfigure(1, weight=1)root.grid_columnconfigure(0, weight=1)# 「Menu」関数でメニューバーを作成menubar = tk.Menu()root.config(menu=menubar)# 操作メニューを作成menu_command = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label='操作', menu=menu_command)# 操作メニューに「新規登録」「削除」メニューを追加するmenu_command.add_command(label='新規登録', command=save)menu_command.add_separator()menu_command.add_command(label='削除', command=delete)# 一覧用のフレームc_frame = tk.Frame(root)column = ('Title', 'Author', 'Publisher')# 「ttk.Treeview関数」で、「Treeview」ウイジェットを作成list_view = ttk.Treeview(c_frame, columns=column, height=5)# 行が選択されると「<<TreeviewSelect>>イベント」が発生。# このイベントとこのイベントが発生した時に実行されるハンドラ関数をbind関数で紐づけする。list_view.bind('<<TreeviewSelect>>', view_select)# 「heading」関数で表の見出しを設定list_view.heading('#0', text='')list_view.heading('Title', text='タイトル', anchor='center')list_view.heading('Author', text='著者', anchor='center')list_view.heading('Publisher', text='出版社', anchor='center')# 「column」関数で列を設定list_view.column('#0', width=0, stretch='no')list_view.column('Title', anchor='w', width=200)list_view.column('Author', anchor='w', width=80)list_view.column('Publisher', anchor='w', width=80)# 一覧にデータを追加def disp(): # 初期化 list_view.delete(*list_view.get_children()) global books_list books_list = get_books() for i in range(len(books_list)): list_view.insert(parent='', index='end', iid=i , values = (books_list[i][2], books_list[i][3], books_list[i][4])) list_view.grid(row=0, column=0, sticky=tk.NSEW) # 最後のアイテムを選択 list_view.selection_set(i) # 最後のアイテムに移動 list_view.see(i) # スクロールバーの作成 ybar = tk.Scrollbar(c_frame, orient=tk.VERTICAL, width=16, command=list_view.yview) list_view.configure(yscrollcommand=ybar.set) ybar.grid(row=0, column=1, sticky=tk.NSEW) # 一覧の作成disp()# 詳細部分の作成d_frame = tk.Frame(root)d_frame.grid_rowconfigure(0, weight=1)d_frame.grid_columnconfigure(0, weight=1)d_frame.grid_columnconfigure(1, weight=1)column = ('Item', 'Contents')item_view = ttk.Treeview(d_frame, show='tree', columns=column, height = 6)item_view.column('#0', width=0, stretch='no')item_view.column('Item', anchor='w', width=80)item_view.column('Contents', anchor='w', width=140)# 詳細の表示slct_items = list_view.selection()for i in range(len(s)): item_view.insert(parent='', index='end', iid=i, values=(s[i], books_list[int(slct_items[0])][i+1]))item_view.grid(row=0, column=0)try: img = \ tk.PhotoImage(file=books_list[int(slct_items[0])][7])except tk.TclError: img = ''panel = tk.Label(d_frame, image=img)panel.grid(row=0, column=1, sticky=tk.NSEW)c_frame.grid(row=0, column=0)d_frame.grid(row=1, column=0, sticky=tk.NSEW)# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト4●「collection_manager.py」は、ここまでリスト4●「collection_manager.py」の実行結果新規登録画面新規登録1件新規登録したところ。新規登録の結果。
2023.10.22
コメント(0)
「Pythonでデスクトップアプリを作ろう 後編」 その17# -*- coding: utf-8 -*-"""Created on Sun Jun 25 12:34:18 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その17# 標準の「Tkinter」+「SQLite3」を使って# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ③ データベースを作成する(p.061~p.062)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#Tkinter#Textウイジェット#_test.py#蔵書管理アプリ#Menuウイジェットのテストプログラム#create.db#テーブルの作成#cur.execute## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト3●「create_db.py」は、ここから# 「collection.db」を作り、その中に「booksテーブル」を作成するプログラム# ライブラリのインポート(「SQLite3」モジュール)import sqlite3# データベースの作成# 「sqlite3.connect」関数でデータベースを作成する。# 他のDBMSには、データベースを作成する「CREATE DATABASE」という「SQL」文が存在するが、# 「SQLite3」にはないので注意が必要。conn = sqlite3.connect('collection.db')# カーソルオブジェクトの作成# カーソルオブジェクトでデータベースの操作を行う。cur = conn.cursor()# 「books」テーブルの作成cur.execute("""CREATE TABLE books( id INTEGER PRIMARY KEY AUTOINCREMENT, isbn TEXT, title TEXT NOT NULL, author TEXT, publisher TEXT, release TEXT, price INTEGER, image TEXT)""")# サンプルデータを2件だけ入力# SQL文の「?」の部分には、「execute」関数実行時に、タプル(date,memo)の# の要素(dateとmemo)が順に挿入される。# このようなやり方は、「パラメータ割り当て」と呼ばれる。# 「パラメータ割り当て」を使うと、文字列の連結処理を行わずに、変数の値をSQL文に# 挿入できる。books = [['0123-A1234', 'ビジネスPython超入門', \ '中島 省吾', '日経BP', '2019年6月10日', 2640, 'img_001.png',], ['B07HMN6BL9', '5日間で学ぶPython AIプログラミング編', \ '中島 省吾', '日経BP', '2019年9月25日', 880, 'img_002.png',]]sql= """INSERT INTO books(isbn, title, author, publisher, release,price, image) VALUES (?, ?, ?, ?, ?, ?, ?)""" for i in range(len(books)): cur.execute(sql, books[i]) conn.commit()for row in cur.execute("SELECT * FROM books"): print(row) conn.close#========== リスト3●「create_db.py」は、ここまでリスト3●「create_db.py」の実行結果
2023.07.02
コメント(0)
「Pythonでデスクトップアプリを作ろう 後編」 その16# -*- coding: utf-8 -*-"""Created on Sat Jun 10 16:13:21 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その16# 標準の「Tkinter」+「SQLite3」を使って# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ② 「Menu」ウィジェットの使い方(p.060~p.061)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#Tkinter#Textウイジェット#_test.py#蔵書管理アプリ#Menuウイジェットのテストプログラム#Menuウイジェット#Menu関数#add_cascade関数#add_command関数# Menuウイジェットを使う際のコードの流れ# ①ウインドウに「Menu関数」でメニューバーを作る# ②メニューバーに「Menu関数」と「add_cascade関数」でメニューを作る# ③メニューに「add_command関数」で項目を作り、その項目が選択され# た時に事項する関数を設定する。# 併せて、その関数を設定する。## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト2●「menu_test.py」は、ここから# 「menu」ウイジェットのテストプログラム# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tkinter」モジュールから「messagebox」モジュールをインポートする。from tkinter import messagebox# 「新規登録」がクリックされた時に実行されるハンドラ関数def save(): messagebox.showinfo('メッセージ', 'save')# 「削除」がクリックされた時に実行されるハンドラ関数def delete(): messagebox.showinfo('メッセージ', 'delete') # ウインドウの作成# 「Tk」関数を使って、ウインドウ「(トップレベルtk」ウイジェット)を生成し、 「root」という名前を付ける。# 「Tk」関数は、「Tk」クラスから、ウインドウ(「トップレベルtk」ウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x150')は、横サイズ=200ピクセル、縦サイズ=150ピクセルを表しているroot.geometry('300x150') # ウインドウの表示タイトルを「Menuのテスト」にする。root.title('Menuのテスト')# メニューバーを作成menubar = tk.Menu()root.config(menu=menubar)# 操作メニューを作成menu_command = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label='操作', menu=menu_command)# 操作メニューに「新規登録」「削除」メニューを追加するmenu_command.add_command(label='新規登録', command=save)menu_command.add_separator()menu_command.add_command(label='削除', command=delete)# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト2●「menu_test.py」は、ここまでリスト2●「menu_test.py」の実行結果「新規登録」をクリックした結果。「削除」をクリックした結果
2023.06.24
コメント(0)
「Pythonでデスクトップアプリを作ろう 後編」 その15# -*- coding: utf-8 -*-"""Created on Sat Jun 10 10:02:30 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その15# 標準の「Tkinter」+「SQLite3」を使って# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#Tkinter#Textウイジェット#treeview_test.py#蔵書管理アプリ#Treeviewウイジェットのテストプログラム#Treeviewウイジェット#ttk.Treeview関数#表の見出し#heading関数#列の設定#column関数#データを追加#insert関数## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト1●「treeview_test.py」は、ここから# 「Treeview」ウイジェットのテストプログラム# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# GUIライブラリーの「Tkinter.tkk」モジュールを、「tkk」という名前でインポートする。import tkinter.ttk as ttk# 「Tkinter」モジュールから「messagebox」モジュールをインポートする。from tkinter import messagebox# 行が選択された時に実行されるハンドラ関数def view_select(event): slct_items = list_view.selection() messagebox.showinfo('メッセージ', slct_items[0])# ウインドウの作成# 「Tk」関数を使って、ウインドウ「(トップレベルtk」ウイジェット)を生成し、 「root」という名前を付ける。# 「Tk」関数は、「Tk」クラスから、ウインドウ(「トップレベルtk」ウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('400x150')は、横サイズ=400ピクセル、縦サイズ=150ピクセルを表しているroot.geometry('400x150') # ウインドウの表示タイトルを「Treeviewのテスト」にする。root.title('Treeviewのテスト')# 「リサイズ不可」の設定root.resizable(0, 0)column = ('Title', 'Author', 'Publisher')# ttk.Treeview関数で、「Treeview」ウイジェットを作成list_view = ttk.Treeview(root, columns=column, height=5)# 行が選択されると<<TreeviewSelect>>イベントが発生。# このイベントとこのイベントが発生した時に実行されるハンドラ関数をbind関数で紐づけする。list_view.bind('<<TreeviewSelect>>', view_select)# 「heading」関数で表の見出しを設定list_view.heading('#0', text='')list_view.heading('Title', text='タイトル', anchor='center')list_view.heading('Author', text='著者', anchor='center')list_view.heading('Publisher', text='出版社', anchor='center')# 「column」関数で列を設定list_view.column('#0', width=0, stretch='no')list_view.column('Title', anchor='w', width=200)list_view.column('Author', anchor='w', width=80)list_view.column('Publisher', anchor='w', width=80)# insert関数でTreeviewにデータを追加def disp(): for i in range(5): list_view.insert(parent='', index='end', iid=i, values = (str(i), str(i), str(i))) disp()list_view.pack()# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト1●「treeview_test.py」は、ここまでリスト1●「treeview_test.py」の実行結果
2023.06.10
コメント(0)
「Pythonでデスクトップアプリを作ろう 後編」 その14# -*- coding: utf-8 -*-"""Created on Sun Jun 4 14:57:20 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。前回、「保存」ボタンが機能しませんでしたが、その原因が分かりました。打ち間違えでした。「保存ボタンがクリックされた時に呼び出される関数(def save(t_day):)」の引数「end-1c」の「1」(数字のいち)が、「l」(英小文字のエル)になっていたためでした。以下に、そのを訂正した「リスト3-2●「daily_memo.py」を掲載します。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その14# 標準の「Tkinter」+「SQLite3」を使って# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#データベースへの接続#Select文#データの抽出#Tkinter#Textウイジェット#Scrollウイジェット#Scrollbar関数#orientオプション#tk.VERTICAL#commandオプション#yview関数#yscrollcommandオプション#set関数#daily_memo.py#カレンダー型メモアプリ#「click関数」#「bind関数」を使って「click関数」と紐づけている#「insert関数」## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト3ー2●「daily_memo.py」は、ここから# カレンダー型メモアプリのプログラム# このソースコードは、「memo.db」と同じフォルダに置くこと。# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# GUIライブラリーの「Tkinter.tkk」モジュールを、「tkk」という名前でインポートする。import tkinter.ttk as ttk# 「datetime」モジュールを、「da」という名前でインポートする。import datetime as da# 「calender」モジュールを、「ca」という名前でインポートする。import calendar as ca# 「Tkinter」モジュールから「messagebox」モジュールをインポートする。from tkinter import messagebox# データベースライブラリのインポート(「SQLite3」モジュール)import sqlite3# 日付を引数にしてメモを取得する関数def get_memo(day): # データベースの作成 # 「sqlite3.connect」関数でデータベースを作成する。 conn = sqlite3.connect('memo.db') # カーソルオブジェクトの作成 # カーソルオブジェクトでデータベースの操作を行う。 cur = conn.cursor() # 「today_memo」の初期化 today_memo = '' sql = 'SELECT * FROM daily WHERE date = ?' for row in cur.execute(sql, (day,)): today_memo = row[1] conn.close() return today_memo# 日付がクリックされた時に呼び出される関数def click(event): global click_day click_day = event.widget['text'] n = str(yer[0]) + '_' + str(mon[0]) + '_' + str(click_day) title['text'] = make_text_1(yer[0], mon[0], click_day) + 'のメモ' text.delete('1.0', 'end') text.insert('1.0', get_memo(n)) # 保存ボタンがクリックされた時に呼び出される関数def save(t_day): conn = sqlite3.connect('memo.db') cur = conn.cursor() sql = 'REPLACE INTO daily VALUES(?, ?)' cur.execute(sql, (t_day, text.get('1.0', 'end-1c'))) conn.commit() conn.close() messagebox.showinfo('メッセージ', 'データを保存しました。') disp(0) # 引数の日付にメモがあれば「True」、なければ「False」を返す関数def check(y, m, d): day = str(y) + '_' + str(m) + '_' + str(d) if (get_memo(day) != ''): return True return False# 日付文字列を作る関数def make_text_1(y, m, d): return str(y) + '年' + str(m) + '月' + str(d) + '日'def make_text_2(y, m, d): return str(y) + '_' + str(m) + '_' + str(d)# 表示するカレンダーの文字列WEEK = ['日', '月', '火', '水', '木', '金', '土']WEEK_COLOUR = ['red', 'black', 'black', 'black', 'black', 'black', 'blue'] def disp(arg): global yer global mon mon[0] += arg if mon[0] < 1: mon[0], yer[0] = 12, yer[0] - 1 elif mon[0] > 12: mon[0], yer[0] = 1, yer[0] + 1 label['text'] = str(yer[0]) + '年' + str(mon[0]) + '月' cal = ca.Calendar(firstweekday=6) for widget in frame.winfo_children(): widget.destroy() r = 0 for i, x in enumerate(WEEK): label_day = tk.Label(frame, text=x, font=('', 10), width=3, fg=WEEK_COLOUR[i]) label_day.grid(row=r, column=i, pady=1) r = 1 for week in cal.monthdayscalendar(yer[0], mon[0]): for i, day in enumerate(week): day = ' ' if day == 0 else day label_day = tk.Label(frame, text=day, font=('', 10), fg=WEEK_COLOUR[i], borderwidth=1) if (yer[0], mon[0], today) == (yer[1], mon[1], day): label_day['relief'] = 'solid' if check(yer[0], mon[0], day): label_day['background'] = 'yellow' label_day.bind('<Button-1>', click) label_day.grid(row=r, column=i, padx=2, pady=1) r = r + 1 # ウインドウを生成(リサイズ不可) # 「Tk」関数を使って、ウインドウ「(トップレベルtk」ウイジェット)を生成し、 「root」という名前を付ける。# 「Tk」関数は、「Tk」クラスから、ウインドウ(「トップレベルtk」ウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('470x250')は、横サイズ=470ピクセル、縦サイズ=250ピクセルを表しているroot.geometry('470x250') # ウインドウの表示タイトルを「メモアプリ」にする。root.title('メモアプリ')# 「リサイズ不可」の設定root.resizable(0, 0)# カレンダー用のフレームc_frame = tk.Frame(root)frame = tk.Frame(c_frame)for n in range(3): c_frame.grid_columnconfigure(n, weight=1) yer = [da.date.today().year] * 2mon = [da.date.today().month] * 2today = da.date.today().dayclick_day = todaylabel = tk.Label(c_frame, font=('', 10))button_1 = tk.Button(c_frame, text='<', font=('', 10), command=lambda:disp(-1))button_1.grid(row=0, column=0, pady=10)label.grid(row=0, column=1)button_2 = tk.Button(c_frame, text='>', font=('', 10), command=lambda:disp(1))button_2.grid(row=0, column=2)frame.grid(row=1, column=0, columnspan=3)disp(0)# ここからメモ用のフレームd_frame = tk.Frame(root)# タイトルと保存ボタンt_frame = tk.Frame(d_frame)title = tk.Label(t_frame, text=make_text_1(yer[0], mon[0], today) + 'のメモ', font=('', 12))title.grid(row=0, column=0, padx=20)button = tk.Button(t_frame, text='保存', command=lambda:save(make_text_2(yer[0], \ mon[0], click_day)))button.grid(row=0, column=1)t_frame.grid(row=0, column=0, pady=10)# メモ用の「Textウイジェット」と「Scrollbar」ウイジェットtext = tk.Text(d_frame, width=30, height=14)text.grid(row=4, column=0)scroll_v = tk.Scrollbar(d_frame, orient=tk.VERTICAL, \ command=text.yview)scroll_v.grid(row=4, column=1, sticky=tk.N+tk.S)text["yscrollcommand"] = scroll_v.settext.insert('1.0', get_memo(make_text_2(yer[0],mon[0], today)))c_frame.grid(row=0, column=0, padx=10)d_frame.grid(row=0, column=1)# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト3ー2●「daily_memo.py」は、ここまでリスト3ー2●「daily_memo.py」の実行結果「保存」ボタンを押すことで、保存できました、
2023.06.04
コメント(0)
「Pythonでデスクトップアプリを作ろう 後編」 その13リスト3●「daily_memo.py」は、何とか動くようになりましたが、「保存」ボタンを押しても「保存されました」というメッセージが出ません(泣)デバッグが終わったら、また、載せたいと思います。もうしばらくお待ちください。# -*- coding: utf-8 -*-"""Created on Sun May 21 16:10:06 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その13# 標準の「Tkinter」+「SQLite3」を使って# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#データベースへの接続#Select文#データの抽出#Tkinter#Textウイジェット#Scrollウイジェット#Scrollbar関数#orientオプション#tk.VERTICAL#commandオプション#yview関数#yscrollcommandオプション#set関数#daily_memo.py#カレンダー型メモアプリ#「click関数」#「bind関数」を使って「click関数」と紐づけている#「insert関数」## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト3●「daily_memo.py」は、ここから# カレンダー型メモアプリのプログラム# このソースコードは、「memo.db」と同じフォルダに置くこと。# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# GUIライブラリーの「Tkinter.tkk」モジュールを、「tkk」という名前でインポートする。import tkinter.ttk as ttk# 「datetime」モジュールを、「da」という名前でインポートする。import datetime as da# 「calender」モジュールを、「ca」という名前でインポートする。import calendar as ca# 「Tkinter」モジュールから「messagebox」モジュールをインポートする。from tkinter import messagebox# データベースライブラリのインポート(「SQLite3」モジュール)import sqlite3# 日付を引数にしてメモを取得する関数def get_memo(day): # データベースの作成 # 「sqlite3.connect」関数でデータベースを作成する。 conn = sqlite3.connect('memo.db') # カーソルオブジェクトの作成 # カーソルオブジェクトでデータベースの操作を行う。 cur = conn.cursor() # 「today_memo」の初期化 today_memo = '' sql = 'SELECT * FROM daily WHERE date = ?' for row in cur.execute(sql, (day,)): today_memo = row[1] conn.close() return today_memo# 日付がクリックされた時に呼び出される関数def click(event): global click_day click_day = event.widget['text'] n = str(yer[0]) + '_' + str(mon[0]) + '_' + str(click_day) title['text'] = make_text_1(yer[0], mon[0], click_day) + 'のメモ' text.delete('1.0', 'end') text.insert('1.0', get_memo(n)) # 保存ボタンがクリックされた時に呼び出される関数def save(t_day): print('保存ボタンが押されました') conn = sqlite3.connect('memo.db') cur = conn.cursor() sql = 'REPLACE INTO daily VALUES(?, ?)' cur.execute(sql, (t_day, text.get('1.0', 'end-lc'))) conn.commit() conn.close() messagebox.showinfo('メッセージ', 'データを保存しました。') disp(0) # 引数の日付にメモがあれば「True」、なければ「False」を返す関数def check(y, m, d): day = str(y) + '_' + str(m) + '_' + str(d) if (get_memo(day) != ''): return True return False# 日付文字列を作る関数def make_text_1(y, m, d): return str(y) + '年' + str(m) + '月' + str(d) + '日'def make_text_2(y, m, d): return str(y) + '_' + str(m) + '_' + str(d)# 表示するカレンダーの文字列WEEK = ['日', '月', '火', '水', '木', '金', '土']WEEK_COLOUR = ['red', 'black', 'black', 'black', 'black', 'black', 'blue'] def disp(arg): global yer global mon mon[0] += arg if mon[0] < 1: mon[0], yer[0] = 12, yer[0] - 1 elif mon[0] > 12: mon[0], yer[0] = 1, yer[0] + 1 label['text'] = str(yer[0]) + '年' + str(mon[0]) + '月' cal = ca.Calendar(firstweekday=6) for widget in frame.winfo_children(): widget.destroy() r = 0 for i, x in enumerate(WEEK): label_day = tk.Label(frame, text=x, font=('', 10), width=3, fg=WEEK_COLOUR[i]) label_day.grid(row=r, column=i, pady=1) r = 1 for week in cal.monthdayscalendar(yer[0], mon[0]): for i, day in enumerate(week): day = ' ' if day == 0 else day label_day = tk.Label(frame, text=day, font=('', 10), fg=WEEK_COLOUR[i], borderwidth=1) if (yer[0], mon[0], today) == (yer[1], mon[1], day): label_day['relief'] = 'solid' if check(yer[0], mon[0], day): label_day['background'] = 'yellow' label_day.bind('<Button-1>', click) label_day.grid(row=r, column=i, padx=2, pady=1) r = r + 1 # ウインドウを生成(リサイズ不可) # 「Tk」関数を使って、ウインドウ「(トップレベルtk」ウイジェット)を生成し、 「root」という名前を付ける。# 「Tk」関数は、「Tk」クラスから、ウインドウ(「トップレベルtk」ウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('470x250')は、横サイズ=470ピクセル、縦サイズ=250ピクセルを表しているroot.geometry('470x250') # ウインドウの表示タイトルを「メモアプリ」にする。root.title('メモアプリ')# 「リサイズ不可」の設定root.resizable(0, 0)# カレンダー用のフレームc_frame = tk.Frame(root)frame = tk.Frame(c_frame)for n in range(3): c_frame.grid_columnconfigure(n, weight=1) yer = [da.date.today().year] * 2mon = [da.date.today().month] * 2today = da.date.today().dayclick_day = todaylabel = tk.Label(c_frame, font=('', 10))button_1 = tk.Button(c_frame, text='<', font=('', 10), command=lambda:disp(-1))button_1.grid(row=0, column=0, pady=10)label.grid(row=0, column=1)button_2 = tk.Button(c_frame, text='>', font=('', 10), command=lambda:disp(1))button_2.grid(row=0, column=2)frame.grid(row=1, column=0, columnspan=3)disp(0)# ここからメモ用のフレームd_frame = tk.Frame(root)# タイトルと保存ボタンt_frame = tk.Frame(d_frame)title = tk.Label(t_frame, text=make_text_1(yer[0], mon[0], today) + 'のメモ', font=('', 12))title.grid(row=0, column=0, padx=20)button = tk.Button(t_frame, text='保存', command=lambda:save(make_text_2(yer[0], \ mon[0], click_day)))button.grid(row=0, column=1)t_frame.grid(row=0, column=0, pady=10)# メモ用の「Textウイジェット」と「Scrollbar」ウイジェットtext = tk.Text(d_frame, width=30, height=14)text.grid(row=4, column=0)scroll_v = tk.Scrollbar(d_frame, orient=tk.VERTICAL, \ command=text.yview)scroll_v.grid(row=4, column=1, sticky=tk.N+tk.S)text["yscrollcommand"] = scroll_v.settext.insert('1.0', get_memo(make_text_2(yer[0],mon[0], today)))c_frame.grid(row=0, column=0, padx=10)d_frame.grid(row=0, column=1)# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト3●「daily_memo.py」は、ここまでリスト3●「daily_memo.py」の実行結果
2023.06.04
コメント(0)
# -*- coding: utf-8 -*-"""Created on Fri Apr 7 10:22:02 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その12# 標準の「Tkinter」+「SQLite3」を使って# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ② メモを入力・表示する機能(p.054~p.055)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#Tkinter#Textウイジェット#Scrollウイジェット#Scrollbar関数#orientオプション#tk.VERTICAL#commandオプション#yview関数#yscrollcommandオプション#set関数## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト2●「text.py」は、ここから# 「「text」ウィジェットと「scrollbar」ウィジェットを組み合わせたサンプルプログラム# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tkinter」モジュールから「messagebox」モジュールをインポートする。from tkinter import messagebox# 「Tk」関数を使って、ウインドウ「(トップレベルtk」ウイジェット)を生成し、 「root」という名前を付ける。# 「Tk」関数は、「Tk」クラスから、ウインドウ(「トップレベルtk」ウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x180')は、横サイズ=300ピクセル、縦サイズ=180ピクセルを表しているroot.geometry('300x180') # ウインドウの表示タイトルを「「text」ウィジェットと「scrollbar」ウィジェットのテスト」にする。root.title('textとscrollbarのテスト')# 「Text」ウィジェットの生成と配置text = tk.Text(root, width=38, height=12)text.grid(row=0, column=0)# 垂直方向の「Scrollbar」ウィジェットの生成と配置scroll_v = tk.Scrollbar(root, orient=tk.VERTICAL, command=text.yview)scroll_v.grid(row=0, column=1, stick=tk.N+tk.S)text["yscrollcommand"] = scroll_v.set# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト2●「text.py」は、ここまで〇リスト2●「text.py」の実行結果
2023.05.14
コメント(0)
# -*- coding: utf-8 -*-"""Created on Thu Mar 30 16:00:37 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その11# 標準の「Tkinter」+「SQLite3」を使って# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053~p.054)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#SQL文#SQL文の「?」# 「パラメータ割り当て」## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト1●「create_db.py」はここから# 「memo.db」と「daily」テーブルを作るプログラム# ライブラリのインポート(「SQLite3」モジュール)import sqlite3# データベースの作成# 「sqlite3.connect」関数でデータベースを作成する。# 他のDBMSには、データベースを作成する「CREATE DATABASE」という「SQL」文が存在するが、# 「SQLite3」にはないので注意が必要。conn = sqlite3.connect('memo.db')# カーソルオブジェクトの作成# カーソルオブジェクトでデータベースの操作を行う。cur = conn.cursor()# 「daily」テーブルの作成cur.execute("""CREATE TABLE daily( date TEXT PRIMARY KEY, memo TEXT NOT NULL)""")# サンプルデータを1件だけ入力# SQL文の「?」の部分には、「execute」関数実行時に、タプル(date,memo)の# の要素(dateとmemo)が順に挿入される。# このようなやり方は、「パラメータ割り当て」と呼ばれる。# 「パラメータ割り当て」を使うと、文字列の連結処理を行わずに、変数の値をSQL文に# 挿入できる。date = '2022_7_26'memo = '本日のメモ\n\n牛乳を買うこと\n髪を切りに行く'sql ='INSERT INTO daily VALUES (?, ?)'cur.execute(sql, (date, memo))# 「コミット」関数の実行# 「INSERT INTO」文を実行した後、コネクションオブジェクトの「commit」関数を実行して、コミットする必要委がある。# このコミットの実行を行わないと、データをデータベースに追加できないので注意。conn.commit()# データの確認して表示for row in cur.execute("SELECT * FROM daily"): print(row)# 接続の切断conn.close()#========== リスト1●「create_db.py」はここまでリスト1●「create_db.py」に実行結果
2023.04.07
コメント(0)
# -*- coding: utf-8 -*-"""Created on Wed Mar 29 09:48:23 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その10# 標準の「Tkinter」+「SQLite3」を使って# Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#「select」文#select#「ORDER BY」句#ORDER BY#データをソートする## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト9●「personal_select5.py」はここから# 「ORDER BY」句を使うプログラム# ライブラリのインポート(「SQLite3」モジュール)import sqlite3# データベースの作成# 「sqlite3.connect」関数でデータベースを作成する。# 他のDBMSには、データベースを作成する「CREATE DATABASE」という「SQL」文が存在するが、# 「SQLite3」にはないので注意が必要。conn = sqlite3.connect('sample.db')# カーソルオブジェクトの作成# カーソルオブジェクトでデータベースの操作を行う。cur = conn.cursor()# 「身長」の低い順にデータをソートして表示for row in cur.execute("SELECT * FROM personal ORDER BY height"): print(row)# 改行print()# 「身長」の高い順にデータをソートして表示for row in cur.execute("SELECT * FROM personal ORDER BY height DESC"): print(row)# 改行print()# 接続の切断conn.close()#========== リスト9●「personal_select5.py」はここまでリスト9●「personal_select5.py」の実行結果
2023.03.30
コメント(0)
# -*- coding: utf-8 -*-"""Created on Tue Mar 28 13:19:52 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その9# 標準の「Tkinter」+「SQLite3」を使って# Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#「select」文#select#「LIKE」演算子であいまい検索#「LIKE」演算子#LIKE## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト8●「personal_select4.py」はここから# 「LIKE」演算子を使ってあいまい検索を行うプログラム# ライブラリのインポート(「SQLite3」モジュール)import sqlite3# データベースの作成# 「sqlite3.connect」関数でデータベースを作成する。# 他のDBMSには、データベースを作成する「CREATE DATABASE」という「SQL」文が存在するが、# 「SQLite3」にはないので注意が必要。conn = sqlite3.connect('sample.db')# カーソルオブジェクトの作成# カーソルオブジェクトでデータベースの操作を行う。cur = conn.cursor()# 「name」が'Tanaka'で始まるデータを抽出して表示for row in cur.execute("SELECT * FROM personal WHERE name LIKE 'Tanaka%'"): print(row)# 改行print()# 「name」の中に'ro'を含むデータを抽出して表示for row in cur.execute("SELECT * FROM personal WHERE name LIKE '%ro%'"): print(row)# 改行print()# 「name」が6文字以上で、5文字目と6文字目が'ki'であるデータを抽出して表示for row in cur.execute("SELECT * FROM personal WHERE name LIKE '____ki%'"): print(row)# 改行print()# 接続の切断conn.close()#========== リスト8●「personal_select4.py」はここまでリスト8●「personal_select4.py」の実行結果
2023.03.30
コメント(0)
# -*- coding: utf-8 -*-"""Created on Tue Mar 28 12:33:59 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その8# 標準の「Tkinter」+「SQLite3」を使って# Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#「select」文#select#「WHERE」句#WHERE#「BETWEEN 値1 AND 値2」#BETWEEN#「IN (値1, 値2, 値3, ・・・)」#IN## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト7●「personal_select3.py」はここから# 「BETWEEN 値1 AND 値2」と「IN (値1, 値2, 値3, ・・・)」を使うプログラム# ライブラリのインポート(「SQLite3」モジュール)import sqlite3# データベースの作成# 「sqlite3.connect」関数でデータベースを作成する。# 他のDBMSには、データベースを作成する「CREATE DATABASE」という「SQL」文が存在するが、# 「SQLite3」にはないので注意が必要。conn = sqlite3.connect('sample.db')# カーソルオブジェクトの作成# カーソルオブジェクトでデータベースの操作を行う。cur = conn.cursor()# 「height」が170から180の範囲に含まれているデータを抽出して表示for row in cur.execute("SELECT * FROM personal WHERE height BETWEEN 170 AND 180"): print(row)# 改行print()# 「height」が160、170、180のどれかと等しいデータを抽出して表示for row in cur.execute("SELECT * FROM personal WHERE height IN(160, 170, 180)"): print(row)# 改行print()# 接続の切断conn.close()#========== リスト7●「personal_select3.py」はここまでリスト7●「personal_select3.py」の実行結果
2023.03.30
コメント(0)
# -*- coding: utf-8 -*-"""Created on Tue Mar 28 10:53:46 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その7# 標準の「Tkinter」+「SQLite3」を使って# Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#「select」文#select#「WHERE」句#WHERE## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト6●「personal_select2.py」はここから# 「WHERE」句を使うプログラム# ライブラリのインポート(「SQLite3」モジュール)import sqlite3# データベースの作成# 「sqlite3.connect」関数でデータベースを作成する。# 他のDBMSには、データベースを作成する「CREATE DATABASE」という「SQL」文が存在するが、# 「SQLite3」にはないので注意が必要。conn = sqlite3.connect('sample.db')# カーソルオブジェクトの作成# カーソルオブジェクトでデータベースの操作を行う。cur = conn.cursor()# 「id」が'002'と等しいデータを抽出して表示for row in cur.execute("SELECT * FROM personal WHERE id = '002'"): print(row)# 改行print()# 「height」が173以上で、かつ「weight」が'75.8'と等しいデータを抽出して表示for row in cur.execute("SELECT * FROM personal WHERE height >= 173 AND weight = 75.8"): print(row)# 改行print()# 「weight」が'75.8'以外のデータを抽出して表示for row in cur.execute("SELECT * FROM personal WHERE weight != 75.8"): print(row)# 改行print()# 接続の切断conn.close()#========== リスト6●「personal_select2.py」はここまでリスト6●「personal_select2.py」の実行結果
2023.03.29
コメント(0)
# -*- coding: utf-8 -*-"""Created on Tue Mar 28 10:25:05 2023@author: mlupi"""# -*- coding: utf-8 -*-"""Created on Mon Mar 27 21:00:17 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その6# 標準の「Tkinter」+「SQLite3」を使って# Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#「select」文# select## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト5●「personal_select.py」はここから# personalテーブル(personal_tbl)の全データを抽出するプログラム# ライブラリのインポート(「SQLite3」モジュール)import sqlite3# データベースの作成# 「sqlite3.connect」関数でデータベースを作成する。# 他のDBMSには、データベースを作成する「CREATE DATABASE」という「SQL」文が存在するが、# 「SQLite3」にはないので注意が必要。conn = sqlite3.connect('sample.db')# カーソルオブジェクトの作成# カーソルオブジェクトでデータベースの操作を行う。cur = conn.cursor()# 「select」文で全データを抽出して表示# データは、「select」文で抽出できる。for row in cur.execute("SELECT * FROM personal"): print(row)# 接続の切断conn.close()#========== リスト5●「personal_select.py」はここまでリスト5●「personal_select.py」の実行結果
2023.03.28
コメント(0)
# -*- coding: utf-8 -*-"""Created on Mon Mar 27 21:00:17 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その5# 標準の「Tkinter」+「SQLite3」を使って# Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ④ データベースやテーブルの削除(p.050)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#「DROP TABLE」文#DROP TABLE## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト4●「personal_del.py」はここから# personalテーブル(personal_tbl)を削除するプログラム# ライブラリのインポート(「SQLite3」モジュール)import sqlite3# データベースの作成# 「sqlite3.connect」関数でデータベースを作成する。# 他のDBMSには、データベースを作成する「CREATE DATABASE」という「SQL」文が存在するが、# 「SQLite3」にはないので注意が必要。conn = sqlite3.connect('sample.db')# カーソルオブジェクトの作成# カーソルオブジェクトでデータベースの操作を行う。cur = conn.cursor()# 「personal」テーブルの削除# テーブルは、「DROP TABLE」文で削除できる。cur.execute("DROP TABLE personal")# 接続の切断conn.close()#========== リスト4●「personal_del.py」はここまで
2023.03.28
コメント(0)
# -*- coding: utf-8 -*-"""Created on Mon Mar 27 09:49:56 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その4# 標準の「Tkinter」+「SQLite3」を使って# Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#「sqlite3.connect」関数#INSERT INTO#「コミット」関数#commit## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト3●「personal_input.py」はここから# personalテーブル(personal_tbl)にデータを追加するプログラム# ライブラリのインポート(「SQLite3」モジュール)import sqlite3# データベースの作成# 「sqlite3.connect」関数でデータベースを作成する。# 他のDBMSには、データベースを作成する「CREATE DATABASE」という「SQL」文が存在するが、# 「SQLite3」にはないので注意が必要。conn = sqlite3.connect('sample.db')# カーソルオブジェクトの作成# カーソルオブジェクトでデータベースの操作を行う。cur = conn.cursor()# データの追加# 「INSERT INTO」文でデータを追加する。cur.execute("INSERT INTO personal values('001', 'Yamada Taro', 173, 62.5)")cur.execute("INSERT INTO personal values('002', 'Tanaka Hanako', 163, 53.1)")cur.execute("INSERT INTO personal values('003', 'Suzuki Saburo', 180, 75.8)")# 「コミット」関数の実行# 「INSERT INTO」文を実行した後、コネクションオブジェクトの「commit」関数を実行して、コミットする必要委がある。# このコミットの実行を行わないと、データをデータベースに追加できないので注意。conn.commit()# 接続の切断conn.close()#========== リスト3●「personal_input.py」はここまで)
2023.03.27
コメント(0)
# -*- coding: utf-8 -*-"""Created on Sun Mar 26 16:08:07 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その3# 標準の「Tkinter」+「SQLite3」を使って# Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ② テーブルを作成する(p.048~p.049)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#「sqlite3.connect」関数#sqlite3.connect## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト2●「personal_tbl.py」はここから# personalテーブル(personal_tbl)を作るプログラム# ライブラリのインポート(「SQLite3」モジュール)import sqlite3# データベースの作成# 「sqlite3.connect」関数でデータベースを作成する。# 他のDBMSには、データベースを作成する「CREATE DATABASE」という「SQL」文が存在するが、# 「SQLite3」にはないので注意が必要。conn = sqlite3.connect('sample.db')# カーソルオブジェクトの作成# カーソルオブジェクトでデータベースの操作を行う。cur = conn.cursor()# personalテーブルの作成# 「sqlite3.connect」関数でデータベースを作成する。cur.execute("""CREATE TABLE PERSONAL( id TEXT PRIMARY KEY, name TEXT NOT NULL, height INTEGER NOT NULL, weight REAL NOT NULL)""")print('personalテーブルを作成しました。')# 接続の切断conn.close()#========== リスト2●「personal_tbl.py」はここまでリスト2●「personal_tbl.py」の実行結果
2023.03.26
コメント(0)
# -*- coding: utf-8 -*-"""Created on Sun Mar 26 14:53:40 2023@author: mlupi""""""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、 11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その2# 標準の「Tkinter」+「SQLite3」を使って# Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)#Python#Tkinter#SQLite3#日経ソフトウエア#デスクトップアプリ#データベース#「sqlite3.connect」関数#sqlite3.connect## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)#========== リスト1●「create_db.py」はここから# データベースを作るプログラム# ライブラリのインポート(「SQLite3」モジュール)import sqlite3# データベースの作成# 「sqlite3.connect」関数でデータベースを作成する。# 他のDBMSには、データベースを作成する「CREATE DATABASE」という「SQL」文が存在するが、# 「SQLite3」にはないので注意が必要。conn = sqlite3.connect('sample.db')# 接続の切断conn.close()#========== リスト1●「create_db.py」はここまでリスト1●「create_db.py」の実行結果sample.dbが生成されている。
2023.03.26
コメント(0)
"""『日経ソフトウエア』2022年11月号(p.046~p.065)の特集記事 9月号の「特集2 Pythonでデスクトップアプリを作ろう 前編」に引き続いて、11月号の「特集3 Pythonでデスクトップアプリを作ろう 後編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 後編」 その1## 『日経ソフトウエア』2022年11月号(p.046~p.065)## 目次## Intro Python+Tkinter+SQLiteが一番手軽(p.046~p.047)## Part1 SQLite3の基本をマスターしよう(p.047~p.053)# ① データベースを作成する(p.047~p.048)# ② テーブルを作成する(p.048~p.049)# ③ 「INSERT INTO」文でデータを追加する(p.049~p.050)# ④ データベースやテーブルの削除(p.050)# ⑤ 「SELECT」文でデータを抽出する(p.050~p.051)# ⑥ 「LIKE」演算子であいまい検索を実現する(p.051~p.052)# ⑦ 「ORDER BY」句でデータをソートする(p.052~p.053)# Part2 カレンダー型「メモアプリ」を作る(p.053~p.058)# ① メモアプリのデータベースを作る(p.053p.054)# ② メモを入力・表示する機能(p.054~p.055)# ③ カレンダー型「メモアプリ」のプログラム(p.055~p.057)# ④ 「保存」ボタンがクリックされた時の処理(p.057)# ⑤ 「calender」モジュールを使う(p.057~p.058)# Part3 「蔵書管理アプリ」を作る(p.058~p.065)# ① 「Treeview」ウィジェットの使い方(p.059~p.060)# ② 「Menu」ウィジェットの使い方(p.060~p.061)# ③ データベースを作成する(p.061~p.062)# ④ 「蔵書管理アプリ」を完成させる(p.062~p.065)
2023.03.26
コメント(0)
# -*- coding: utf-8 -*-"""Created on Sat Mar 18 15:37:55 2023@author: mlupi""""""『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その19# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ③ 4択クイズのデスクトップアプリを作る(p.039~p.040)## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ① ウィジェットとウィジェットの親子関係(p.024~p.026)# ② イベント駆動型のプログラミング(p.026~p.027)# ③ ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ① 2つの画面を切り替える(p.034~p.035)# ② Comboboxウィジェットを使う(p.035~p.036)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ① Radiobuttonウィジェットを使う(p.038~p.039)# ② CSVファイルを読み込む(p.039)# ③ 4択クイズのデスクトップアプリを作る(p.039~p.040)#========== リスト3●「quiz.py」はここから# 4択クイズのプログラム# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tkinter」モジュールから「messagebox」モジュールをインポートする。from tkinter import messagebox# 「csv」モジュールをインポートする。import csv# 次のクイズを設定def change_quiz(): global quiz_count var.set(0) quiz_count = quiz_count + 1 if quiz_count < len(data): question['text'] = data[quiz_count][0] for i in range(len(radio)): radio[i]['text'] = data[quiz_count][i + 1] radio[i]['variable'] = var radio[i]['value'] = i + 1 else: quiz_count = quiz_count - 1 messagebox.showinfo('メッセージ', 'クイズはもうありません!') # 正解、不正解の表示def judgement(): if data[quiz_count][5] == str(var.get()): messagebox.showinfo('正解', '正解です。' ) else: messagebox.showinfo('不正解', '残念!不正解です!' )# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x250')は、横サイズ=300ピクセル、縦サイズ=250ピクセルを表しているroot.geometry('300x250') # ウインドウの表示タイトルを「4択クイズアプリ」にする。root.title('4択クイズアプリ')for i in range(2): root.columnconfigure(i, weight=1)for i in range(6): root.rowconfigure(i, weight=1) # クイズ番号(quiz_count)の初期化(0始まり)quiz_count = 0# 「var」は、選択されているラジオボタンを保持する変数var = tk.IntVar()# 「data」は、ファイルから読み込んだクイズデータを格納する変数data = []# 「quiz.csv」からクイズデータを読み込むwith open('quiz.csv',encoding='utf-8', newline='') as csvfile: reader_quiz = csv.reader(csvfile) data = [row for row in reader_quiz] question = tk.Label(root, text=data[quiz_count][0])question.grid(row=0, column=0, columnspan=2) # 「radiobutton」ウイジェットの生成と配置radio = []for i in range(4): radio.append(tk.Radiobutton(root, text=data[quiz_count][i + 1], variable=var, value=i+1)) radio[i].grid(row=i+1, column=0, columnspan=2) answer = tk.Button(root, text='回答', command=judgement)answer.grid(row=5, column=0, sticky=tk.N) next_quiz = tk.Button(root, text='次のクイズ', command=change_quiz)next_quiz.grid(row=5, column=1, sticky=tk.N) # ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト3●「quiz.py」は、ここまで〇「quiz.csv」の内容は次のとおり。(最後の数字は、半角)「松坂牛」の正しい読み方は?,まつざかぎゅう,しょうざかぎゅう,まつざかうし,まつさかうし,4「チゲ鍋」の「チゲ」の意味は?,鍋,辛い,赤い,おいしい,1「地震・雷・火事・おやじ」の「おやじ」の意味は?,親父,台風,爆弾,大砲,2リスト3●「quiz.py」の実行結果回答した結果「次のクイズ」ボタンを押したところ。
2023.03.23
コメント(0)
# -*- coding: utf-8 -*-"""Created on Thu Mar 16 16:15:17 2023@author: mlupi""""""『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その18# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ② CSVファイルを読み込む(p.039)## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ① ウィジェットとウィジェットの親子関係(p.024~p.026)# ② イベント駆動型のプログラミング(p.026~p.027)# ③ ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ① 2つの画面を切り替える(p.034~p.035)# ② Comboboxウィジェットを使う(p.035~p.036)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ① Radiobuttonウィジェットを使う(p.038~p.039)# ② CSVファイルを読み込む(p.039)# ③ 4択クイズのデスクトップアプリを作る(p.039~p.040)#========== リスト2●「csv_test.py」はここから# 「CSVファイル」を読み込むテストプログラム# 「csv」モジュールをインポートする。import csvwith open('quiz.csv',encoding='utf-8', newline='') as csvfile: reader_quiz = csv.reader(csvfile) data = [row for row in reader_quiz] print(data)#========== リスト2●「csv_test.py」はここまでリスト2●「csv_test.py」の実行結果
2023.03.18
コメント(0)
# -*- coding: utf-8 -*-"""Created on Mon Mar 13 10:24:10 2023@author: mlupi""""""『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その17# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ① Radiobuttonウィジェットを使う(p.038~p.039)## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ① ウィジェットとウィジェットの親子関係(p.024~p.026)# ② イベント駆動型のプログラミング(p.026~p.027)# ③ ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ① 2つの画面を切り替える(p.034~p.035)# ② Comboboxウィジェットを使う(p.035~p.036)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ① Radiobuttonウィジェットを使う(p.038~p.039)# ② CSVファイルを読み込む(p.039)# ③ 4択クイズのデスクトップアプリを作る(p.039~p.040)#========== リスト1●「radio.py」はここから# 「Radiobutton」ウィジェットのテストプログラム# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tkinter」モジュールから「messagebox」モジュールをインポートする。from tkinter import messagebox# ハンドラ関数def click_get(): messagebox.showinfo('メッセージ', var.get()) # 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('250x220')は、横サイズ=250ピクセル、縦サイズ=220ピクセルを表しているroot.geometry('250x220') # ウインドウの表示タイトルを「Radio Test」にする。root.title('Radio Test')action = ['選択肢1', '選択肢2', '選択肢3', '選択肢4']# 選択状態を保持する変数# (初期値を「選択肢1」にしている)var = tk.StringVar(value='選択肢1')for act in action: radio = tk.Radiobutton(root, text=act, variable=var, value=act) radio.pack(pady=5)# 「Button」ウイジェットの生成と配置button = tk.Button(root, text='表示', command=click_get)button.pack(pady=5)# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト1●「radio.py」は、ここまで
2023.03.16
コメント(0)
# -*- coding: utf-8 -*-"""Created on Sun Mar 12 12:44:46 2023@author: mlupi""""""『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その16# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)## 割り勘計算機の機能 # ①1円や10円単位の集金が発生しないようにする。(細かい金額は幹事の支払いとする)# ②偉い人は多めの金額(新人の3倍)、平社員は新人の2倍の金額とし、新人は少なめ# の金額になるようにする。# ③金額によっては、幹事は平社員よりも支払い金額が少し安くなるようにする。# (安くなった分を、幹事の支払い分で調整する。)## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ① ウィジェットとウィジェットの親子関係(p.024~p.026)# ② イベント駆動型のプログラミング(p.026~p.027)# ③ ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ① 2つの画面を切り替える(p.034~p.035)# ② Comboboxウィジェットを使う(p.035~p.036)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ① Radiobuttonウィジェットを使う(p.038~p.039)# ② CSVファイルを読み込む(p.039)# ③ 4択クイズのデスクトップアプリを作る(p.039~p.040)#========== リスト3●「warikan.py」# 「割り勘計算機」のプログラム # GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# GUIライブラリーの「tkinter.ttk」モジュールを、「ttk」という名前でインポートする。import tkinter.ttk as ttk# 「Tkinter」モジュールから「messagebox」モジュールをインポートする。from tkinter import messagebox# 「math」モジュールをインポートする。import math# 計算結果を表示する関数def calculation_result(): t = int(total.get()) e = int(erai.get()) h = int(hira.get()) s = int(shin.get()) kanj = 2 base = math.floor(t / (e * 3 + h * 2 + s +kanj)) mErai = 0 if e == 0 else (math.ceil(base*3/100) * 100) mHira = 0 if h == 0 else (math.ceil(base*2/100) * 100) mShin = 0 if s == 0 else (math.ceil(base*1/100) * 100) mKanj = base * kanj total2 = mErai * e + mHira * h + mShin * s + mKanj mKanj = mKanj - (total2 - t) c = [['偉い人は :', str(mErai)], ['平社員は :', str(mHira)], ['新人は :', str(mShin)], ['幹事は :', str(mKanj)], ] for i in range(len(out_label)): out_label[i][0]['text'] = c[i][0] out_label[i][1]['text'] = c[i][1] # 計算結果画面へ切り替え out_frame.tkraise() # 入力画面への切り替え用の関数def change_in(): in_frame.tkraise()# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの表示タイトルを「割り勘計算機」にする。root.title('割り勘計算機')# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x220')は、横サイズ=300ピクセル、縦サイズ=220ピクセルを表しているroot.geometry('300x220')# 各列の割合を指定root.columnconfigure(0, weight=1)# 各行の割合を指定root.rowconfigure(0, weight=1)# 「入力画面用」フレーム(frame)の生成と配置in_frame = tk.Frame(root)in_frame.grid(column=0, row=0, sticky=tk.NSEW)# 「Entryウイジェット」の生成total = tk.Entry(in_frame, width=10)# 「Label」イジェットの生成s = ('金 額( 円 )', '偉い人(人数)', '平社員(人数)', '新 人(人数)', '幹 事(1人)')in_label = []for i in range(len(s)): in_label.append(tk.Label(in_frame, text=s[i])) # 「Combobox」ウィジェットの生成number = ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10')erai = ttk.Combobox(in_frame, values=number, width=8)erai.current(0)hira = ttk.Combobox(in_frame, values=number, width=8)hira.current(0)shin = ttk.Combobox(in_frame, values=number, width=8)shin.current(0)# 「Button」ウイジェットの生成button = tk.Button(in_frame, text='計算', command=calculation_result)for i in range(2): in_frame.columnconfigure(i, weight=1)for i in range(6): in_frame.rowconfigure(i, weight=1) # 「grid」関数で配置in_label[0].grid(column=0, row=0)total.grid(column=1, row=0)in_label[1].grid(column=0, row=1)erai.grid(column=1, row=1)in_label[2].grid(column=0, row=2)hira.grid(column=1, row=2)in_label[3].grid(column=0, row=3)shin.grid(column=1, row=3)in_label[4].grid(column=0, row=4)button.grid(column=1, row=5)# 計算結果画面用フレームの生成と配置 out_frame = tk.Frame(root)out_frame.grid(column=0, row=0, sticky=tk.NSEW)out_frame.columnconfigure(0, weight=1)out_frame.columnconfigure(1, weight=1)for i in range(5): out_frame.rowconfigure(i, weight=1) # 「Label」ウイジェットの生成out_label = []for i in range(4): out_label.append([tk.Label(out_frame, padx=20), tk.Label(out_frame, padx=20)]) # 「Button」ウイジェットの生成button = tk.Button(out_frame, text='計算に戻る', command=change_in)for i in range(len(out_label)): out_label[i][0].grid(column=0, row=i, sticky=tk.E) out_label[i][1].grid(column=1, row=i, sticky=tk.W) button.grid(column=0, row=4, columnspan=2, sticky=tk.N)# 「frame」を前面にするin_frame.tkraise()# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト3●「warikan.py」は、ここまでリスト3●「warikan.py」の実行結果(その1)リスト3●「warikan.py」の実行結果(その1)
2023.03.12
コメント(0)
# -*- coding: utf-8 -*-"""Created on Sun Mar 12 10:29:03 2023@author: mlupi""""""『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その15# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ② Comboboxウィジェットを使う(p.035~p.036)## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ① ウィジェットとウィジェットの親子関係(p.024~p.026)# ② イベント駆動型のプログラミング(p.026~p.027)# ③ ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ① 2つの画面を切り替える(p.034~p.035)# ② Comboboxウィジェットを使う(p.035~p.036)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ① Radiobuttonウィジェットを使う(p.038~p.039)# ② CSVファイルを読み込む(p.039)# ③ 4択クイズのデスクトップアプリを作る(p.039~p.040)#========== リスト2●「combobox.py」# 「Combobox」ウィジェットのテストプログラム # GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# GUIライブラリーの「tkinter.ttk」モジュールを、「ttk」という名前でインポートする。import tkinter.ttk as ttk# 「Tkinter」モジュールから「messagebox」モジュールをインポートする。from tkinter import messagebox# 「Button」のハンドラ関数def click_get(): message.showinfo('メッセージ', combo.get())# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの表示タイトルを「Combo Test」にする。root.title('Combo Test')# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('250x100')は、横サイズ=350ピクセル、縦サイズ=100ピクセルを表しているroot.geometry('250x100')# 「Combobox」ウィジェット」の生成と配置number = ['1', '2', '3', '4', '5']combo = ttk.Combobox(root, state='normal', values=number, width=5)combo.current(0)combo.pack(pady=10)# 「Buttonウイジェット」の生成と配置button = tk.Button(root, text='表示', command=click_get)button.pack()# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト2●「combobox.py」は、ここまでリスト2●「combobox.py」の実行結果(その1)リスト2●「combobox.py」の実行結果(その2)
2023.03.12
コメント(0)
# -*- coding: utf-8 -*-"""Created on Fri Mar 10 10:59:57 2023@author: mlupi""""""『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その14# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ① 2つの画面を切り替える(p.034~p.035)## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ① ウィジェットとウィジェットの親子関係(p.024~p.026)# ② イベント駆動型のプログラミング(p.026~p.027)# ③ ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ① 2つの画面を切り替える(p.034~p.035)# ② Comboboxウィジェットを使う(p.035~p.036)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ① Radiobuttonウィジェットを使う(p.038~p.039)# ② CSVファイルを読み込む(p.039)# ③ 4択クイズのデスクトップアプリを作る(p.039~p.040)#========== リスト1●「switch.py」# 「フレーム」を使う「画面切り替え」のテストプログラム。 # GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# Button_1のハンドラ関数def change_no2(): # 「frame_2」を前面に出す frame_2.tkraise()# Button_2のハンドラ関数def change_no1(): # 「frame_1」を前面に出す frame_1.tkraise()# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの表示タイトルを「tkraise Test」にする。root.title('tkraise Test')# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('250x100')は、横サイズ=250ピクセル、縦サイズ=100ピクセルを表しているroot.geometry('250x100')# 各列の割合を指定root.columnconfigure(0, weight=1)# 各行の割合を指定root.rowconfigure(0, weight=1)# 「画面1」(frame_1)の生成と配置frame_1 = tk.Frame(root)frame_1.grid(column=0, row=0, sticky=tk.NSEW)# 「画面1」(frame_1)ウイジェットの生成と配置label_1 = tk.Label(frame_1, text='画面1です。')button_1 = tk.Button(frame_1, text='次の画面', command=change_no2)label_1.pack(pady=10)button_1.pack(pady=10)# 「画面2」(frame_2)の生成と配置frame_2 = tk.Frame(root)frame_2.grid(column=0, row=0, sticky=tk.NSEW)# 「画面2」(frame_2)ウイジェットの生成と配置label_2 = tk.Label(frame_2, text='画面2です。')button_2 = tk.Button(frame_2, text='次の画面', command=change_no1)label_2.pack(pady=10)button_2.pack(pady=10)# 「frame_1」を前面に出すframe_1.tkraise()# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト1●「switch.py」は、ここまでリスト1●「switch.py」の実行結果(その1)リスト1●「switch.py」の実行結果(その2)
2023.03.11
コメント(0)
# -*- coding: utf-8 -*-"""Created on Tue Mar 7 10:28:38 2023@author: mlupi""""""『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その13# 目次# Part2 「BMI計算機」を作ろう(p.029~p.033)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ① ウィジェットとウィジェットの親子関係(p.024~p.026)# ② イベント駆動型のプログラミング(p.026~p.027)# ③ ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ① 2つの画面を切り替える(p.034~p.035)# ② Comboboxウィジェットを使う(p.035~p.036)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ① Radiobuttonウィジェットを使う(p.038~p.039)# ② CSVファイルを読み込む(p.039)# ③ 4択クイズのデスクトップアプリを作る(p.039~p.040)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)#========== リスト7●「bmi.py」# 「Grid関数」のテストプログラム。# 「grid関数」の「rowspan」オプション、「columnspan」オプション# を使って、格子を結合する。(p.031~p.032)# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# BMI計算関数def calc(weight, height): return weight / (height**2)# 肥満度判定関数def check(bmi): if bmi < 18.5: result = '低体重' elif bmi < 25.0: result = '普通体重' elif bmi < 30.0: result = '肥満度1' elif bmi < 35.0: result = '肥満度2' elif bmi < 40.0: result = '肥満度3' else: result = '肥満度4' return result# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの表示タイトルを「ボタンテスト」にする。root.title('肥満度チェック')# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x150')は、横サイズ=300ピクセル、縦サイズ=150ピクセルを表しているroot.geometry('250x150')# 「labelウイジェット」の生成label_1 = tk.Label(root, text='体重')label_2 = tk.Label(root, text='kg')label_3 = tk.Label(root, text='身長')label_4 = tk.Label(root, text='cm')label_5 = tk.Label(root, text='身長と体重を入力してください。')# 「Entryウイジェット」の生成weight = tk.Entry(width=5)height = tk.Entry(width=5)# Buttonのハンドラ関数def judgment(): w = float(weight.get()) h = float(height.get()) / 100 s = check(calc(w, h)) label_5['text'] = '肥満度:' + str(s) # Buttonウイジェットの生成button = tk.Button(root, text='BMI判定', command=judgment)# 各列の割合を指定root.columnconfigure(0, weight=1)root.columnconfigure(1, weight=1)root.columnconfigure(2, weight=1)# 各行の割合を指定root.rowconfigure(0, weight=1)root.rowconfigure(1, weight=1)root.rowconfigure(2, weight=1)root.rowconfigure(3, weight=1)# 「grid関数」でウイジェットを配置# 「grid関数」の「rowspan」オプション、「columnspan」オプション# を使って、格子を結合する。(p.031~p.032)label_1.grid(column=0, row=0, sticky=tk.E)weight.grid(column=1, row=0)label_2.grid(column=2, row=0, sticky=tk.W)label_3.grid(column=0, row=1, sticky=tk.E)height.grid(column=1, row=1)label_4.grid(column=2, row=1, sticky=tk.W)button.grid(column=0, row=2, columnspan=3)label_5.grid(column=0, row=3, columnspan=3)# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト7●「bmi.py」は、ここまでリスト7●「bmi.py」の実行結果
2023.03.10
コメント(0)
# -*- coding: utf-8 -*-"""Created on Mon Mar 6 10:34:48 2023@author: mlupi""""""『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その12# 目次# Part2 「BMI計算機」を作ろう(p.029~p.033)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# 「grid関数」の「rowspan」オプション、「columnspan」オプション# を使って、格子を結合する。(p.031~p.032)## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ① ウィジェットとウィジェットの親子関係(p.024~p.026)# ② イベント駆動型のプログラミング(p.026~p.027)# ③ ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ① 2つの画面を切り替える(p.034~p.035)# ② Comboboxウィジェットを使う(p.035~p.036)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ① Radiobuttonウィジェットを使う(p.038~p.039)# ② CSVファイルを読み込む(p.039)# ③ 4択クイズのデスクトップアプリを作る(p.039~p.040)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# 「grid関数」の「rowspan」オプション、「columnspan」オプション# を使って、格子を結合する。(p.031~p.032)#========== リスト6●「Grid_05.py」# 「Grid関数」のテストプログラム。# 「grid関数」の「rowspan」オプション、「columnspan」オプション# を使って、格子を結合する。(p.031~p.032)# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの表示タイトルを「ボタンテスト」にする。root.title('Grid Test')# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x150')は、横サイズ=300ピクセル、縦サイズ=150ピクセルを表しているroot.geometry('400x200')# ウイジェットの数# テキストボックスの「Entry」ウイジェットを「Entry」関数を使って生成し、「pack」関数を使って配置する。WIDGET_MAX = 4# 「labelウイジェット」のリストを生成labels = [tk.Label(root, text='NO_'+str(num), relief=tk.SOLID) for num in range(WIDGET_MAX)]# 各列の割合を指定root.columnconfigure(0, weight=1)root.columnconfigure(1, weight=1)root.columnconfigure(2, weight=1)root.columnconfigure(3, weight=1)# 各行の割合を指定root.rowconfigure(0, weight=1)root.rowconfigure(1, weight=1)# 「grid関数」で配置# 「grid関数」の「rowspan」オプション、「columnspan」オプション# を使って、格子を結合する。(p.031~p.032)labels[0].grid(column=0, row=0, rowspan=2)labels[1].grid(column=1, row=0, columnspan=2)labels[2].grid(column=3, row=0)labels[3].grid(column=1, row=1, columnspan=3)# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト6●「Grid_05.py」は、ここまでリスト6●「Grid_05.py」の実行結果
2023.03.07
コメント(0)
# -*- coding: utf-8 -*-"""Created on Tue Feb 28 12:50:14 2023@author: mlupi""""""『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その11# 目次# Part2 「BMI計算機」を作ろう(p.029~p.033)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# 「grid関数」の「sticky」オプションを使う。(p.031~p.032)## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ① ウィジェットとウィジェットの親子関係(p.024~p.026)# ② イベント駆動型のプログラミング(p.026~p.027)# ③ ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ① 2つの画面を切り替える(p.034~p.035)# ② Comboboxウィジェットを使う(p.035~p.036)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ① Radiobuttonウィジェットを使う(p.038~p.039)# ② CSVファイルを読み込む(p.039)# ③ 4択クイズのデスクトップアプリを作る(p.039~p.040)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# 「grid関数」の「sticky」オプションを使う。(p.031~p.032)#========== リスト5●「Grid_04.py」# 「Grid関数」のテストプログラム。# 「grid関数」の「sticky」オプションを使う。(p.031~p.032)# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの表示タイトルを「ボタンテスト」にする。root.title('Grid Test')# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x150')は、横サイズ=300ピクセル、縦サイズ=150ピクセルを表しているroot.geometry('400x200')# ウイジェットの数# テキストボックスの「Entry」ウイジェットを「Entry」関数を使って生成し、「pack」関数を使って配置する。WIDGET_MAX = 8# 「labelウイジェット」のリストを生成labels = [tk.Label(root, text='NO_'+str(num), relief=tk.SOLID) for num in range(WIDGET_MAX)]# 各列の割合を指定root.columnconfigure(0, weight=1)root.columnconfigure(1, weight=1)root.columnconfigure(2, weight=1)root.columnconfigure(3, weight=1)# 各行の割合を指定root.rowconfigure(0, weight=1)root.rowconfigure(1, weight=1)# 「grid関数」で配置# 「grid関数」の「sticky」オプションを使う。(p.031~p.032)labels[0].grid(column=0, row=0, sticky=tk.N)labels[1].grid(column=1, row=0, sticky=tk.S)labels[2].grid(column=2, row=0, sticky=tk.E)labels[3].grid(column=3, row=0, sticky=tk.W)labels[4].grid(column=0, row=1, sticky=tk.NS)labels[5].grid(column=1, row=1, sticky=tk.SE)labels[6].grid(column=2, row=1, sticky=tk.EW)labels[7].grid(column=3, row=1, sticky=tk.NSEW)# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト5●「Grid_04.py」は、ここまでリスト5●「Grid_04.py」の実行結果
2023.03.07
コメント(0)
# -*- coding: utf-8 -*-"""Created on Tue Feb 28 12:34:34 2023@author: mlupi""""""『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その10## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次# Part2 「BMI計算機」を作ろう(p.029~p.033)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# 「grid関数」で、「columnconfigure関数」と「rowconfigure関数」を使う。(p.030)## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ① ウィジェットとウィジェットの親子関係(p.024~p.026)# ② イベント駆動型のプログラミング(p.026~p.027)# ③ ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ① 2つの画面を切り替える(p.034~p.035)# ② Comboboxウィジェットを使う(p.035~p.036)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ① Radiobuttonウィジェットを使う(p.038~p.039)# ② CSVファイルを読み込む(p.039)# ③ 4択クイズのデスクトップアプリを作る(p.039~p.040)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)#========== リスト4●「Grid_03.py」# ウインドウの「columnconfigure関数」と「rowconfigure関数」を使う。# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの表示タイトルを「ボタンテスト」にする。root.title('Grid Test')# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x150')は、横サイズ=300ピクセル、縦サイズ=150ピクセルを表しているroot.geometry('400x200')# ウイジェットの数# テキストボックスの「Entry」ウイジェットを「Entry」関数を使って生成し、「pack」関数を使って配置する。WIDGET_MAX = 8# 「labelウイジェット」のリストを生成labels = [tk.Label(root, text='NO_'+str(num), relief=tk.SOLID) for num in range(WIDGET_MAX)]# 各列の割合を指定root.columnconfigure(0, weight=1)root.columnconfigure(1, weight=1)root.columnconfigure(2, weight=1)root.columnconfigure(3, weight=1)# 各行の割合を指定root.rowconfigure(0, weight=1)root.rowconfigure(1, weight=1)# 「grid関数」で配置labels[0].grid(column=0, row=0)labels[1].grid(column=1, row=0)labels[2].grid(column=2, row=0)labels[3].grid(column=3, row=0)labels[4].grid(column=0, row=1)labels[5].grid(column=1, row=1)labels[6].grid(column=2, row=1)labels[7].grid(column=3, row=1)# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト4●「Grid_03.py」は、ここまでリスト4●「Grid_03.py」の実行結果
2023.03.06
コメント(0)
# -*- coding: utf-8 -*-"""Created on Tue Feb 28 12:11:21 2023@author: mlupi""""""『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その9# Part2 「BMI計算機」を作ろう(p.029~p.033)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# 「grid関数」で、column, rowを指定して、配置(030)## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ① ウィジェットとウィジェットの親子関係(p.024~p.026)# ② イベント駆動型のプログラミング(p.026~p.027)# ③ ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ① 2つの画面を切り替える(p.034~p.035)# ② Comboboxウィジェットを使う(p.035~p.036)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ① Radiobuttonウィジェットを使う(p.038~p.039)# ② CSVファイルを読み込む(p.039)# ③ 4択クイズのデスクトップアプリを作る(p.039~p.040)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)#========== リスト3●「Grid_02.py」# 「Grid関数」のテストプログラム。# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの表示タイトルを「ボタンテスト」にする。root.title('Grid Test')# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x150')は、横サイズ=300ピクセル、縦サイズ=150ピクセルを表しているroot.geometry('400x200')# ウイジェットの数# テキストボックスの「Entry」ウイジェットを「Entry」関数を使って生成し、「pack」関数を使って配置する。WIDGET_MAX = 8# 「labelウイジェット」のリストを生成labels = [tk.Label(root, text='NO_'+str(num), relief=tk.SOLID) for num in range(WIDGET_MAX)]# 「grid関数」で配置labels[0].grid(column=0, row=0)labels[1].grid(column=1, row=0)labels[2].grid(column=2, row=0)labels[3].grid(column=3, row=0)labels[4].grid(column=0, row=1)labels[5].grid(column=1, row=1)labels[6].grid(column=2, row=1)labels[7].grid(column=3, row=1)# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト3●「Grid_02.py」は、ここまでリスト3●「Grid_02.py」の実行結果
2023.03.05
コメント(0)
# -*- coding: utf-8 -*-"""Created on Mon Feb 27 16:10:49 2023@author: mlupi""""""『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦中。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その8# Part2 「BMI計算機」を作ろう(p.029~p.033)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ① ウィジェットとウィジェットの親子関係(p.024~p.026)# ② イベント駆動型のプログラミング(p.026~p.027)# ③ ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)# ③ BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# ① 2つの画面を切り替える(p.034~p.035)# ② Comboboxウィジェットを使う(p.035~p.036)# ③ 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# ① Radiobuttonウィジェットを使う(p.038~p.039)# ② CSVファイルを読み込む(p.039)# ③ 4択クイズのデスクトップアプリを作る(p.039~p.040)# Part2 「BMI計算機」を作ろう(p.029~p.033)# ① Buttonウィジェットの使い方(p.029)# ② grid関数でウィジェットを格子状に配置する(p.030~p.032)#========== リスト2●「Grid_01.py」# 「Grid関数」のテストプログラム。# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの表示タイトルを「ボタンテスト」にする。root.title('Grid Test')# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x150')は、横サイズ=300ピクセル、縦サイズ=150ピクセルを表しているroot.geometry('400x200')# ウイジェットの数# テキストボックスの「Entry」ウイジェットを「Entry」関数を使って生成し、「pack」関数を使って配置する。WIDGET_MAX = 8# 「labelウイジェット」のリストを生成labels = [tk.Label(root, text='NO_'+str(num), relief=tk.SOLID) for num in range(WIDGET_MAX)]# 「grid関数」で配置for num in range(WIDGET_MAX): labels[num].grid()# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト2●「Grid_01.py」は、ここまで「リスト2」の実行結果
2023.02.26
コメント(0)
# -*- coding: utf-8 -*-"""Created on Sat Feb 25 15:44:38 2023@author: mlupi""""""前回からだいぶ経ってしまいましたが、『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」の挑戦を続けます。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その7## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ウィジェットとウィジェットの親子関係(p.024~p.026)# イベント駆動型のプログラミング(p.026~p.027)# ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# Buttonウィジェットの使い方(p.029)# grid関数でウィジェットを格子状に配置する(p.030~p.032)# BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# 2つの画面を切り替える(p.034~p.035)# Comboboxウィジェットを使う(p.035~p.036)# 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# Radiobuttonウィジェットを使う(p.038~p.039)# CSVファイルを読み込む(p.039)# 4択クイズのデスクトップアプリを作る(p.039~p.040)# Part2 「BMI計算機」を作ろう(p.029~p.033)# Buttonウィジェットの使い方(p.029)#========== リスト1●「Button.py」# 「Buttonウィジェット」のテストプログラム。# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tkinter」モジュールから「messagebox」モジュールをインポートする。from tkinter import messagebox# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの表示タイトルを「ボタンテスト」にする。root.title('ボタンテスト')# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x150')は、横サイズ=300ピクセル、縦サイズ=150ピクセルを表しているroot.geometry('300x150')# 「Entry」ウイジェットの生成と配置# テキストボックスの「Entry」ウイジェットを「Entry」関数を使って生成し、「pack」関数を使って配置する。txt = tk.Entry(width=20)txt.pack(pady=50)# ハンドラ関数def click(): message.showinfo('メッセージ', txt.get())# Buttonウイジェットの生成と配置btn = tk.Button(root, text='表示', command=click)btn.pack()# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト1●「Button.py」は、ここまで
2023.02.25
コメント(0)
# -*- coding: utf-8 -*-"""Created on Tue Dec 20 15:55:17 2022@author: mlupi""""""今度は、『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦しようと思います。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その6## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ウィジェットとウィジェットの親子関係(p.024~p.026)# イベント駆動型のプログラミング(p.026~p.027)# ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# Buttonウィジェットの使い方(p.029)# grid関数でウィジェットを格子状に配置する(p.030~p.032)# BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# 2つの画面を切り替える(p.034~p.035)# Comboboxウィジェットを使う(p.035~p.036)# 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# Radiobuttonウィジェットを使う(p.038~p.039)# CSVファイルを読み込む(p.039)# 4択クイズのデスクトップアプリを作る(p.039~p.040)# Part1 TkInterの基本をマスターしよう(p.024~p.028)# ウィジェットとウィジェットの親子関係(p.024~p.026)# イベント駆動型のプログラミング(p.026~p.027)# ウィジェットの配置(p.027~p.028)#========== リスト3ー3●「pack-3.py」# 「pack関数」のテストプログラム。# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x150')は、横サイズ=300ピクセル、縦サイズ=150ピクセルを表しているroot.geometry('300x150') # labelウイジェットの生成label_top = tk.Label(root, text='TOP')label_bottom = tk.Label(root, text='BOTTOM')label_left = tk.Label(root, text='LEFT')label_right = tk.Label(root, text='RIGHT')# labelウイジェットの配置# 「side」オプションを使えば、ウィジェットの配置方向を上下左右の中から指定できる。# 「side」オプションの順番を変えると、ウィジェットの配置がずれる。# その理由は、記事を読むか、自分で調べてみてください。label_left.pack(side=tk.LEFT)label_top.pack(side=tk.TOP)label_right.pack(side=tk.RIGHT)label_bottom.pack(side=tk.BOTTOM)# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト3ー3●「pack-3.py」は、ここまで〇リスト3ー3の実行結果
2022.12.20
コメント(0)
"""今度は、『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦しようと思います。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その5## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ウィジェットとウィジェットの親子関係(p.024~p.026)# イベント駆動型のプログラミング(p.026~p.027)# ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# Buttonウィジェットの使い方(p.029)# grid関数でウィジェットを格子状に配置する(p.030~p.032)# BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# 2つの画面を切り替える(p.034~p.035)# Comboboxウィジェットを使う(p.035~p.036)# 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# Radiobuttonウィジェットを使う(p.038~p.039)# CSVファイルを読み込む(p.039)# 4択クイズのデスクトップアプリを作る(p.039~p.040)# Part1 TkInterの基本をマスターしよう(p.024~p.028)# ウィジェットとウィジェットの親子関係(p.024~p.026)# イベント駆動型のプログラミング(p.026~p.027)# ウィジェットの配置(p.027~p.028)#========== リスト3ー2●「pack-2.py」# 「pack関数」のテストプログラム。# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x150')は、横サイズ=300ピクセル、縦サイズ=150ピクセルを表しているroot.geometry('300x150') # labelウイジェットの生成label_top = tk.Label(root, text='TOP')label_bottom = tk.Label(root, text='BOTTOM')label_left = tk.Label(root, text='LEFT')label_right = tk.Label(root, text='RIGHT')# labelウイジェットの配置# 「side」オプションを使えば、ウィジェットの配置方向を上下左右の中から指定できる。label_top.pack(side=tk.TOP)label_bottom.pack(side=tk.BOTTOM)label_left.pack(side=tk.LEFT)label_right.pack(side=tk.RIGHT)# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト3ー2●「pack-2.py」は、ここまで〇リスト3ー2の実行結果
2022.12.18
コメント(0)
"""今度は、『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦しようと思います。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その4## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ウィジェットとウィジェットの親子関係(p.024~p.026)# イベント駆動型のプログラミング(p.026~p.027)# ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# Buttonウィジェットの使い方(p.029)# grid関数でウィジェットを格子状に配置する(p.030~p.032)# BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# 2つの画面を切り替える(p.034~p.035)# Comboboxウィジェットを使う(p.035~p.036)# 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# Radiobuttonウィジェットを使う(p.038~p.039)# CSVファイルを読み込む(p.039)# 4択クイズのデスクトップアプリを作る(p.039~p.040)# Part1 TkInterの基本をマスターしよう(p.024~p.028)# ウィジェットとウィジェットの親子関係(p.024~p.026)# イベント駆動型のプログラミング(p.026~p.027)# ウィジェットの配置(p.027~p.028)#========== リスト3●「pack.py」# 「pack関数」のテストプログラム。# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x150')は、横サイズ=300ピクセル、縦サイズ=150ピクセルを表しているroot.geometry('300x150') # labelウイジェットの生成label_top = tk.Label(root, text='TOP')label_bottom = tk.Label(root, text='BOTTOM')label_left = tk.Label(root, text='LEFT')label_right = tk.Label(root, text='RIGHT')# labelウイジェットの配置label_top.pack()label_bottom.pack()label_left.pack()label_right.pack()# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト3●「pack.py」は、ここまで〇リスト3の実行結果
2022.12.17
コメント(0)
"""今度は、『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦しようと思います。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その3## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ウィジェットとウィジェットの親子関係(p.024~p.026)# イベント駆動型のプログラミング(p.026~p.027)# ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# Buttonウィジェットの使い方(p.029)# grid関数でウィジェットを格子状に配置する(p.030~p.032)# BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# 2つの画面を切り替える(p.034~p.035)# Comboboxウィジェットを使う(p.035~p.036)# 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# Radiobuttonウィジェットを使う(p.038~p.039)# CSVファイルを読み込む(p.039)# 4択クイズのデスクトップアプリを作る(p.039~p.040)# Part1 TkInterの基本をマスターしよう(p.024~p.028)# ウィジェットとウィジェットの親子関係(p.024~p.026)# イベント駆動型のプログラミング(p.026~p.027)#========== リスト2●「event_handler.py」# イベントとハンドラ関数の仕組みを確認するためのプログラム。# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tkinter」モジュールから「messagebox」モジュールをインポートする。from tkinter import messagebox# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を生成するための関数。root = tk.Tk()# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で指定する。# ('300x150')は、横サイズ=300ピクセル、縦サイズ=150ピクセルを表しているroot.geometry('300x150')# 「Entry」ウイジェットの生成と配置# テキストボックスの「Entry」ウイジェットを「Entry」関数を使って生成し、「pack」関数を使って配置する。txt = tk.Entry(width=20)txt.pack(pady=50)# ハンドラ関数# ボタンがクリックされた時に実行されるハンドラ関数「click」を定義する。def click(event): messagebox.showinfo('メッセージ', txt.get()) # labelウイジェットの生成label = tk.Label(root, text='ここをクリック', foreground='red')# labelウイジェットの配置label.pack()# ハンドラ関数を設定# ボタンの表示(<Button-1)とハンドラ関数(click)を紐づける。label.bind("<Button-1>", click)# ウインドウの子ウイジェットを表示print(root.children)# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト2●「event_handler.py」は、ここまで〇リスト2●「event_handler.py」の実行結果
2022.11.24
コメント(0)
"""今度は、『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonでデスクトップアプリを作ろう 前編」に挑戦しようと思います。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。"""# 「Pythonでデスクトップアプリを作ろう 前編」 その2## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ウィジェットとウィジェットの親子関係(p.024~p.026)# イベント駆動型のプログラミング(p.026~p.027)# ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# Buttonウィジェットの使い方(p.029)# grid関数でウィジェットを格子状に配置する(p.030~p.032)# BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# 2つの画面を切り替える(p.034~p.035)# Comboboxウィジェットを使う(p.035~p.036)# 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# Radiobuttonウィジェットを使う(p.038~p.039)# CSVファイルを読み込む(p.039)# 4択クイズのデスクトップアプリを作る(p.039~p.040)# Part1 TkInterの基本をマスターしよう(p.024~p.028)# ウィジェットとウィジェットの親子関係(p.024~p.026)#========== リスト1●「windows.py」# テキストボックスを子ウイジェットとして持つ、ウインドウを表示するプログラム# GUIライブラリーの「Tkinter」モジュールを、「tk」という名前でインポートする。import tkinter as tk# 「Tk」関数を使って、ウインドウ(トップレベルtkウイジェット)を生成し、# 「root」という名前を付ける# 「Tk」関数は、「Tk」クラスから、ウインドウ(トップレベルtkウイジェット)を# 生成するための関数。root = tk.Tk()# ウインドウの中身の大きさを指定# ウインドウの中身(タイトルバーなどを除いた内部)の大きさを「geometry」関数で(指定する。# ('300x150')は、横サイズ=300ピクセル、縦サイズ=150ピクセルを表しているroot.geometry('300x150')# 「Entry」ウイジェットの生成と配置# テキストボックスの「Entry」ウイジェットを「Entry」関数を使って生成し、# 「pack」関数を使って配置する。txt = tk.Entry(width=20)txt.pack(pady=50)# ウインドウの子ウイジェットを表示print(root.children)# ウインドウを表示して、「メインループ」に入る。# 「mainloop(メインループ)」は、「イベントループ」で、ウインドウで発生する# 「イベント」を待っている状態のループ。root.mainloop()#========== リスト1●「windows.py」は、ここまで〇リスト1●「windows.py」の実行結果
2022.11.16
コメント(0)
今度は、『日経ソフトウエア』2022年09月号(p.024~p.040)の特集記事「特集2 Pythonで標準のGUIライブラリ「TkInter」を使ってデスクトップアプリを作ろう 前編」に挑戦しようと思います。なお、基礎については、当ブログの「Pythonことはじめ」などを参照してください。# 「Pythonでデスクトップアプリを作ろう 前編」 その1## 『日経ソフトウエア』2022年09月号(p.024~p.040)## 目次## Part1 TkInterの基本をマスターしよう(p.024~p.028)# ウィジェットとウィジェットの親子関係(p.024~p.026)# イベント駆動型のプログラミング(p.026~p.027)# ウィジェットの配置(p.027~p.028)# Part2 「BMI計算機」を作ろう(p.029~p.033)# Buttonウィジェットの使い方(p.029)# grid関数でウィジェットを格子状に配置する(p.030~p.032)# BMI計算機のデスクトップアプリを作る(p.032~p.033)# Part3 「割り勘計算機」アプリを作ろう(p.034~p.037)# 2つの画面を切り替える(p.034~p.035)# Comboboxウィジェットを使う(p.035~p.036)# 割り勘計算機のデスクトップアプリを作る(p.036~p.037)# Part4 「4択クイズ」アプリを作ろう(p.037~p.040)# Radiobuttonウィジェットを使う(p.038~p.039)# CSVファイルを読み込む(p.039)# 4択クイズのデスクトップアプリを作る(p.039~p.040)
2022.10.22
コメント(0)
「独学でイッキに学べるPython入門」 その16 おまけ8〇PythonスクリプトのEXE化のまとめ「pipenv」を用いたPythonスクリプトのEXE化#Python#EXE化#exe化できない#PyInstaller#pipenv参考にしたURL:[B! Python] PyQt5で作成したアプリケーションをPyInstallerでEXE化する - Qiita (hatena.ne.jp)① 仮想環境を構築 PythonスクリプトをEXE化するには、仮想環境下で行う方が良いようです。その理由は、 ・Pythonのインストール方法はいくつかあるため、複数のPythonがインストールされていること があり、PyInstallerがどのバージョンか認識できないことがあるようだ。 ・PyInstallerは、環境下にあるモジュールをすべて取り込んでしまうようなので、仮想環境下で 最小限のモジュールだけをインストールすることで、サイズを小さくできるとのこと。①ー1 「pipenv」をインストールする。 仮想環境を実現するコマンドには、「pipenv」と「venv」が用意されているが、ここでは「pipenv」を使用した。 通常のコマンドプロンプトで、次のコマンドで「pipenv」をインストールする。 (既にインストールしている場合は、毎回インストールする必要はない。) (base) C:\Users\(ユーザ名)>pip install pipenv ・実施例====================================== (base) C:\Users\mlupi>pip install pipenv ==========================================①ー2 適当なフォルダを作成し、そのフォルダに移動する。 適当なフォルダ(ここでは、「exe4Qt」)を作成し、次のコマンドでそのフォルダに移動する。 (base) C:\Users\(ユーザ名)>md (作成したフォルダ名) (base) C:\Users\(ユーザ名)>cd (作成したフォルダ名) (base) C:\Users\(ユーザ名)\(作成したフォルダ名)> ・実施例====================================== (base) C:\Users\mlupi>md exe4Qt (base) C:\Users\mlupi>cd exe4Qt (base) C:\Users\mlupi\exe4Qt> ==========================================①ー3 Pythonをインストールする。 仮想環境に次のコマンドでPythonをインストールする。 (base) C:\Users\(ユーザ名)\(作成したフォルダ名)>pipenv --python (インストールしたいPythonのバージョン番号) ・実施例====================================== (base) C:\Users\mlupi\exe4Qt> pipenv --python 3.9 ==========================================①ー4 仮想環境に入る。 次のコマンドで、仮想環境に入る。 ちなみに仮想環境から出るコマンドは、「exit」。 (base) C:\Users\(ユーザ名)\(作成したフォルダ名)>pipenv shell ・実施例====================================== (base) C:\Users\mlupi\exe4Qt>pipenv shell ==========================================①ー5 必要なライブラリをインストールする。 仮想環境にライブラリのインストール場所を教えるため、必要なモジュールを仮想環境にインストールする。 (base) C:\Users\(ユーザ名)\(作成したフォルダ名)>pipenv install (必要なモジュール名) ・実施例====================================== (base) C:\Users\mlupi\exe4Qt>pipenv install PyQt6 ==========================================② 「PyInstaller」を使用してexe化を行う。②ー1 「PyInstaller」をインストールしていない場合は、「PyInstaller」をインストールする。 (一度インストールすれば、その都度インストールする必要はない。) (base) C:\Users\(ユーザ名)>pip install pyinstaller ・実施例====================================== (base) C:\Users\mlupi>pip install pyinstaller ==========================================②ー2 「PyInstaller」で目的のPythonスクリプトファイルをexe化する。 (base) C:\Users\(ユーザ名)\(作成したフォルダ名)>pyinstaller (目的のファイル名).py --onefile --noconsole 「--onefile」:このオプションを付けないと、複数のファイルになってしまう。 「--noconsole」:このオプションを指定することで、コンソール画面が出力されなくなる。 ・実施例====================================== (base) C:\Users\mlupi\exe4Qt> pyinstaller ResizePicturePyQt.py --onefile --noconsole ==========================================
2022.10.15
コメント(0)
「独学でイッキに学べるPython入門」 その15 おまけ7 EXE化今回の目標:前回のリスト14をEXE化する。EXE化には、大変苦労しました。以下にその経過を記します。〇「PyInstaller」、「cx-freeze」、「py2exe」を使用するも、うまくいかず。〇「PyInstaller」で、「-p」オプションを指定することで、何とかEXE化できたが、エラーメッセージ(「quit」が定義されていない)が出た。参考にしたURL:[B! Python] PyQt5で作成したアプリケーションをPyInstallerでEXE化する - Qiita (hatena.ne.jp)〇エラーメッセージから、「ファイル」メニュー→「終了」に問題がありそう。〇そこで、元にした「掛け筆算プログラム」を見直したところ、「ファイル」メニュー→「終了」では、終了しないことが判明。〇「ファイル」メニュー→「終了」のスクリプト(抜粋)==========ここから=============== # (9)-4 メニュー項目に相当する「アクション」を作り、「menuFileExit」という名前で参照できるようにする。 # 「QAction」クラスのコンストラクタに渡す最初の引数はアイコンの指定で、ここではQtが持っている # 「SP_TitleBarCloseButton」を指定している。 # 続く引数は、メニュー項目の文字列( '終了(&X)')と親オブジェクト(menuFile)。 menuFileExit = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_TitleBarCloseButton)), '終了(&X)', menuFile) # (9)-5 「終了」メニューが選ばれた場合の処理として、「quit」を指定。 # 「quit」は、「QApplication」静的メソッドで、呼び出すとプログラムが終了する。 menuFileExit.triggered.connect(quit) # (9)-6 「menuFile」に「menuFileExit」アクションを追加する。 menuFile.addAction(menuFileExit)==========ここまで===============〇上記の「quit」が定義されていない旨のメッセージが出たので、いろいろ調べた結果、一応終了するための関数(winClose)を作ってみたところ、「ファイル」メニュー→「終了」で終了することができた。〇参考にしたURLPyQtで「終了」ボタンを作成して、終了するサンプルコードPythonでPyQt5を使用し終了ボタンを作成しシャットダウンする | Men of Letters(メン・オブ・レターズ) – 論理的思考/業務改善/プログラミング (kazuuu.net)〇終了する関数を作ることで、解決しそうなので、リストを次のように書き換えたところ、うまくEXE化できた。===========ここから リスト15===============================# 「独学でイッキに学べるPython入門」 その14 おまけ6 エラー処理を追加 2022/10/02## 今回の変更点は、# 1 選択したフォルダが存在しない場合のエラー処理を追加する。((22)-3)# 2 選択したフォルダ内に画像ファイルが存在しない場合のエラー処理を追加する。((22)-4)##『日経ソフトウエア』2022年05月号(p.006~p.032)## 目次## Part1 開発準備編(p.006~p.009)・・・省略# Part2 データ構造編(p.009~p.015)・・・省略# Part3 処理の仕組み編(p.015~p.009)・・・省略# Part4 開発実践編(p.026~p.009)# ■画像一括リサイズアプリを作ろう(p.026)# ①1つの画像のみリサイズ(p.026~p.029)# [STEP1]1枚の画像のみを無条件にリサイズ(p.027~p.029)→「その3」# [STEP2]1枚の画像のみ、ファイル名に文字列「cat」を含むならリサイズ(p.029~p.031)# [STEP3]すべての画像で、ファイル名に文字列「cat」を含むならリサイズ(p.031~p.032) #〇おまけ:記事の機能は出来上がったのですが、次の項目に挑戦してみたいと思います。# ① GUI化してとりあえず動くようにする。# ② リサイズしたいファイルが入っているフォルダを選択できるようにする。# ③ リサイズしたいファイルを選択できるようにする。# ④ 各種のエラー処理を付け加える。# ⑤ 完成したら、EXE化する。# ① GUI化してとりあえず動くようにする。# ①ー2 「出題」ボタンを「確認」ボタンに変更し、コンボボックスで選択した「画像の幅」、「高さ」# を表示する。# ①ー3 元の仕様では、「cat」をフィル名に含むファイルのみをリサイズすることになっているが、# フォルダ内のファイルすべてをリサイズするように仕様を変更する。# ② リサイズしたいファイルが入っているフォルダを選択できるようにする。# Qtの「QFileDialog」の「getExistingDirectory」を使うことで実現できた。# ただ、このままでは、UI(ユーザーインターフェイス)があまり良くないので、# 次回は、UIの改良に取り組みたいと思います。# ②ー2 「ヘルプ」に「使い方」を追加する。(リスト13)# ③ リサイズしたいファイルを選択できるようにする。→これは実施せず。# ④ 各種のエラー処理を付け加える。(リスト14)# ⑤ 完成したら、EXE化する。(リスト15)# リスト12●「os.listdir」関数で、指定したフォルダー内のすべてのファイル名を取得し、# そのフォルダー内のすべてのファイルをリサイズするプログラムをGUI化する。# (「ヘルプ」に「使い方」を追加した。)# GUI化に当たっては、次の記事を参考にした。#『日経ソフトウエア』2021年11月号(p.52~p.63)# 「特集1 PythonでGUIアプリ開発」の基礎 PyQt/PySide編」## ステップ09 「掛け筆算練習プログラム」# リスト10●掛け筆算練習プログラム(KakeHissanPyQt.py)################################################################################################### ここから今回のプログラムリスト############################ リスト15 画像ファイル一括リサイズプログラム「ResizePicturePyQt.py」###################################################################################################### (1)各種モジュールのインポート## (1)-1 GUI化のためのモジュールのインポートimport random, sys, webbrowserfrom PyQt6.QtCore import *from PyQt6.QtGui import *from PyQt6.QtWidgets import *# (1)-2 本体用のモジュールのインポートimport osfrom PIL import Image# (1)-3 「glob」関数用のモジュールのインポートimport glob# (3)本体用のクラスの設定# 「QMainWindow」クラスを継承した「ResizePicturePyQt」クラスを記述。# 「MainWindow」の名前を「KakeHissanPyQt」から「ResizePicturePyQt」に変更。class ResizePicturePyQt(QMainWindow): # 「ResizePicturePyQt」クラスのコンストラクタ(インスタンス生成時に # 呼び出されるメソッド)である「__init__」を記述。 def __init__(self): # (4)「ResizePicturePyQt」クラスの親クラスである「QMainWindow」クラスのコンストラクタを実行するコード。 # この記述がないと必要な初期処理が実行されない。 super().__init__() # (5)ディレクトリ表示のために挿入。必要がなくなれば、削除すること。 self.textEdit = QTextEdit() # (6)タイトルバー文字列の設定。 # 「ResizePicturePyQt」クラスのインスタンスは、(12)で変数「w」に代入され、「w」という名前で # 参照できるが、その名前はクラスの外部のみからしか利用できない。クラス内部から自分 # 自身のインスタンスを呼び出すには、コンストラクタで指定した「self」という名前を使う。 # 「setWindowTitle」メソッドに与えた「self.__class__.__name__」は、このクラスの名前で、 # 中身は「ResizePicturePyQt」。 self.setWindowTitle(self.__class__.__name__) # (7) 同様に「self」を使って、「ラベルウィジェット」の位置と大きさを設定する。 # 「setGeometry」メソッドは、4つの整数を入力引数として受け取る。 # X 座標 # Y 座標 # フレームの幅 # フレームの高さ xOfFrame = 100 yOfFrame = 100 widthOfFrame =100 heightOfFrame =400 self.setGeometry(xOfFrame, yOfFrame, widthOfFrame, heightOfFrame) # (8) 「QMainWindow」クラスを継承した「pyqt07」クラスの「menuBar」メソッドを呼び出して、 # メニューバーのインスタンスを作り、それを「menu」という名前で参照できるようにする。 menu = self.menuBar() ### ここから「メニューバー」の「ファイル」メニューの記述 #### # (9) 「メニューバー」に「ファイル」メニューを追加し、それを「menuFile」という名前で参照できるようにする。 # 「&(アンパサンド)」の次の文字は「アクセスキー」になる。「Altキー」を押しながら # 「F」キーを押すと、「ファイル」メニューを開けるようになる。 menuFile = menu.addMenu('ファイル(&F)') # (9)-1ディレクトリ表示のため、メニューバーの「ファイル」に「開く」メニューを追加する。 # メニュー項目に相当する「アクション」を作り、「menuFileOpen」という名前で参照できるようにする。 # 「QAction」クラスのコンストラクタに渡す最初の引数はアイコンの指定で、ここではQtが持っている # 「SP_DialogOpenButton」を指定している。 # 続く引数は、メニュー項目の文字列( '開く(&O)')と親オブジェクト(menuFile)。 menuFileOpen = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_DialogOpenButton)), '開く(&O)', menuFile) # (9)-2「開く」メニューが選ばれた場合の処理として、「self.showDialog」を指定。 # 「self.showDialog」は、フォルダを指定して、ファイルを表示する関数。 menuFileOpen.triggered.connect(self.selectDialog) # (9)-3 「menuFile」に「menuFileOpen」アクションを追加する。 menuFile.addAction(menuFileOpen) # (9)-4 メニュー項目に相当する「アクション」を作り、「menuFileExit」という名前で参照できるようにする。 # 「QAction」クラスのコンストラクタに渡す最初の引数はアイコンの指定で、ここではQtが持っている # 「SP_TitleBarCloseButton」を指定している。 # 続く引数は、メニュー項目の文字列( '終了(&X)')と親オブジェクト(menuFile)。 menuFileExit = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_TitleBarCloseButton)), '終了(&X)', menuFile) # (9)-5 「終了」メニューが選ばれた場合の処理として、「quit」を指定。 # 「quit」は、「QApplication」静的メソッドで、呼び出すとプログラムが終了する。 menuFileExit.triggered.connect(self.menuFileExitClicked) # (9)-6 「menuFile」に「menuFileExit」アクションを追加する。 menuFile.addAction(menuFileExit) ### ここから「メニューバー」の「ヘルプ」メニューの記述 #### # (10) 「メニューバー」に「ヘルプ」メニューを生成して、「menuHelp」という名前で参照できるようにする。 menuHelp = menu.addMenu('ヘルプ(&H)') # (10)-1 「使い方(Usage)」を表示するコード。 # そのイベントハンドラは、「menuHelpUsage」。 menuHelpUsage = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_MessageBoxInformation)), '使い方(&U)', menuHelp) menuHelpUsage.triggered.connect( self.menuHelpUsageClicked) menuHelp.addAction(menuHelpUsage) # (10)-2 「menuHelpWeb」メニューを生成して、「menuHelpWeb」という名前で参照できるようにする。 # このメニュー項目が選ばれた場合、(11)の「menuHelpWebClicked」メソッドを呼び出す。 menuHelpWeb = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_DialogHelpButton)), 'Webサイトを開く(&W)', menuHelp) menuHelpWeb.triggered.connect( self.menuHelpWebClicked) menuHelp.addAction(menuHelpWeb) # (10)-3 メニューの区切り線(セパレータ)を追加するコード。 menuHelp.addSeparator() # (10)-4 バージョン情報を追加するコード。 # そのイベントハンドラは、「menuHelpVersion」。 menuHelpVersion = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_MessageBoxInformation)), 'バージョン情報(&V)', menuHelp) menuHelpVersion.triggered.connect( self.menuHelpVersionClicked) menuHelp.addAction(menuHelpVersion) ### ### ここから「セントラルウィジェット」の設定 ### # (11) 「QWidget」クラスのインスタンス「center」を作って、グリッドレイアウトの設定を # 行い、セントラルウィジェットに配置する。 # グリッドの1行目に、「label1」、「cb1」、「label2」、「cb2」、「buttonConfirmation」 # (「確認」ボタン)、「buttonExec」(「実行」ボタン)を並べる。 # 「出題」ボタンを「確認」ボタンに変更。 center = QWidget(self) center.layout = QGridLayout(center) center.setLayout(center.layout) self.setCentralWidget(center) # (11)-1 ラベル「label1」を生成。 # '1行目桁数'を'画像の幅'に変更。 label1 = QLabel('画像の幅', center) # (11)-1-2 水平方向は左寄せ、垂直方向は中央ぞろえに。 label1.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter) # (11)-1-3「label1」をグリッドの1行、1列に配置。 center.layout.addWidget(label1, 0, 0) # (11)-2 コンボボックス「cb1」を生成。 self.cb1 = QComboBox(center) # (11)-2-1 選択肢を指定。 self.cb1.addItems(['150', '300', '1500', '3000']) # (11)-2-2 「cb1」をグリッドの1行、2列に配置。 center.layout.addWidget(self.cb1, 0, 1) # (11)-3 ラベル「label2」を生成。 # '2行目桁数'を'画像の高さ'に変更。 label2 = QLabel('画像の高さ', center) label2.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) center.layout.addWidget(label2, 0, 2) # (11)-4 コンボボックス「cb2」を生成。 self.cb2 = QComboBox(center) self.cb2.addItems(['150', '300', '1500', '3000']) center.layout.addWidget(self.cb2, 0, 3) # (12) 「確認」ボタンを生成。 buttonConfirmation = QPushButton('確認', center) # (12)-1 イベントハンドラとして、(21)の「buttonConfirmationClicked」を指定する。 buttonConfirmation.clicked.connect(self.buttonConfirmationClicked) # (12)-2 「確認」ボタンをグリッドの1行、5列に配置。 center.layout.addWidget(buttonConfirmation, 0, 4) # (13) 「実行」ボタンを生成。 self.buttonExec = QPushButton('実行', center) self.buttonExec.clicked.connect(self.buttonExecClicked) # (14) 起動時に「実行」ボタンが無効になるように設定。 # 問題が生成されていない状態で「実行」ボタンを押しても反応しないようにしている。 self.buttonExec.setEnabled(False) center.layout.addWidget(self.buttonExec, 0, 5) # (15) テキストボックス「text」を生成。 self.text = QTextEdit(center) #(15)-1 「text」のフォントの種類「明朝体」と大きさ「16」を設定。 self.text.setFont(QFont('MS 明朝', 16)) # (15)-2 書き込み禁止にするため、「ReadOnly」に設定。 self.text.setReadOnly(True) # (15)-3 「text」をウインドウの2行目(2番目の引数「1」)、1列目(3番目の引数「0」)に配置 # 引数の4番目は表示に何行分使うか、5番目は表示に何列分使うかの指定。 center.layout.addWidget(self.text, 1, 0, 1, 6) # (16)「show」メソッドを呼び出して、表示する。 self.show() # (17) 「menuHelpUsage」メニュー項目が選ばれた場合のコード。 # このプログラムの「使い方(Usage)」のダイアログを出す。 # def menuHelpUsageClicked(self): s = self.__class__.__name__ s += '\n このアプリの使い方\n' s += '①フォルダの選択\n' s += ' 「ファイル」メニューの「開く」をクリックして、\n' s += ' リサイズしたいファイル(JPEG画像)の入っている\n' s += ' フォルダを指定する。\n' s += '②画像サイズの上限を設定\n' s += '③確認(フォルダ、画像サイズの上限)\n' s += '④「実行」ボタンを押す。\n' QMessageBox.information( self, self.__class__.__name__, s) # (18) 「menuHelpWeb」メニュー項目が選ばれた場合のコード。 # 「webbrowser.open」関数を使うため、(1)で「webbrowser」モジュールをインポートしている。 # def menuHelpWebClicked(self): webbrowser.open( 'https://info.nikkeibp.co.jp/media/NSW/') # (19) 「menuHelpVersion」メニュー項目が選ばれた場合のコード。 # このプログラムのバージョン、作者名等のダイアログを出す。 # 「sys.version」、を使うために(1)で「sys」モジュールをインポートしている。 # バージョンを「0.02」とし、今回の記事の作者である「立山英利」氏、筆者の名前を追加した。 def menuHelpVersionClicked(self): s = self.__class__.__name__ s += '\n Version 0.02(2022/07/12)\n' s += ' Version 0.01(2021/08/25)\n' s += '@2021 Hideo Harada\n' s += '@2022 Hidetoshi Tateyama\n' s += '@2022 Hiroshi Kato\n' s += 'with Python ' + sys.version QMessageBox.information( self, self.__class__.__name__, s) # (20) 「確認」ボタンのイベントハンドラ。 def buttonConfirmationClicked(self): # (20)-1 コンボボックスで選択された項目を取得し、文字列を整数に変換して、 # 変数「widthOfPicture」、「heightOfPicture」に格納する。 # 「widthOfPicture」、「heightOfPicture」は、(21)の「buttonExecClicked」メソッドで参照するので、 # 「self.」をつけて、クラスのメンバー変数にしている。 # 変数「width1」を「widthOfPicture」に、「width2」を「heightOfPicture」に変更。 self.widthOfPicture = int(str(self.cb1.currentText())) self.heightOfPicture = int(str(self.cb2.currentText())) # (20)-2 変数「Confirmation1」に、コンボボックス「cb1」で選んだ値を、 # 「Confirmation2」にコンボボックス「cb2」で選んだ値を格納する。 # self.Confirmation1 = self.widthOfPicture self.Confirmation2 = self.heightOfPicture # (20)-3 「確認」用の文字列を作って、「Confirmation」に格納する。 self.Confirmation = 'フォルダ名 = {}\n'.format(self.dirName) + \ '画像の幅 = {}\n'.format(self.Confirmation1) + \ '画像の高さ = {}\n'.format(self.Confirmation2) # (20)-4 結果を「text」に表示する。 self.text.setText(self.Confirmation) # (20)-5 「実行」ボタンを有効(True)にする。 self.buttonExec.setEnabled(True) # (21) リサイズ「実行」ボタンが押された時の処理。 def buttonExecClicked(self): # (21)-1 「os」モジュールの「listdir」関数で「dirName」フォルダ内のファイル名を入手し、 # 「fnames」に格納する。 fnames = os.listdir(self.dirName) # (21)-2 dirName」フォルダ内の画像ファイル「fname」を、「img」モジュールの「thumbnail」関数で、 # 幅(「widthOfPicture」)、高さ(「heightOfPicture」) for fname in fnames: fpath = os.path.join(self.dirName + '/' + fname) img = Image.open(fpath) img.thumbnail((self.widthOfPicture, self.heightOfPicture)) img.save(fpath) #(21)-3 「dirName」フォルダ内のファイルを表示する。 fileName = QFileDialog.getOpenFileName(self, 'Open file', self.dirName) # (22)フォルダの選択 def selectDialog(self): # (22)-1 ウインドウ内のテキストの初期化 textClear = '' self.text.setText(textClear) # (22)-2 「QFileDialog」の「getExistingDirectory」を使って、リサイズの対象となる画像ファイルのあるフォルダ # を選択するダイアログウインドウを開き、選択したフォルダ名を「self.dirName」に格納する。 # 参考にしたURL:https://qiita.com/Nobu12/items/acd3caa625be8eebc09c # 第二引数はダイアログのタイトル、第三引数は表示するパス名。 # ここでは、引数を省略し、デフォルトの設定を使用する。 self.dirName = QFileDialog.getExistingDirectory() # (22)-3 選択したフォルダが存在しない場合のエラー処理 if self.dirName is None: print('フォルダが存在しませんI') return # (22)-4 選択したフォルダに画像ファイル(*.jpg)が存在しない場合のエラー処理 picPath = self.dirName + '\\' + '*.jpg' picFiles = [] picFiles = glob.glob(picPath) if not picFiles : # (22)-4-1 警告(textWarning)の文字列を設定する。 self.textWarning = '\n <<Warning!!>>\n' + \ ' 画像ファイルが見つかりません!!\n\n' + \ '「ファイル」メニューの「開く」を\n' + \ '選択して、もう一度画像ファイルの\n' + \ 'あるフォルダを選択してください。\n' # (22)-4-2 警告(textWarning)を「text」に表示する。 self.text.setText(self.textWarning) return # (23)「ファイル」メニューの「終了」ボタンが押された時の処理。 def menuFileExitClicked(self): self.close()# (24)プログラムを起動したときに最初に実行される。app = QApplication([])# (25)「ResizePicturePyQt」クラスを生成すると、「def __init__(self):」が実行される。w = ResizePicturePyQt()# (26)これを実行することで、GUIの画面がユーザーに表示される。app.exec() ===========ここまで リスト15===============================
2022.10.03
コメント(0)
# 「独学でイッキに学べるPython入門」 その14 おまけ6 エラー処理を追加 2022/09/19## 今回の変更点は、# 1 選択したフォルダが存在しない場合のエラー処理を追加する。((22)-3)# 2 選択したフォルダ内に画像ファイルが存在しない場合のエラー処理を追加する。((22)-4)##『日経ソフトウエア』2022年05月号(p.006~p.032)## 目次## Part1 開発準備編(p.006~p.009)・・・省略# Part2 データ構造編(p.009~p.015)・・・省略# Part3 処理の仕組み編(p.015~p.009)・・・省略# Part4 開発実践編(p.026~p.009)# ■画像一括リサイズアプリを作ろう(p.026)# ①1つの画像のみリサイズ(p.026~p.029)# [STEP1]1枚の画像のみを無条件にリサイズ(p.027~p.029)→「その3」# [STEP2]1枚の画像のみ、ファイル名に文字列「cat」を含むならリサイズ(p.029~p.031)# [STEP3]すべての画像で、ファイル名に文字列「cat」を含むならリサイズ(p.031~p.032) #〇おまけ:記事の機能は出来上がったのですが、次の項目に挑戦してみたいと思います。# ① GUI化してとりあえず動くようにする。# ② リサイズしたいファイルが入っているフォルダを選択できるようにする。# ③ リサイズしたいファイルを選択できるようにする。# ④ 各種のエラー処理を付け加える。# ⑤ 完成したら、EXE化する。# ① GUI化してとりあえず動くようにする。# ①ー2 「出題」ボタンを「確認」ボタンに変更し、コンボボックスで選択した「画像の幅」、「高さ」# を表示する。# ①ー3 元の仕様では、「cat」をフィル名に含むファイルのみをリサイズすることになっているが、# フォルダ内のファイルすべてをリサイズするように仕様を変更する。# ② リサイズしたいファイルが入っているフォルダを選択できるようにする。# Qtの「QFileDialog」の「getExistingDirectory」を使うことで実現できた。# ただ、このままでは、UI(ユーザーインターフェイス)があまり良くないので、# 次回は、UIの改良に取り組みたいと思います。# ②ー2 「ヘルプ」に「使い方」を追加する。# リスト12●「os.listdir」関数で、指定したフォルダー内のすべてのファイル名を取得し、# そのフォルダー内のすべてのファイルをリサイズするプログラムをGUI化する。# (「ヘルプ」に「使い方」を追加した。)# GUI化に当たっては、次の記事を参考にした。#『日経ソフトウエア』2021年11月号(p.52~p.63)# 「特集1 PythonでGUIアプリ開発」の基礎 PyQt/PySide編」## ステップ09 「掛け筆算練習プログラム」# リスト10●掛け筆算練習プログラム(KakeHissanPyQt.py)################################################################################################### ここから今回のプログラムリスト############################ リスト14 画像ファイル一括リサイズプログラム「ResizePicturePyQt.py」###################################################################################################### (1)各種モジュールのインポート## (1)-1 GUI化のためのモジュールのインポートimport random, sys, webbrowserfrom PyQt6.QtCore import *from PyQt6.QtGui import *from PyQt6.QtWidgets import *# (1)-2 本体用のモジュールのインポートimport osfrom PIL import Image# (1)-3 「glob」関数用のモジュールのインポートimport glob# (3)本体用のクラスの設定# 「QMainWindow」クラスを継承した「ResizePicturePyQt」クラスを記述。# 「MainWindow」の名前を「KakeHissanPyQt」から「ResizePicturePyQt」に変更。class ResizePicturePyQt(QMainWindow): # 「ResizePicturePyQt」クラスのコンストラクタ(インスタンス生成時に # 呼び出されるメソッド)である「__init__」を記述。 def __init__(self): # (4)「ResizePicturePyQt」クラスの親クラスである「QMainWindow」クラスのコンストラクタを実行するコード。 # この記述がないと必要な初期処理が実行されない。 super().__init__() # (5)ディレクトリ表示のために挿入。必要がなくなれば、削除すること。 self.textEdit = QTextEdit() # (6)タイトルバー文字列の設定。 # 「ResizePicturePyQt」クラスのインスタンスは、(12)で変数「w」に代入され、「w」という名前で # 参照できるが、その名前はクラスの外部のみからしか利用できない。クラス内部から自分 # 自身のインスタンスを呼び出すには、コンストラクタで指定した「self」という名前を使う。 # 「setWindowTitle」メソッドに与えた「self.__class__.__name__」は、このクラスの名前で、 # 中身は「ResizePicturePyQt」。 self.setWindowTitle(self.__class__.__name__) # (7) 同様に「self」を使って、「ラベルウィジェット」の位置と大きさを設定する。 # 「setGeometry」メソッドは、4つの整数を入力引数として受け取る。 # X 座標 # Y 座標 # フレームの幅 # フレームの高さ xOfFrame = 100 yOfFrame = 100 widthOfFrame =100 heightOfFrame =400 self.setGeometry(xOfFrame, yOfFrame, widthOfFrame, heightOfFrame) # (8) 「QMainWindow」クラスを継承した「pyqt07」クラスの「menuBar」メソッドを呼び出して、 # メニューバーのインスタンスを作り、それを「menu」という名前で参照できるようにする。 menu = self.menuBar() ### ここから「メニューバー」の「ファイル」メニューの記述 #### # (9) 「メニューバー」に「ファイル」メニューを追加し、それを「menuFile」という名前で参照できるようにする。 # 「&(アンパサンド)」の次の文字は「アクセスキー」になる。「Altキー」を押しながら # 「F」キーを押すと、「ファイル」メニューを開けるようになる。 menuFile = menu.addMenu('ファイル(&F)') # (9)-1ディレクトリ表示のため、メニューバーの「ファイル」に「開く」メニューを追加する。 # メニュー項目に相当する「アクション」を作り、「menuFileOpen」という名前で参照できるようにする。 # 「QAction」クラスのコンストラクタに渡す最初の引数はアイコンの指定で、ここではQtが持っている # 「SP_DialogOpenButton」を指定している。 # 続く引数は、メニュー項目の文字列( '開く(&O)')と親オブジェクト(menuFile)。 menuFileOpen = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_DialogOpenButton)), '開く(&O)', menuFile) # (9)-2「開く」メニューが選ばれた場合の処理として、「self.showDialog」を指定。 # 「self.showDialog」は、フォルダを指定して、ファイルを表示する関数。 menuFileOpen.triggered.connect(self.selectDialog) # (9)-3 「menuFile」に「menuFileOpen」アクションを追加する。 menuFile.addAction(menuFileOpen) # (9)-4 メニュー項目に相当する「アクション」を作り、「menuFileExit」という名前で参照できるようにする。 # 「QAction」クラスのコンストラクタに渡す最初の引数はアイコンの指定で、ここではQtが持っている # 「SP_TitleBarCloseButton」を指定している。 # 続く引数は、メニュー項目の文字列( '終了(&X)')と親オブジェクト(menuFile)。 menuFileExit = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_TitleBarCloseButton)), '終了(&X)', menuFile) # (9)-5 「終了」メニューが選ばれた場合の処理として、「quit」を指定。 # 「quit」は、「QApplication」静的メソッドで、呼び出すとプログラムが終了する。 menuFileExit.triggered.connect(quit) # (9)-6 「menuFile」に「menuFileExit」アクションを追加する。 menuFile.addAction(menuFileExit) ### ここから「メニューバー」の「ヘルプ」メニューの記述 #### # (10) 「メニューバー」に「ヘルプ」メニューを生成して、「menuHelp」という名前で参照できるようにする。 menuHelp = menu.addMenu('ヘルプ(&H)') # (10)-1 「使い方(Usage)」を表示するコード。 # そのイベントハンドラは、「menuHelpUsage」。 menuHelpUsage = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_MessageBoxInformation)), '使い方(&U)', menuHelp) menuHelpUsage.triggered.connect( self.menuHelpUsageClicked) menuHelp.addAction(menuHelpUsage) # (10)-2 「menuHelpWeb」メニューを生成して、「menuHelpWeb」という名前で参照できるようにする。 # このメニュー項目が選ばれた場合、(11)の「menuHelpWebClicked」メソッドを呼び出す。 menuHelpWeb = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_DialogHelpButton)), 'Webサイトを開く(&W)', menuHelp) menuHelpWeb.triggered.connect( self.menuHelpWebClicked) menuHelp.addAction(menuHelpWeb) # (10)-3 メニューの区切り線(セパレータ)を追加するコード。 menuHelp.addSeparator() # (10)-4 バージョン情報を追加するコード。 # そのイベントハンドラは、「menuHelpVersion」。 menuHelpVersion = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_MessageBoxInformation)), 'バージョン情報(&V)', menuHelp) menuHelpVersion.triggered.connect( self.menuHelpVersionClicked) menuHelp.addAction(menuHelpVersion) ### ### ここから「セントラルウィジェット」の設定 ### # (11) 「QWidget」クラスのインスタンス「center」を作って、グリッドレイアウトの設定を # 行い、セントラルウィジェットに配置する。 # グリッドの1行目に、「label1」、「cb1」、「label2」、「cb2」、「buttonConfirmation」 # (「確認」ボタン)、「buttonExec」(「実行」ボタン)を並べる。 # 「出題」ボタンを「確認」ボタンに変更。 center = QWidget(self) center.layout = QGridLayout(center) center.setLayout(center.layout) self.setCentralWidget(center) # (11)-1 ラベル「label1」を生成。 # '1行目桁数'を'画像の幅'に変更。 label1 = QLabel('画像の幅', center) # (11)-1-2 水平方向は左寄せ、垂直方向は中央ぞろえに。 label1.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter) # (11)-1-3「label1」をグリッドの1行、1列に配置。 center.layout.addWidget(label1, 0, 0) # (11)-2 コンボボックス「cb1」を生成。 self.cb1 = QComboBox(center) # (11)-2-1 選択肢を指定。 self.cb1.addItems(['150', '300', '1500', '3000']) # (11)-2-2 「cb1」をグリッドの1行、2列に配置。 center.layout.addWidget(self.cb1, 0, 1) # (11)-3 ラベル「label2」を生成。 # '2行目桁数'を'画像の高さ'に変更。 label2 = QLabel('画像の高さ', center) label2.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) center.layout.addWidget(label2, 0, 2) # (11)-4 コンボボックス「cb2」を生成。 self.cb2 = QComboBox(center) self.cb2.addItems(['150', '300', '1500', '3000']) center.layout.addWidget(self.cb2, 0, 3) # (12) 「確認」ボタンを生成。 buttonConfirmation = QPushButton('確認', center) # (12)-1 イベントハンドラとして、(21)の「buttonConfirmationClicked」を指定する。 buttonConfirmation.clicked.connect(self.buttonConfirmationClicked) # (12)-2 「確認」ボタンをグリッドの1行、5列に配置。 center.layout.addWidget(buttonConfirmation, 0, 4) # (13) 「実行」ボタンを生成。 self.buttonExec = QPushButton('実行', center) self.buttonExec.clicked.connect(self.buttonExecClicked) # (14) 起動時に「実行」ボタンが無効になるように設定。 # 問題が生成されていない状態で「実行」ボタンを押しても反応しないようにしている。 self.buttonExec.setEnabled(False) center.layout.addWidget(self.buttonExec, 0, 5) # (15) テキストボックス「text」を生成。 self.text = QTextEdit(center) #(15)-1 「text」のフォントの種類「明朝体」と大きさ「16」を設定。 self.text.setFont(QFont('MS 明朝', 16)) # (15)-2 書き込み禁止にするため、「ReadOnly」に設定。 self.text.setReadOnly(True) # (15)-3 「text」をウインドウの2行目(2番目の引数「1」)、1列目(3番目の引数「0」)に配置 # 引数の4番目は表示に何行分使うか、5番目は表示に何列分使うかの指定。 center.layout.addWidget(self.text, 1, 0, 1, 6) # (16)「show」メソッドを呼び出して、表示する。 self.show() # (17) 「menuHelpUsage」メニュー項目が選ばれた場合のコード。 # このプログラムの「使い方(Usage)」のダイアログを出す。 # def menuHelpUsageClicked(self): s = self.__class__.__name__ s += '\n このアプリの使い方\n' s += '①フォルダの選択\n' s += ' 「ファイル」メニューの「開く」をクリックして、\n' s += ' リサイズしたいファイル(JPEG画像)の入っている\n' s += ' フォルダを指定する。\n' s += '②画像サイズの上限を設定\n' s += '③確認(フォルダ、画像サイズの上限)\n' s += '④「実行」ボタンを押す。\n' QMessageBox.information( self, self.__class__.__name__, s) # (18) 「menuHelpWeb」メニュー項目が選ばれた場合のコード。 # 「webbrowser.open」関数を使うため、(1)で「webbrowser」モジュールをインポートしている。 # def menuHelpWebClicked(self): webbrowser.open( 'https://info.nikkeibp.co.jp/media/NSW/') # (19) 「menuHelpVersion」メニュー項目が選ばれた場合のコード。 # このプログラムのバージョン、作者名等のダイアログを出す。 # 「sys.version」、を使うために(1)で「sys」モジュールをインポートしている。 # バージョンを「0.02」とし、今回の記事の作者である「立山英利」氏、筆者の名前を追加した。 def menuHelpVersionClicked(self): s = self.__class__.__name__ s += '\n Version 0.02(2022/07/12)\n' s += ' Version 0.01(2021/08/25)\n' s += '@2021 Hideo Harada\n' s += '@2022 Hidetoshi Tateyama\n' s += '@2022 Hiroshi Kato\n' s += 'with Python ' + sys.version QMessageBox.information( self, self.__class__.__name__, s) # (20) 「確認」ボタンのイベントハンドラ。 def buttonConfirmationClicked(self): # (20)-1 コンボボックスで選択された項目を取得し、文字列を整数に変換して、 # 変数「widthOfPicture」、「heightOfPicture」に格納する。 # 「widthOfPicture」、「heightOfPicture」は、(21)の「buttonExecClicked」メソッドで参照するので、 # 「self.」をつけて、クラスのメンバー変数にしている。 # 変数「width1」を「widthOfPicture」に、「width2」を「heightOfPicture」に変更。 self.widthOfPicture = int(str(self.cb1.currentText())) self.heightOfPicture = int(str(self.cb2.currentText())) # (20)-2 変数「Confirmation1」に、コンボボックス「cb1」で選んだ値を、 # 「Confirmation2」にコンボボックス「cb2」で選んだ値を格納する。 # self.Confirmation1 = self.widthOfPicture self.Confirmation2 = self.heightOfPicture # (20)-3 「確認」用の文字列を作って、「Confirmation」に格納する。 self.Confirmation = 'フォルダ名 = {}\n'.format(self.dirName) + \ '画像の幅 = {}\n'.format(self.Confirmation1) + \ '画像の高さ = {}\n'.format(self.Confirmation2) # (20)-4 結果を「text」に表示する。 self.text.setText(self.Confirmation) # (20)-5 「実行」ボタンを有効(True)にする。 self.buttonExec.setEnabled(True) # (21) リサイズ「実行」ボタンが押された時の処理。 def buttonExecClicked(self): # (21)-1 「os」モジュールの「listdir」関数で「dirName」フォルダ内のファイル名を入手し、 # 「fnames」に格納する。 fnames = os.listdir(self.dirName) # (21)-2 dirName」フォルダ内の画像ファイル「fname」を、「img」モジュールの「thumbnail」関数で、 # 幅(「widthOfPicture」)、高さ(「heightOfPicture」) for fname in fnames: fpath = os.path.join(self.dirName + '/' + fname) img = Image.open(fpath) img.thumbnail((self.widthOfPicture, self.heightOfPicture)) img.save(fpath) #(21)-3 「dirName」フォルダ内のファイルを表示する。 fileName = QFileDialog.getOpenFileName(self, 'Open file', self.dirName) # (22)フォルダの選択 def selectDialog(self): # (22)-1 ウインドウ内のテキストの初期化 textClear = '' self.text.setText(textClear) # (22)-2 「QFileDialog」の「getExistingDirectory」を使って、リサイズの対象となる画像ファイルのあるフォルダ # を選択するダイアログウインドウを開き、選択したフォルダ名を「self.dirName」に格納する。 # 参考にしたURL:https://qiita.com/Nobu12/items/acd3caa625be8eebc09c # 第二引数はダイアログのタイトル、第三引数は表示するパス名。 # ここでは、引数を省略し、デフォルトの設定を使用する。 self.dirName = QFileDialog.getExistingDirectory() # (22)-3 選択したフォルダが存在しない場合のエラー処理 if self.dirName is None: print('フォルダが存在しませんI') return # (22)-4 選択したフォルダに画像ファイル(*.jpg)が存在しない場合のエラー処理 picPath = self.dirName + '\\' + '*.jpg' picFiles = [] picFiles = glob.glob(picPath) if not picFiles : # (22)-4-1 警告(textWarning)の文字列を設定する。 self.textWarning = '\n <<Warning!!>>\n' + \ ' 画像ファイルが見つかりません!!\n\n' + \ '「ファイル」メニューの「開く」を\n' + \ '選択して、もう一度画像ファイルの\n' + \ 'あるフォルダを選択してください。\n' # (22)-4-2 警告(textWarning)を「text」に表示する。 self.text.setText(self.textWarning) return # (23)プログラムを起動したときに最初に実行される。app = QApplication([])# (24)「ResizePicturePyQt」クラスを生成すると、「def __init__(self):」が実行される。w = ResizePicturePyQt()# (25)これを実行することで、GUIの画面がユーザーに表示される。app.exec() 〇リスト14の実行結果「開く」を選択し、画像ファイルのないフォルダを選択した場合。
2022.09.18
コメント(0)
# 「独学でイッキに学べるPython入門」 その13 おまけ5 ヘルプに使い方を追加 2022/08/30## 今回の変更点は、# 1 「使い方」を「メニューバー」の「ヘルプ」メニューに追加した。# 2 リスト内の説明のための番号をつけ直した。# 3 冗長な説明を削除した。# 4 実行後にリサイズを。実施したフォルダ内のファイルを表示するようにした。##『日経ソフトウエア』2022年05月号(p.006~p.032)## 目次## Part1 開発準備編(p.006~p.009)・・・省略# Part2 データ構造編(p.009~p.015)・・・省略# Part3 処理の仕組み編(p.015~p.009)・・・省略# Part4 開発実践編(p.026~p.009)# ■画像一括リサイズアプリを作ろう(p.026)# ①1つの画像のみリサイズ(p.026~p.029)# [STEP1]1枚の画像のみを無条件にリサイズ(p.027~p.029)→「その3」# [STEP2]1枚の画像のみ、ファイル名に文字列「cat」を含むならリサイズ(p.029~p.031)# [STEP3]すべての画像で、ファイル名に文字列「cat」を含むならリサイズ(p.031~p.032) #〇おまけ:記事の機能は出来上がったのですが、次の項目に挑戦してみたいと思います。# ① GUI化してとりあえず動くようにする。# ② リサイズしたいファイルが入っているフォルダを選択できるようにする。# ③ リサイズしたいファイルを選択できるようにする。# ④ 各種のエラー処理を付け加える。# ⑤ 完成したら、EXE化する。# ① GUI化してとりあえず動くようにする。# ①ー2 「出題」ボタンを「確認」ボタンに変更し、コンボボックスで選択した「画像の幅」、「高さ」# を表示する。# ①ー3 元の仕様では、「cat」をフィル名に含むファイルのみをリサイズすることになっているが、# フォルダ内のファイルすべてをリサイズするように仕様を変更する。# ② リサイズしたいファイルが入っているフォルダを選択できるようにする。# Qtの「QFileDialog」の「getExistingDirectory」を使うことで実現できた。# ただ、このままでは、UI(ユーザーインターフェイス)があまり良くないので、# 次回は、UIの改良に取り組みたいと思います。# ②ー2 「ヘルプ」に「使い方」を追加する。# リスト12●「os.listdir」関数で、指定したフォルダー内のすべてのファイル名を取得し、# そのフォルダー内のすべてのファイルをリサイズするプログラムをGUI化する。# (「ヘルプ」に「使い方」を追加した。)# GUI化に当たっては、次の記事を参考にした。#『日経ソフトウエア』2021年11月号(p.52~p.63)# 「特集1 PythonでGUIアプリ開発」の基礎 PyQt/PySide編」## ステップ09 「掛け筆算練習プログラム」# リスト10●掛け筆算練習プログラム(KakeHissanPyQt.py)################################################################################################### ここから今回のプログラムリスト############################ リスト13 画像ファイル一括リサイズプログラム「ResizePicturePyQt.py」##################################################################################################### (1)GUI化のためのモジュールのインポートimport random, sys, webbrowserfrom PyQt6.QtCore import *from PyQt6.QtGui import *from PyQt6.QtWidgets import *# (2)本体用のモジュールのインポートimport osfrom PIL import Image# (3)本体用のクラスの設定# 「QMainWindow」クラスを継承した「ResizePicturePyQt」クラスを記述。# 「MainWindow」の名前を「KakeHissanPyQt」から「ResizePicturePyQt」に変更。class ResizePicturePyQt(QMainWindow): # 「ResizePicturePyQt」クラスのコンストラクタ(インスタンス生成時に # 呼び出されるメソッド)である「__init__」を記述。 def __init__(self): # (4)「ResizePicturePyQt」クラスの親クラスである「QMainWindow」クラスのコンストラクタを実行するコード。 # この記述がないと必要な初期処理が実行されない。 super().__init__() # (5)ディレクトリ表示のために挿入。必要がなくなれば、削除すること。 self.textEdit = QTextEdit() # # (6)タイトルバー文字列の設定。 # 「ResizePicturePyQt」クラスのインスタンスは、(12)で変数「w」に代入され、「w」という名前で # 参照できるが、その名前はクラスの外部のみからしか利用できない。クラス内部から自分 # 自身のインスタンスを呼び出すには、コンストラクタで指定した「self」という名前を使う。 # 「setWindowTitle」メソッドに与えた「self.__class__.__name__」は、このクラスの名前で、 # 中身は「ResizePicturePyQt」。 self.setWindowTitle(self.__class__.__name__) # (7) 同様に「self」を使って、「ラベルウィジェット」の位置と大きさを設定する。 # 「setGeometry」メソッドは、4つの整数を入力引数として受け取る。 # X 座標 # Y 座標 # フレームの幅 # フレームの高さ xOfFrame = 100 yOfFrame = 100 widthOfFrame =100 heightOfFrame =400 self.setGeometry(xOfFrame, yOfFrame, widthOfFrame, heightOfFrame) # (8) 「QMainWindow」クラスを継承した「pyqt07」クラスの「menuBar」メソッドを呼び出して、 # メニューバーのインスタンスを作り、それを「menu」という名前で参照できるようにする。 menu = self.menuBar() ### ここから「メニューバー」の「ファイル」メニューの記述 #### # (9) 「メニューバー」に「ファイル」メニューを追加し、それを「menuFile」という名前で参照できるようにする。 # 「&(アンパサンド)」の次の文字は「アクセスキー」になる。「Altキー」を押しながら # 「F」キーを押すと、「ファイル」メニューを開けるようになる。 menuFile = menu.addMenu('ファイル(&F)') # (9)-1ディレクトリ表示のため、メニューバーの「ファイル」に「開く」メニューを追加する。 # メニュー項目に相当する「アクション」を作り、「menuFileOpen」という名前で参照できるようにする。 # 「QAction」クラスのコンストラクタに渡す最初の引数はアイコンの指定で、ここではQtが持っている # 「SP_DialogOpenButton」を指定している。 # 続く引数は、メニュー項目の文字列( '開く(&O)')と親オブジェクト(menuFile)。 menuFileOpen = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_DialogOpenButton)), '開く(&O)', menuFile) # (9)-2「開く」メニューが選ばれた場合の処理として、「self.showDialog」を指定。 # 「self.showDialog」は、フォルダを指定して、ファイルを表示する関数。 menuFileOpen.triggered.connect(self.selectDialog) # (9)-3 「menuFile」に「menuFileOpen」アクションを追加する。 menuFile.addAction(menuFileOpen) # (9)-4 メニュー項目に相当する「アクション」を作り、「menuFileExit」という名前で参照できるようにする。 # 「QAction」クラスのコンストラクタに渡す最初の引数はアイコンの指定で、ここではQtが持っている # 「SP_TitleBarCloseButton」を指定している。 # 続く引数は、メニュー項目の文字列( '終了(&X)')と親オブジェクト(menuFile)。 menuFileExit = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_TitleBarCloseButton)), '終了(&X)', menuFile) # (9)-5 「終了」メニューが選ばれた場合の処理として、「quit」を指定。 # 「quit」は、「QApplication」静的メソッドで、呼び出すとプログラムが終了する。 menuFileExit.triggered.connect(quit) # (9)-6 「menuFile」に「menuFileExit」アクションを追加する。 menuFile.addAction(menuFileExit) ### ここから「メニューバー」の「ヘルプ」メニューの記述 #### # (10) 「メニューバー」に「ヘルプ」メニューを生成して、「menuHelp」という名前で参照できるようにする。 menuHelp = menu.addMenu('ヘルプ(&H)') # (10)-1 「使い方(Usage)」を表示するコード。 # そのイベントハンドラは、「menuHelpUsage」。 menuHelpUsage = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_MessageBoxInformation)), '使い方(&U)', menuHelp) menuHelpUsage.triggered.connect( self.menuHelpUsageClicked) menuHelp.addAction(menuHelpUsage) # (10)-2 「menuHelpWeb」メニューを生成して、「menuHelpWeb」という名前で参照できるようにする。 # このメニュー項目が選ばれた場合、(11)の「menuHelpWebClicked」メソッドを呼び出す。 menuHelpWeb = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_DialogHelpButton)), 'Webサイトを開く(&W)', menuHelp) menuHelpWeb.triggered.connect( self.menuHelpWebClicked) menuHelp.addAction(menuHelpWeb) # (10)-3 メニューの区切り線(セパレータ)を追加するコード。 menuHelp.addSeparator() # (10)-4 バージョン情報を追加するコード。 # そのイベントハンドラは、「menuHelpVersion」。 menuHelpVersion = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_MessageBoxInformation)), 'バージョン情報(&V)', menuHelp) menuHelpVersion.triggered.connect( self.menuHelpVersionClicked) menuHelp.addAction(menuHelpVersion) ### ### ここから「セントラルウィジェット」の設定 ### # (11) 「QWidget」クラスのインスタンス「center」を作って、グリッドレイアウトの設定を # 行い、セントラルウィジェットに配置する。 # グリッドの1行目に、「label1」、「cb1」、「label2」、「cb2」、「buttonConfirmation」 # (「確認」ボタン)、「buttonExec」(「実行」ボタン)を並べる。 # 「出題」ボタンを「確認」ボタンに変更。 center = QWidget(self) center.layout = QGridLayout(center) center.setLayout(center.layout) self.setCentralWidget(center) # (11)-1 ラベル「label1」を生成。 # '1行目桁数'を'画像の幅'に変更。 label1 = QLabel('画像の幅', center) # (11)-1-2 水平方向は左寄せ、垂直方向は中央ぞろえに。 label1.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter) # (11)-1-3「label1」をグリッドの1行、1列に配置。 center.layout.addWidget(label1, 0, 0) # (11)-2 コンボボックス「cb1」を生成。 self.cb1 = QComboBox(center) # (11)-2-1 選択肢を指定。 self.cb1.addItems(['150', '300', '1500', '3000']) # (11)-2-2 「cb1」をグリッドの1行、2列に配置。 center.layout.addWidget(self.cb1, 0, 1) # (11)-3 ラベル「label2」を生成。 # '2行目桁数'を'画像の高さ'に変更。 label2 = QLabel('画像の高さ', center) label2.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) center.layout.addWidget(label2, 0, 2) # (11)-4 コンボボックス「cb2」を生成。 self.cb2 = QComboBox(center) self.cb2.addItems(['150', '300', '1500', '3000']) center.layout.addWidget(self.cb2, 0, 3) # (12) 「確認」ボタンを生成。 buttonConfirmation = QPushButton('確認', center) # (12)-1 イベントハンドラとして、(21)の「buttonConfirmationClicked」を指定する。 buttonConfirmation.clicked.connect(self.buttonConfirmationClicked) # (12)-2 「確認」ボタンをグリッドの1行、5列に配置。 center.layout.addWidget(buttonConfirmation, 0, 4) # (13) 「実行」ボタンを生成。 self.buttonExec = QPushButton('実行', center) self.buttonExec.clicked.connect(self.buttonExecClicked) # (14) 起動時に「実行」ボタンが無効になるように設定。 # 問題が生成されていない状態で「実行」ボタンを押しても反応しないようにしている。 self.buttonExec.setEnabled(False) center.layout.addWidget(self.buttonExec, 0, 5) # (15) テキストボックス「text」を生成。 self.text = QTextEdit(center) #(15)-1 「text」のフォントの種類「明朝体」と大きさ「16」を設定。 self.text.setFont(QFont('MS 明朝', 16)) # (15)-2 書き込み禁止にするため、「ReadOnly」に設定。 self.text.setReadOnly(True) # (15)-3 「text」をウインドウの2行目(2番目の引数「1」)、1列目(3番目の引数「0」)に配置 # 引数の4番目は表示に何行分使うか、5番目は表示に何列分使うかの指定。 center.layout.addWidget(self.text, 1, 0, 1, 6) # (16)「show」メソッドを呼び出して、表示する。 self.show() # (17) 「menuHelpUsage」メニュー項目が選ばれた場合のコード。 # このプログラムの「使い方(Usage)」のダイアログを出す。 # def menuHelpUsageClicked(self): s = self.__class__.__name__ s += '\n このアプリの使い方\n' s += '①フォルダの選択\n' s += ' 「ファイル」メニューの「開く」をクリックして、\n' s += ' リサイズしたいファイル(JPEG画像)の入っている\n' s += ' フォルダを指定する。\n' s += '②画像サイズの上限を設定\n' s += '③確認(フォルダ、画像サイズの上限)\n' s += '④「実行」ボタンを押す。\n' QMessageBox.information( self, self.__class__.__name__, s) # (18) 「menuHelpWeb」メニュー項目が選ばれた場合のコード。 # 「webbrowser.open」関数を使うため、(1)で「webbrowser」モジュールをインポートしている。 # def menuHelpWebClicked(self): webbrowser.open( 'https://info.nikkeibp.co.jp/media/NSW/') # (19) 「menuHelpVersion」メニュー項目が選ばれた場合のコード。 # このプログラムのバージョン、作者名等のダイアログを出す。 # 「sys.version」、を使うために(1)で「sys」モジュールをインポートしている。 # バージョンを「0.02」とし、今回の記事の作者である「立山英利」氏、筆者の名前を追加した。 def menuHelpVersionClicked(self): s = self.__class__.__name__ s += '\n Version 0.02(2022/07/12)\n' s += ' Version 0.01(2021/08/25)\n' s += '@2021 Hideo Harada\n' s += '@2022 Hidetoshi Tateyama\n' s += '@2022 Hiroshi Kato\n' s += 'with Python ' + sys.version QMessageBox.information( self, self.__class__.__name__, s) # (20) 「確認」ボタンのイベントハンドラ。 def buttonConfirmationClicked(self): # (20)-1 コンボボックスで選択された項目を取得し、文字列を整数に変換して、 # 変数「widthOfPicture」、「heightOfPicture」に格納する。 # 「widthOfPicture」、「heightOfPicture」は、(21)の「buttonExecClicked」メソッドで参照するので、 # 「self.」をつけて、クラスのメンバー変数にしている。 # 変数「width1」を「widthOfPicture」に、「width2」を「heightOfPicture」に変更。 self.widthOfPicture = int(str(self.cb1.currentText())) self.heightOfPicture = int(str(self.cb2.currentText())) # (20)-2 変数「Confirmation1」に、コンボボックス「cb1」で選んだ値を、 # 「Confirmation2」にコンボボックス「cb2」で選んだ値を格納する。 # self.Confirmation1 = self.widthOfPicture self.Confirmation2 = self.heightOfPicture # (20)-3 「確認」用の文字列を作って、「Confirmation」に格納する。 self.Confirmation = 'フォルダ名 = {}\n'.format(self.dirName) + \ '画像の幅 = {}\n'.format(self.Confirmation1) + \ '画像の高さ = {}\n'.format(self.Confirmation2) print('self.Confirmation = ', self.Confirmation) # (20)-4 結果を「text」に表示する。 self.text.setText(self.Confirmation) # (20)-5 「実行」ボタンを有効(True)にする。 self.buttonExec.setEnabled(True) # (21) リサイズ「実行」ボタンが押された時の処理。 def buttonExecClicked(self): # (21)-1 「os」モジュールの「listdir」関数で「dirName」フォルダ内のファイル名を入手し、 # 「fnames」に格納する。 fnames = os.listdir(self.dirName) # (21)-2 dirName」フォルダ内の画像ファイル「fname」を、「img」モジュールの「thumbnail」関数で、 # 幅(「widthOfPicture」)、高さ(「heightOfPicture」) for fname in fnames: print('fname = ', fname) fpath = os.path.join(self.dirName + '/' + fname) print('fpath = ', fpath) img = Image.open(fpath) print('self.widthOfPicture = ', self.widthOfPicture) print('self.heithtOfPicture = ', self.heightOfPicture) img.thumbnail((self.widthOfPicture, self.heightOfPicture)) img.save(fpath) #(21)-3 「dirName」フォルダ内のファイルを表示する。 fileName = QFileDialog.getOpenFileName(self, 'Open file', self.dirName) # (22)フォルダの選択 # 「QFileDialog」の「getExistingDirectory」を使って、リサイズの対象となる画像ファイルのあるフォルダ # を選択するダイアログウインドウを開き、選択したフォルダ名を「self.dirName」に格納する。 # 参考にしたURL:https://qiita.com/Nobu12/items/acd3caa625be8eebc09c def selectDialog(self): # (22)-1 第二引数はダイアログのタイトル、第三引数は表示するパス名。 # ここでは、引数を省略し、デフォルトの設定を使用する。 self.dirName = QFileDialog.getExistingDirectory() print('self.dirName = ', self.dirName)# (23)プログラムを起動したときに最初に実行される。app = QApplication([])# (24)「ResizePicturePyQt」クラスを生成すると、「def __init__(self):」が実行される。w = ResizePicturePyQt()# (25)これを実行することで、GUIの画面がユーザーに表示される。app.exec()
2022.08.30
コメント(0)
# 「独学でイッキに学べるPython入門」 その12 おまけ4 ディレクトリ表示を追加 2022/08/21##『日経ソフトウエア』2022年05月号(p.006~p.032)## 目次## Part1 開発準備編(p.006~p.009)・・・省略# Part2 データ構造編(p.009~p.015)・・・省略# Part3 処理の仕組み編(p.015~p.009)・・・省略# Part4 開発実践編(p.026~p.009)# ■画像一括リサイズアプリを作ろう(p.026)# ①1つの画像のみリサイズ(p.026~p.029)# [STEP1]1枚の画像のみを無条件にリサイズ(p.027~p.029)→「その3」# [STEP2]1枚の画像のみ、ファイル名に文字列「cat」を含むならリサイズ(p.029~p.031)# [STEP3]すべての画像で、ファイル名に文字列「cat」を含むならリサイズ(p.031~p.032) #〇おまけ:記事の機能は出来上がったのですが、次の項目に挑戦してみたいと思います。# ① GUI化してとりあえず動くようにする。# ② リサイズしたいファイルが入っているフォルダを選択できるようにする。# ③ リサイズしたいファイルを選択できるようにする。# ④ 各種のエラー処理を付け加える。# ⑤ 完成したら、EXE化する。# ① GUI化してとりあえず動くようにする。# ①ー2 「出題」ボタンを「確認」ボタンに変更し、コンボボックスで選択した「画像の幅」、「高さ」# を表示する。# ①ー3 元の仕様では、「cat」をフィル名に含むファイルのみをリサイズすることになっているが、# フォルダ内のファイルすべてをリサイズするように仕様を変更する。# ② リサイズしたいファイルが入っているフォルダを選択できるようにする。# Qtの「QFileDialog」の「getExistingDirectory」を使うことで実現できた。# ただ、このままでは、UI(ユーザーインターフェイス)があまり良くないので、# 次回は、UIの改良に取り組みたいと思います。# リスト11●「os.listdir」関数で、指定したフォルダー内のすべてのファイル名を取得し、# そのフォルダー内のすべてのファイルをリサイズするプログラムをGUI化する。## GUI化に当たっては、次の記事を参考にした。#『日経ソフトウエア』2021年11月号(p.52~p.63)# 「特集1 PythonでGUIアプリ開発」の基礎 PyQt/PySide編」## ステップ09 「掛け筆算練習プログラム」# リスト10●掛け筆算練習プログラム(KakeHissanPyQt.py)# GUI化のためのモジュールのインポートimport random, sys, webbrowserfrom PyQt6.QtCore import *from PyQt6.QtGui import *from PyQt6.QtWidgets import *# 本体用のモジュールのインポートimport osfrom PIL import Image# 本体用のクラスの設定# 「QMainWindow」クラスを継承した「ResizePicturePyQt」クラスを記述。# 「MainWindow」の名前を「KakeHissanPyQt」から「ResizePicturePyQt」に変更。class ResizePicturePyQt(QMainWindow): # 「ResizePicturePyQt」クラスのコンストラクタ(インスタンス生成時に # 呼び出されるメソッド)である「__init__」を記述。 def __init__(self): # 「ResizePicturePyQt」クラスの親クラスである「QMainWindow」クラスのコンストラクタを実行するコード。 # この記述がないと必要な初期処理が実行されない。 super().__init__() # ディレクトリ表示のために挿入。必要がなくなれば、削除すること。 self.textEdit = QTextEdit() # # タイトルバー文字列の設定。 # 「ResizePicturePyQt」クラスのインスタンスは、(12)で変数「w」に代入され、「w」という名前で # 参照できるが、その名前はクラスの外部のみからしか利用できない。クラス内部から自分 # 自身のインスタンスを呼び出すには、コンストラクタで指定した「self」という名前を使う。 # 「setWindowTitle」メソッドに与えた「self.__class__.__name__」は、このクラスの名前で、 # 中身は「ResizePicturePyQt」。 self.setWindowTitle(self.__class__.__name__) # (2) 同様に「self」を使って、ラベルウィジェットの位置と大きさを設定する。 # setGeometry() メソッドは、4つの整数を入力引数として受け取る。 # X 座標 # Y 座標 # フレームの幅 # フレームの高さ xOfFrame = 100 yOfFrame = 100 widthOfFrame =100 heightOfFrame =400 self.setGeometry(xOfFrame, yOfFrame, widthOfFrame, heightOfFrame) # リスト9(2) 「QMainWindow」クラスを継承した「pyqt07」クラスの「menuBar」メソッドを呼び出して、 # メニューバーのインスタンスを作り、それを「menu」という名前で参照できるようにする。 menu = self.menuBar() # リスト9(3) 「ファイル」メニューを追加し、それを「menuFile」という名前で参照できるようにする。 # 「&(アンパサンド)」の次の文字は「アクセスキー」になる。「Altキー」を押しながら # 「F」キーを押すと、「ファイル」メニューを開けるようになる。 menuFile = menu.addMenu('ファイル(&F)') ## ディレクトリ表示のため、メニューバーの「ファイル」に「開く」メニューを追加する。 # リスト?? メニュー項目に相当する「アクション」を作り、「menuFileOpen」という名前で参照できるようにする。 # 「QAction」クラスのコンストラクタに渡す最初の引数はアイコンの指定で、ここではQtが持っている # 「SP_DialogOpenButton」を指定している。 # 続く引数は、メニュー項目の文字列( '開く(&O)')と親オブジェクト(menuFile)。 menuFileOpen = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_DialogOpenButton)), '開く(&O)', menuFile) # リスト?? 「開く」メニューが選ばれた場合の処理として、「self.showDialog」を指定。 # 「self.showDialog」は、フォルダを指定して、ファイルを表示する関数。 menuFileOpen.triggered.connect(self.showDialog) # リスト9(6) 「menuFile」に「menuFileOpen」アクションを追加する。 menuFile.addAction(menuFileOpen) # リスト9(4) メニュー項目に相当する「アクション」を作り、「menuFileExit」という名前で参照できるようにする。 # 「QAction」クラスのコンストラクタに渡す最初の引数はアイコンの指定で、ここではQtが持っている # 「SP_TitleBarCloseButton」を指定している。 # 続く引数は、メニュー項目の文字列( '終了(&X)')と親オブジェクト(menuFile)。 menuFileExit = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_TitleBarCloseButton)), '終了(&X)', menuFile) # リスト9(5) 「終了」メニューが選ばれた場合の処理として、「quit」を指定。 # 「quit」は、「QApplication」静的メソッドで、呼び出すとプログラムが終了する。 menuFileExit.triggered.connect(quit) # リスト9(6) 「menuFile」に「menuFileExit」アクションを追加する。 menuFile.addAction(menuFileExit) # リスト9(7) 「ヘルプ」メニューを生成して、「menuHelp」という名前で参照できるようにする。 menuHelp = menu.addMenu('ヘルプ(&H)') # リスト9(8) 「menuHelpWeb」メニューを生成して、「menuHelpWeb」という名前で参照できるようにする。 # このメニュー項目が選ばれた場合、(11)の「menuHelpWebClicked」メソッドを呼び出す。 menuHelpWeb = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_DialogHelpButton)), 'Webサイトを開く(&W)', menuHelp) menuHelpWeb.triggered.connect( self.menuHelpWebClicked) menuHelp.addAction(menuHelpWeb) # リスト9(9) メニューの区切り線(セパレータ)を追加するコード。 menuHelp.addSeparator() # リスト9(10) バージョン情報を追加するコード。 # そのイベントハンドラは、(12)。 menuHelpVersion = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_MessageBoxInformation)), 'バージョン情報(&V)', menuHelp) menuHelpVersion.triggered.connect( self.menuHelpVersionClicked) menuHelp.addAction(menuHelpVersion) # (3) 「QWidget」クラスのインスタンス「center」を作って、グリッドレイアウトの設定を # 行い、セントラルウィジェットに配置する。 # グリッドの1行目に、「label1」、「cb1」、「label2」、「cb2」、「buttonQuestion」 # (「確認」ボタン)、「buttonExec」(「実行」ボタン)を並べる。 # 「出題」ボタンを「確認」ボタンに変更。 center = QWidget(self) center.layout = QGridLayout(center) center.setLayout(center.layout) self.setCentralWidget(center) # (4) ラベル「label1」を生成。 # '1行目桁数'を'画像の幅'に変更。 label1 = QLabel('画像の幅', center) # (5) 水平方向は左寄せ、垂直方向は中央ぞろえに。 label1.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter) # (6) 「label1」をグリッドの1行、1列に配置。 center.layout.addWidget(label1, 0, 0) # (7) コンボボックス「cb1」を生成。 self.cb1 = QComboBox(center) # (8) 選択肢を指定。 self.cb1.addItems(['150', '300', '1500', '3000']) # (9) 「cb1」をグリッドの1行、2列に配置。 center.layout.addWidget(self.cb1, 0, 1) # (10) ラベル「label2」を生成。 # '2行目桁数'を'画像の高さ'に変更。 label2 = QLabel('画像の高さ', center) label2.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) center.layout.addWidget(label2, 0, 2) # (11) コンボボックス「cb2」を生成。 self.cb2 = QComboBox(center) self.cb2.addItems(['150', '300', '1500', '3000']) center.layout.addWidget(self.cb2, 0, 3) # (12) 「確認」ボタンを生成。 # 「出題」ボタンを「確認」ボタンに変更。 buttonQuestion = QPushButton('確認', center) # (13) イベントハンドラとして、(21)の「buttonQuestionClicked」を指定する。 buttonQuestion.clicked.connect(self.buttonQuestionClicked) # (14) 「確認」ボタンをグリッドの1行、5列に配置。 # 「出題」ボタンを「確認」ボタンに変更。 center.layout.addWidget(buttonQuestion, 0, 4) # (15) 「実行」ボタンを生成。 # 「答え」ボタンを「実行」ボタンに変更。 # 「self.buttonAnswer」を「self.buttonExec」に変更。 self.buttonExec = QPushButton('実行', center) self.buttonExec.clicked.connect(self.buttonExecClicked) # (16) 起動時に「実行」ボタンが無効になるように設定。 # 問題が生成されていない状態で「実行」ボタンを押しても反応しないようにしている。 self.buttonExec.setEnabled(False) center.layout.addWidget(self.buttonExec, 0, 5) # (17) テキストボックス「text」を生成。 self.text = QTextEdit(center) #(18) 「text」のフォントの種類「明朝体」と大きさ「16」を設定。 self.text.setFont(QFont('MS 明朝', 16)) # (19) 書き込み禁止にするため、「ReadOnly」に設定。 self.text.setReadOnly(True) # (20) 「text」をウインドウの2行目(2番目の引数「1」)、1列目(3番目の引数「0」)に配置 # 引数の4番目は表示に何行分使うか、5番目は表示に何列分使うかの指定。 center.layout.addWidget(self.text, 1, 0, 1, 6) # 「show」メソッドを呼び出して、表示する。 self.show() # リスト9(11) 「menuHelpWeb」メニュー項目が選ばれた場合のコード。 # 「webbrowser.open」関数を使うため、(1)で「webbrowser」モジュールをインポートしている。 def menuHelpWebClicked(self): webbrowser.open( 'https://info.nikkeibp.co.jp/media/NSW/') # リスト9(12) 実行をするとこのプログラムのバージョン、作者名等のダイアログを出す。 # 「sys.version」、を使うために(1)で「sys」モジュールをインポートしている。 # バージョンを「0.02」とし、今回の記事の作者である「立山英利」氏、筆者の名前を追加した。 def menuHelpVersionClicked(self): s = self.__class__.__name__ s += '\n Version 0.02(2022/07/12)\n' s += ' Version 0.01(2021/08/25)\n' s += '@2021 Hideo Harada\n' s += '@2022 Hidetoshi Tateyama\n' s += '@2022 Hiroshi Kato\n' s += 'with Python ' + sys.version QMessageBox.information( self, self.__class__.__name__, s) # (21) 「出題」ボタンのイベントハンドラ。 # 「出題」ボタンを「確認」ボタンに変更。 def buttonQuestionClicked(self): # (22) コンボボックスで選択された項目を取得し、文字列を整数に変換して、 # 変数「widthOfPicture」、「heightOfPicture」に格納する。 # 「widthOfPicture」、「heightOfPicture」は、(27)の「buttonExecClicked」メソッドで参照するので、 # 「self.」をつけて、クラスのメンバー変数にしている。 # 変数「width1」を「widthOfPicture」に、「width2」を「heightOfPicture」に変更。 self.widthOfPicture = int(str(self.cb1.currentText())) self.heightOfPicture = int(str(self.cb2.currentText())) # (23) 変数「question1」に、コンボボックス「cb1」で選んだ値を、 # 「question2」にコンボボックス「cb2」で選んだ値を格納する。 # self.question1 = self.widthOfPicture self.question2 = self.heightOfPicture # (24) 「確認」用の文字列を作って、「question」に格納する。 # 「{:>12}」は、12文字分のスペースに右詰めで文字を並べる書式指定文字列。 self.question = '画像の幅 = {}\n'.format(self.question1) + \ '画像の高さ = {}\n'.format(self.question2) print('self.question = ', self.question) # (25) 問題を「text」に表示する。 self.text.setText(self.question) # (26) 「実行」ボタンを有効(True)にする。 self.buttonExec.setEnabled(True) # (27) 「リサイズ実行」ボタンが押された時の処理。 # 「実行」ボタンを「リサイズ実行」ボタンに変更。 # 「buttonExecClicked」を「buttonExecClicked」ボタンに変更。 def buttonExecClicked(self): #photoDir = 'photo'を'self.dirName'に変更。 # (1) fnames = os.listdir(self.dirName) # (2) for fname in fnames: print('fname = ', fname) #if strOfSearch in fname: fpath = os.path.join(self.dirName + '/' + fname) print('fpath = ', fpath) img = Image.open(fpath) print('self.widthOfPicture = ', self.widthOfPicture) print('self.heithtOfPicture = ', self.heightOfPicture) img.thumbnail((self.widthOfPicture, self.heightOfPicture)) img.save(fpath) # 「QFileDialog」の「getExistingDirectory」を使って、リサイズの対象となる画像のあるフォルダ # を選択するダイアログウインドウを開き、選択したフォルダ名を「self.dirName」に格納する。 # 参考にしたURL:https://qiita.com/Nobu12/items/acd3caa625be8eebc09c def showDialog(self): # 第二引数はダイアログのタイトル、第三引数は表示するパス名。ここでは、引数を省略し、 # デフォルトの設定を使用する。 self.dirName = QFileDialog.getExistingDirectory() print('self.dirName = ', self.dirName)# プログラムを起動したときに最初に実行される。app = QApplication([])# 変数の初期化#self.widthOfPicture = 150#self.heightOfPicture = 150# 「ResizePicturePyQt」クラスを生成すると、「def __init__(self):」が実行される。w = ResizePicturePyQt()# これを実行することで、GUIの画面がユーザーに表示される。app.exec()
2022.08.21
コメント(0)
# 「独学でイッキに学べるPython入門」 その11 おまけ3##『日経ソフトウエア』2022年05月号(p.006~p.032)## 目次## Part1 開発準備編(p.006~p.009)・・・省略# Part2 データ構造編(p.009~p.015)・・・省略# Part3 処理の仕組み編(p.015~p.009)・・・省略# Part4 開発実践編(p.026~p.009)# ■画像一括リサイズアプリを作ろう(p.026)# ①1つの画像のみリサイズ(p.026~p.029)# [STEP1]1枚の画像のみを無条件にリサイズ(p.027~p.029)→「その3」# [STEP2]1枚の画像のみ、ファイル名に文字列「cat」を含むならリサイズ(p.029~p.031)# [STEP3]すべての画像で、ファイル名に文字列「cat」を含むならリサイズ(p.031~p.032) #〇おまけ:記事の機能は出来上がったのですが、次の項目に挑戦してみたいと思います。# ① GUI化してとりあえず動くようにする。# ② リサイズしたいファイルが入っているフォルダを選択できるようにする。# ③ リサイズしたいファイルを選択できるようにする。# ④ 各種のエラー処理を付け加える。# ⑤ 完成したら、EXE化する。# ① GUI化してとりあえず動くようにする。# ①ー2 「出題」ボタンを「確認」ボタンに変更し、コンボボックスで選択した「画像の幅」、「高さ」# を表示する。# リスト9●「os.listdir」関数で、指定したフォルダー内のすべてのファイル名を取得し、# そのフォルダー内の指定されたファイルをリサイズするプログラムをGUI化する。## GUI化に当たっては、次の記事を参考にした。#『日経ソフトウエア』2021年11月号(p.63~p.65)# 「特集1 PythonでGUIアプリ開発」の基礎 PyQt/PySide編」## ステップ09 「掛け筆算練習プログラム」# リスト10●掛け筆算練習プログラム(KakeHissanPyQt.py)# GUI化のためのモジュールのインポートimport random, sys, webbrowserfrom PyQt6.QtCore import *from PyQt6.QtGui import *from PyQt6.QtWidgets import *# 本体用のモジュールのインポートimport osfrom PIL import Image# 本体用のクラスの設定# 「QMainWindow」クラスを継承した「ResizePicturePyQt」クラスを記述。# 「MainWindow」の名前を「KakeHissanPyQt」から「ResizePicturePyQt」に変更。class ResizePicturePyQt(QMainWindow): # 「ResizePicturePyQt」クラスのコンストラクタ(インスタンス生成時に # 呼び出されるメソッド)である「__init__」を記述。 def __init__(self): # 「ResizePicturePyQt」クラスの親クラスである「QMainWindow」クラスのコンストラクタを実行するコード。 # この記述がないと必要な初期処理が実行されない。 super().__init__() # タイトルバー文字列の設定。 # 「ResizePicturePyQt」クラスのインスタンスは、(12)で変数「w」に代入され、「w」という名前で # 参照できるが、その名前はクラスの外部のみからしか利用できない。クラス内部から自分 # 自身のインスタンスを呼び出すには、コンストラクタで指定した「self」という名前を使う。 # 「setWindowTitle」メソッドに与えた「self.__class__.__name__」は、このクラスの名前で、 # 中身は「ResizePicturePyQt」。 self.setWindowTitle(self.__class__.__name__) # (2) 同様に「self」を使って、ラベルウィジェットの位置と大きさを設定する。 # setGeometry() メソッドは、4つの整数を入力引数として受け取る。 # X 座標 # Y 座標 # フレームの幅 # フレームの高さ xOfFrame = 100 yOfFrame = 100 widthOfFrame =100 heightOfFrame =400 self.setGeometry(xOfFrame, yOfFrame, widthOfFrame, heightOfFrame) # リスト9(2) 「QMainWindow」クラスを継承した「pyqt07」クラスの「menuBar」メソッドを呼び出して、 # メニューバーのインスタンスを作り、それを「menu」という名前で参照できるようにする。 menu = self.menuBar() # リスト9(3) 「ファイル」メニューを追加し、それを「menuFile」という名前で参照できるようにする。 # 「&(アンパサンド)」の次の文字は「アクセスキー」になる。「Altキー」を押しながら # 「F」キーを押すと、「ファイル」メニューを開けるようになる。 menuFile = menu.addMenu('ファイル(&F)') # リスト9(4) メニュー項目に相当する「アクション」を作り、「menuFileExit」という名前で参照できるようにする。 # 「QAction」クラスのコンストラクタに渡す最初の引数はアイコンの指定で、ここではQtが持っている # 「SP_TitleBarCloseButton」を指定している。 # 続く引数は、メニュー項目の文字列( '終了(&X)')と親オブジェクト。 menuFileExit = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_TitleBarCloseButton)), '終了(&X)', menuFile) # リスト9(5) 「終了」メニューが選ばれた場合の処理として、「quit」を指定。 # 「quit」は、「QApplication」静的メソッドで、呼び出すとプログラムが終了する。 menuFileExit.triggered.connect(quit) # リスト9(6) 「menuFile」に「menuFileExit」アクションを追加する。 menuFile.addAction(menuFileExit) # リスト9(7) 「ヘルプ」メニューを生成して、「menuHelp」という名前で参照できるようにする。 menuHelp = menu.addMenu('ヘルプ(&H)') # リスト9(8) 「menuHelpWeb」メニューを生成して、「menuHelpWeb」という名前で参照できるようにする。 # このメニュー項目が選ばれた場合、(11)の「menuHelpWebClicked」メソッドを呼び出す。 menuHelpWeb = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_DialogHelpButton)), 'Webサイトを開く(&W)', menuHelp) menuHelpWeb.triggered.connect( self.menuHelpWebClicked) menuHelp.addAction(menuHelpWeb) # リスト9(9) メニューの区切り線(セパレータ)を追加するコード。 menuHelp.addSeparator() # リスト9(10) バージョン情報を追加するコード。 # そのイベントハンドラは、(12)。 menuHelpVersion = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_MessageBoxInformation)), 'バージョン情報(&V)', menuHelp) menuHelpVersion.triggered.connect( self.menuHelpVersionClicked) menuHelp.addAction(menuHelpVersion) # (3) 「QWidget」クラスのインスタンス「center」を作って、グリッドレイアウトの設定を # 行い、セントラルウィジェットに配置する。 # グリッドの1行目に、「label1」、「cb1」、「label2」、「cb2」、「buttonQuestion」 # (「確認」ボタン)、「buttonExec」(「実行」ボタン)を並べる。 # 「出題」ボタンを「確認」ボタンに変更。 center = QWidget(self) center.layout = QGridLayout(center) center.setLayout(center.layout) self.setCentralWidget(center) # (4) ラベル「label1」を生成。 # '1行目桁数'を'画像の幅'に変更。 label1 = QLabel('画像の幅', center) # (5) 水平方向は左寄せ、垂直方向は中央ぞろえに。 label1.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter) # (6) 「label1」をグリッドの1行、1列に配置。 center.layout.addWidget(label1, 0, 0) # (7) コンボボックス「cb1」を生成。 self.cb1 = QComboBox(center) # (8) 選択肢を指定。 self.cb1.addItems(['150', '300', '1500', '3000']) # (9) 「cb1」をグリッドの1行、2列に配置。 center.layout.addWidget(self.cb1, 0, 1) # (10) ラベル「label2」を生成。 # '2行目桁数'を'画像の高さ'に変更。 label2 = QLabel('画像の高さ', center) label2.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) center.layout.addWidget(label2, 0, 2) # (11) コンボボックス「cb2」を生成。 self.cb2 = QComboBox(center) self.cb2.addItems(['150', '300', '1500', '3000']) center.layout.addWidget(self.cb2, 0, 3) # (12) 「確認」ボタンを生成。 # 「出題」ボタンを「確認」ボタンに変更。 buttonQuestion = QPushButton('確認', center) # (13) イベントハンドラとして、(21)の「buttonQuestionClicked」を指定する。 buttonQuestion.clicked.connect(self.buttonQuestionClicked) # (14) 「確認」ボタンをグリッドの1行、5列に配置。 # 「出題」ボタンを「確認」ボタンに変更。 center.layout.addWidget(buttonQuestion, 0, 4) # (15) 「実行」ボタンを生成。 # 「答え」ボタンを「実行」ボタンに変更。 # 「self.buttonAnswer」を「self.buttonExec」に変更。 self.buttonExec = QPushButton('実行', center) self.buttonExec.clicked.connect(self.buttonExecClicked) # (16) 起動時に「実行」ボタンが無効になるように設定。 # 問題が生成されていない状態で「実行」ボタンを押しても反応しないようにしている。 self.buttonExec.setEnabled(False) center.layout.addWidget(self.buttonExec, 0, 5) # (17) テキストボックス「text」を生成。 self.text = QTextEdit(center) #(18) 「text」のフォントの種類「明朝体」と大きさ「16」を設定。 self.text.setFont(QFont('MS 明朝', 16)) # (19) 書き込み禁止にするため、「ReadOnly」に設定。 self.text.setReadOnly(True) # (20) 「text」をウインドウの2行目(2番目の引数「1」)、1列目(3番目の引数「0」)に配置 # 引数の4番目は表示に何行分使うか、5番目は表示に何列分使うかの指定。 center.layout.addWidget(self.text, 1, 0, 1, 6) # 「show」メソッドを呼び出して、表示する。 self.show() # リスト9(11) 「menuHelpWeb」メニュー項目が選ばれた場合のコード。 # 「webbrowser.open」関数を使うため、(1)で「webbrowser」モジュールをインポートしている。 def menuHelpWebClicked(self): webbrowser.open( 'https://info.nikkeibp.co.jp/media/NSW/') # リスト9(12) 実行をするとこのプログラムのバージョン、作者名等のダイアログを出す。 # 「sys.version」、を使うために(1)で「sys」モジュールをインポートしている。 # バージョンを「0.02」とし、今回の記事の作者である「立山英利」氏、筆者の名前を追加した。 def menuHelpVersionClicked(self): s = self.__class__.__name__ s += ' Version 0.02(2022/07/12)\n' s += ' Version 0.01(2021/08/25)\n' s += '@2021 Hideo Harada\n' s += '@2022 Hidetoshi Tateyama\n' s += '@2022 Hiroshi Katon' s += 'with Python ' + sys.version QMessageBox.information( self, self.__class__.__name__, s) # (21) 「出題」ボタンのイベントハンドラ。 # 「出題」ボタンを「確認」ボタンに変更。 def buttonQuestionClicked(self): # (22) コンボボックスで選択された項目を取得し、文字列を整数に変換して、 # 変数「widthOfPicture」、「heightOfPicture」に格納する。 # 「widthOfPicture」、「heightOfPicture」は、(27)の「buttonExecClicked」メソッドで参照するので、 # 「self.」をつけて、クラスのメンバー変数にしている。 # 変数「width1」を「widthOfPicture」に、「width2」を「heightOfPicture」に変更。 self.widthOfPicture = int(str(self.cb1.currentText())) #print('widthOfPicture = ', self.widthOfPicture) self.heightOfPicture = int(str(self.cb2.currentText())) #print('heightOfPicture = ', self.heightOfPicture) # (23) 変数「question1」に、コンボボックス「cb1」で選んだ値を、 # 「question2」にコンボボックス「cb2」で選んだ値を格納する。 # self.question1 = self.widthOfPicture self.question2 = self.heightOfPicture # (24) 「確認」用の文字列を作って、「question」に格納する。 # 「{:>12}」は、12文字分のスペースに右詰めで文字を並べる書式指定文字列。 self.question = '画像の幅 = {}\n'.format(self.question1) + \ '画像の高さ = {}\n'.format(self.question2) print('self.question = ', self.question) # (25) 問題を「text」に表示する。 self.text.setText(self.question) # (26) 「実行」ボタンを有効(True)にする。 self.buttonExec.setEnabled(True) # (27) 「リサイズ実行」ボタンが押された時の処理。 # 「実行」ボタンを「リサイズ実行」ボタンに変更。 # 「buttonExecClicked」を「buttonExecClicked」ボタンに変更。 def buttonExecClicked(self): photoDir = 'photo' strOfSearch = 'cat' # (1) fnames = os.listdir('photo') # (2) for fname in fnames: if strOfSearch in fname: fpath = os.path.join(photoDir + '\\' + fname) img = Image.open(fpath) img.thumbnail((widthOfPicture, heightOfPicture)) img.save(fpath) # プログラムを起動したときに最初に実行される。app = QApplication([])# 変数の初期化widthOfPicture = 150heightOfPicture = 150# 「ResizePicturePyQt」クラスを生成すると、「def __init__(self):」が実行される。w = ResizePicturePyQt()# これを実行することで、GUIの画面がユーザーに表示される。app.exec()
2022.07.13
コメント(0)
# 「独学でイッキに学べるPython入門」 その10 おまけ2##『日経ソフトウエア』2022年05月号(p.006~p.032)## 目次## Part1 開発準備編(p.006~p.009)・・・省略# Part2 データ構造編(p.009~p.015)・・・省略# Part3 処理の仕組み編(p.015~p.009)・・・省略# Part4 開発実践編(p.026~p.009)# ■画像一括リサイズアプリを作ろう(p.026)# ①1つの画像のみリサイズ(p.026~p.029)# [STEP1]1枚の画像のみを無条件にリサイズ(p.027~p.029)→「その3」# [STEP2]1枚の画像のみ、ファイル名に文字列「cat」を含むならリサイズ(p.029~p.031)# [STEP3]すべての画像で、ファイル名に文字列「cat」を含むならリサイズ(p.031~p.032) 〇おまけ:記事の機能は出来上がったのですが、次の項目に挑戦してみたいと思います。① GUI化してとりあえず動くようにする。② リサイズしたいファイルが入っているフォルダを選択できるようにする。③ リサイズしたいファイルを選択できるようにする。④ 各種のエラー処理を付け加える。⑤ 完成したら、EXE化する。① GUI化してとりあえず動くようにする。# リスト8●「os.listdir」関数で、指定したフォルダー内のすべてのファイル名を取得し、# そのフォルダー内の指定されたファイルをリサイズするプログラムをGUI化する。## GUI化に当たっては、次の記事を参考にした。#『日経ソフトウエア』2021年11月号(p.63~p.65)# 「特集1 PythonでGUIアプリ開発」の基礎 PyQt/PySide編」## ステップ09 「掛け筆算練習プログラム」# リスト10●掛け筆算練習プログラム(KakeHissanPyQt.py)# GUI化のためのモジュールのインポートimport random, sys, webbrowserfrom PyQt6.QtCore import *from PyQt6.QtGui import *from PyQt6.QtWidgets import *# 本体用のモジュールのインポートimport osfrom PIL import Image# 本体用のクラスの設定# 「QMainWindow」クラスを継承した「ResizePicturePyQt」クラスを記述。# 「MainWindow」の名前を「KakeHissanPyQt」から「ResizePicturePyQt」に変更。class ResizePicturePyQt(QMainWindow): # 「ResizePicturePyQt」クラスのコンストラクタ(インスタンス生成時に # 呼び出されるメソッド)である「__init__」を記述。 def __init__(self): # 「ResizePicturePyQt」クラスの親クラスである「QMainWindow」クラスのコンストラクタを実行するコード。 # この記述がないと必要な初期処理が実行されない。 super().__init__() # タイトルバー文字列の設定。 # 「ResizePicturePyQt」クラスのインスタンスは、(12)で変数「w」に代入され、「w」という名前で # 参照できるが、その名前はクラスの外部のみからしか利用できない。クラス内部から自分 # 自身のインスタンスを呼び出すには、コンストラクタで指定した「self」という名前を使う。 # 「setWindowTitle」メソッドに与えた「self.__class__.__name__」は、このクラスの名前で、 # 中身は「ResizePicturePyQt」。 self.setWindowTitle(self.__class__.__name__) # (2) 同様に「self」を使って、ラベルウィジェットの位置と大きさを設定する。 # setGeometry() メソッドは、4つの整数を入力引数として受け取る。 # X 座標 # Y 座標 # フレームの幅 # フレームの高さ xOfFrame = 100 yOfFrame = 100 widthOfFrame =100 heightOfFrame =400 self.setGeometry(xOfFrame, yOfFrame, widthOfFrame, heightOfFrame) # リスト9(2) 「QMainWindow」クラスを継承した「pyqt07」クラスの「menuBar」メソッドを呼び出して、 # メニューバーのインスタンスを作り、それを「menu」という名前で参照できるようにする。 menu = self.menuBar() # リスト9(3) 「ファイル」メニューを追加し、それを「menuFile」という名前で参照できるようにする。 # 「&(アンパサンド)」の次の文字は「アクセスキー」になる。「Altキー」を押しながら # 「F」キーを押すと、「ファイル」メニューを開けるようになる。 menuFile = menu.addMenu('ファイル(&F)') # リスト9(4) メニュー項目に相当する「アクション」を作り、「menuFileExit」という名前で参照できるようにする。 # 「QAction」クラスのコンストラクタに渡す最初の引数はアイコンの指定で、ここではQtが持っている # 「SP_TitleBarCloseButton」を指定している。 # 続く引数は、メニュー項目の文字列( '終了(&X)')と親オブジェクト。 menuFileExit = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_TitleBarCloseButton)), '終了(&X)', menuFile) # リスト9(5) 「終了」メニューが選ばれた場合の処理として、「quit」を指定。 # 「quit」は、「QApplication」静的メソッドで、呼び出すとプログラムが終了する。 menuFileExit.triggered.connect(quit) # リスト9(6) 「menuFile」に「menuFileExit」アクションを追加する。 menuFile.addAction(menuFileExit) # リスト9(7) 「ヘルプ」メニューを生成して、「menuHelp」という名前で参照できるようにする。 menuHelp = menu.addMenu('ヘルプ(&H)') # リスト9(8) 「menuHelpWeb」メニューを生成して、「menuHelpWeb」という名前で参照できるようにする。 # このメニュー項目が選ばれた場合、(11)の「menuHelpWebClicked」メソッドを呼び出す。 menuHelpWeb = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_DialogHelpButton)), 'Webサイトを開く(&W)', menuHelp) menuHelpWeb.triggered.connect( self.menuHelpWebClicked) menuHelp.addAction(menuHelpWeb) # リスト9(9) メニューの区切り線(セパレータ)を追加するコード。 menuHelp.addSeparator() # リスト9(10) バージョン情報を追加するコード。 # そのイベントハンドラは、(12)。 menuHelpVersion = QAction( QIcon(self.style().standardIcon( QStyle.StandardPixmap. SP_MessageBoxInformation)), 'バージョン情報(&V)', menuHelp) menuHelpVersion.triggered.connect( self.menuHelpVersionClicked) menuHelp.addAction(menuHelpVersion) # (3) 「QWidget」クラスのインスタンス「center」を作って、グリッドレイアウトの設定を # 行い、セントラルウィジェットに配置する。 # グリッドの1行目に、「label1」、「cb1」、「label2」、「cb2」、「buttonQuestion」 # (「出題」ボタン)、「buttonExec」(「実行」ボタン)を並べる。 center = QWidget(self) center.layout = QGridLayout(center) center.setLayout(center.layout) self.setCentralWidget(center) # (4) ラベル「label1」を生成。 # '1行目桁数'を'画像の幅'に変更。 label1 = QLabel('画像の幅', center) # (5) 水平方向は左寄せ、垂直方向は中央ぞろえに。 label1.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter) # (6) 「label1」をグリッドの1行、1列に配置。 center.layout.addWidget(label1, 0, 0) # (7) コンボボックス「cb1」を生成。 self.cb1 = QComboBox(center) # (8) 選択肢を指定。 self.cb1.addItems(['150', '300', '1500', '3000']) # (9) 「cb1」をグリッドの1行、2列に配置。 center.layout.addWidget(self.cb1, 0, 1) # (10) ラベル「label2」を生成。 # '2行目桁数'を'画像の高さ'に変更。 label2 = QLabel('画像の高さ', center) label2.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) center.layout.addWidget(label2, 0, 2) # (11) コンボボックス「cb2」を生成。 self.cb2 = QComboBox(center) self.cb2.addItems(['150', '300', '1500', '3000']) center.layout.addWidget(self.cb2, 0, 3) # (12) 「出題」ボタンを生成。 buttonQuestion = QPushButton('出題', center) # (13) イベントハンドラとして、(21)の「buttonQuestionClicked」を指定する。 buttonQuestion.clicked.connect(self.buttonQuestionClicked) # (14) 「出題」ボタンをグリッドの1行、5列に配置。 center.layout.addWidget(buttonQuestion, 0, 4) # (15) 「実行」ボタンを生成。 # 「答え」ボタンを「実行」ボタンに変更。 # 「self.buttonAnswer」を「self.buttonExec」に変更。 self.buttonExec = QPushButton('実行', center) self.buttonExec.clicked.connect(self.buttonExecClicked) # (16) 起動時に「実行」ボタンが無効になるように設定。 # 問題が生成されていない状態で「実行」ボタンを押しても反応しないようにしている。 self.buttonExec.setEnabled(False) center.layout.addWidget(self.buttonExec, 0, 5) # (17) テキストボックス「text」を生成。 self.text = QTextEdit(center) #(18) 「text」のフォントの種類と大きさを設定。 self.text.setFont(QFont('MS 明朝', 32)) # (19) 書き込み禁止にするため、「ReadOnly」に設定。 self.text.setReadOnly(True) # (20) 「text」を2行、1列に配置 # 引数の4番目は何行分使うか、5番目は何列分使うかの指定。 center.layout.addWidget(self.text, 1, 0, 1, 6) # 「show」メソッドを呼び出して、表示する。 self.show() # リスト9(11) 「menuHelpWeb」メニュー項目が選ばれた場合のコード。 # 「webbrowser.open」関数を使うため、(1)で「webbrowser」モジュールをインポートしている。 def menuHelpWebClicked(self): webbrowser.open( 'https://info.nikkeibp.co.jp/media/NSW/') # リスト9(12) 実行をするとダイアログを出す。 # 「sys.version」、を使うために(1)で「sys」モジュールをインポートしている。 def menuHelpVersionClicked(self): s = self.__class__.__name__ s += ' Version 0.01(2021/08/25)\n' s += '@2021 Hideo Harada\n' s += 'with Python ' + sys.version QMessageBox.information( self, self.__class__.__name__, s) # (21) 「出題」ボタンのイベントハンドラ。 def buttonQuestionClicked(self): # (22) コンボボックスで選択された項目を取得し、文字列を整数に変換して、 # 変数「width1」、「width2」に格納する。 # 「width2」は、(27)の「buttonExecClicked」メソッドで参照するので、 # 「self.」をつけて、クラスのメンバー変数にしている。 width1 = int(str(self.cb1.currentText())) self.width2 = int(str(self.cb2.currentText())) # (23) 乱数を使って、必要な桁数の整数を生成し、変数「question1」、 # 「question2」に格納する。 # 乱数を得る「random」モジュールは、(1)でインポートしている。 self.question1 = random.randrange( 10**(width1-1), 10**width1-1) self.question2 = random.randrange( 10**(self.width2-1), 10**self.width2-1) # (24) 「出題」用の問題の文字列を作って、「question」に格納する。 # 「{:>12}」は、12文字分のスペースに右詰めで文字を並べる書式指定文字列。 self.question = '{:>12}\n'.format(self.question1) + \ ' ×{:>5}\n -------------\n'.format(self.question2) # (25) 問題を「text」に表示する。 self.text.setText(self.question) # (26) 「実行」ボタンを有効(True)にする。 self.buttonExec.setEnabled(True) # (27) 「リサイズ実行」ボタンが押された時の処理。 # 「実行」ボタンを「リサイズ実行」ボタンに変更。 # 「buttonExecClicked」を「buttonExecClicked」ボタンに変更。 # プログラムコードをファイル名に「cat」を含む場合リサイズする内容に変更。 def buttonExecClicked(self): # 変数の初期化 widthOfPicture = 150 heightOfPicture = 150 photoDir = 'photo' strOfSearch = 'cat' # (1) fnames = os.listdir('photo') # (2) for fname in fnames: if strOfSearch in fname: fpath = os.path.join(photoDir + '\\' + fname) img = Image.open(fpath) img.thumbnail((widthOfPicture, heightOfPicture)) img.save(fpath) # プログラムを起動したときに最初に実行される。app = QApplication([])# 「ResizePicturePyQt」クラスを生成すると、「def __init__(self):」が実行される。w = ResizePicturePyQt()# これを実行することで、GUIの画面がユーザーに表示される。app.exec()# 上記の実行結果は、良好。
2022.07.07
コメント(0)
# 「独学でイッキに学べるPython入門」 その9 おまけ1##『日経ソフトウエア』2022年05月号(p.006~p.032)## 目次## Part1 開発準備編(p.006~p.009)・・・省略# Part2 データ構造編(p.009~p.015)・・・省略# Part3 処理の仕組み編(p.015~p.009)・・・省略# Part4 開発実践編(p.026~p.009)# ■画像一括リサイズアプリを作ろう(p.026)# ①1つの画像のみリサイズ(p.026~p.029)# [STEP1]1枚の画像のみを無条件にリサイズ(p.027~p.029)→「その3」# [STEP2]1枚の画像のみ、ファイル名に文字列「cat」を含むならリサイズ(p.029~p.031)# [STEP3]すべての画像で、ファイル名に文字列「cat」を含むならリサイズ(p.031~p.032) 〇おまけ:記事の機能は出来上がったのですが、次の項目に挑戦してみたいと思います。① GUI化してとりあえず動くようにする。② リサイズしたいファイルが入っているフォルダを選択できるようにする。③ リサイズしたいファイルを選択できるようにする。④ 各種のエラー処理を付け加える。⑤ 完成したら、EXE化する。
2022.07.05
コメント(0)
# 「独学でイッキに学べるPython入門」 その7##『日経ソフトウエア』2022年05月号(p.006~p.032)## 目次## Part1 開発準備編(p.006~p.009)・・・省略# Part2 データ構造編(p.009~p.015)・・・省略# Part3 処理の仕組み編(p.015~p.009)・・・省略# Part4 開発実践編(p.026~p.009)# ■画像一括リサイズアプリを作ろう(p.026)# ①1つの画像のみリサイズ(p.026~p.029)# [STEP1]1枚の画像のみを無条件にリサイズ(p.027~p.029)→「その3」# [STEP2]1枚の画像のみ、ファイル名に文字列「cat」を含むならリサイズ(p.029~p.031)# [STEP3]すべての画像で、ファイル名に文字列「cat」を含むならリサイズ(p.031~p.032)# リスト6●「os.listdir」関数で、「photo」フォルダー内のすべてのファイル名を取得(p.031)import osos.listdir('photo')〇リスト6の実行結果
2022.07.03
コメント(0)
# 「独学でイッキに学べるPython入門」 その6##『日経ソフトウエア』2022年05月号(p.006~p.032)## 目次## Part1 開発準備編(p.006~p.009)・・・省略# Part2 データ構造編(p.009~p.015)・・・省略# Part3 処理の仕組み編(p.015~p.009)・・・省略# Part4 開発実践編(p.026~p.009)# ■画像一括リサイズアプリを作ろう(p.026)# ①1つの画像のみリサイズ(p.026~p.029)# [STEP1]1枚の画像のみを無条件にリサイズ(p.027~p.029)→「その3」# [STEP2]1枚の画像のみ、ファイル名に文字列「cat」を含むならリサイズ(p.029~p.031)# [STEP3]すべての画像で、ファイル名に文字列「cat」を含むならリサイズ# [STEP2]1枚の画像のみ、ファイル名に文字列「cat」を含むならリサイズ(p.029~p.031)# リスト5●「段階4」に「if」文を追加して、ファイル名に文字列「cat」を含むならリサイズするように変更(p.031)import osfrom PIL import Image# (1)fname = 'mycat.jpg'# (2)if 'cat' in fname: fpath = os.path.join('photo\\' + fname) img = Image.open(fpath) img.thumbnail((150, 150)) img.save(fpath)〇リスト5の実行結果
2022.07.03
コメント(0)
# 「独学でイッキに学べるPython入門」 その5##『日経ソフトウエア』2022年05月号(p.006~p.032)## 目次## Part1 開発準備編(p.006~p.009)・・・省略# Part2 データ構造編(p.009~p.015)・・・省略# Part3 処理の仕組み編(p.015~p.009)・・・省略# Part4 開発実践編(p.026~p.009)# ■画像一括リサイズアプリを作ろう(p.026)# ①1つの画像のみリサイズ(p.026~p.029)# [STEP1]1枚の画像のみを無条件にリサイズ(p.027~p.029)→「その3」# [STEP2]1枚の画像のみ、ファイル名に文字列「cat」を含むならリサイズ(p.029~p.031)# [STEP3]すべての画像で、ファイル名に文字列「cat」を含むならリサイズ# リスト3●変数「img」の「size属性」を出力img.size# リスト4●「in」演算子の練習'th' in 'Python'〇リスト3、リスト4の実行結果
2022.07.01
コメント(0)
全130件 (130件中 1-50件目)