Python
基本事項
- インデントの数でブロックを示す
キーワード
- _
- and
- as
- assert
- async
- await
- break
- case
- class
- continue
- def
- del
- elif
- else
- except
- False
- finally
- for
- from
- global
- if
- import
- in
- is
- lambda
- match
- None
- nonlocal
- not
- or
- pass
- raise
- return
- True
- try
- while
- with
- yield
構文
Hello World!
print('Hello, world!')
文・式
改行が文の区切りとなり、セミコロンなどの句読点は必須ではない。 しかし、あえて区切るときにセミコロンを使うことができる。
a = 5; b = 3; c = a + b
print(c)
文を数行に分けて記述する場合、行末にバックスラッシュ(\)が必要。
total = 123 \
+ 456 \
+ 789
任意のカッコ内のカンマ(,)後には必要ない。
months = [ 'Jan', 'Feb', 'Mar', 'Apr',
'May', 'Jun', 'Jul', 'Aug',
'Sep', 'Oct', 'Nov', 'Dec' ]
コメントアウト
print("Hello") # Helloと表示します
改行エスケープには注意。
total = 123 \ # ここにコメントは記述できない
+ 456 # ここには記述できる
months = [ 'Jan', 'Feb', 'Mar', 'Apr', # ここにはコメントを記述できる
'May', 'Jun', 'Jul', 'Aug', # ここにはコメントを記述できる
'Sep', 'Oct', 'Nov', 'Dec' ]
print文
print("ABC")
print("AAA", "BBB") #=> AAA BBB
print("AAA", end="") # 改行しない
print("BBB") # 改行する
ファイルに出力する場合:
f = open("test.txt", "w")
print("Hello world!", file=f)
f.close()
数値・文字列・型
整数(int)
num = 1234 # 正の整数 (10進数)
num = 0b11000100 # 2進数 (0b/0Bで始まる数値は 2進数とみなされる)
num = 0o777 # 8進数 (0o/0Oで始まる数値は 8進数とみなされる)
num = 0xffff # 16進数 (0x/0Xで始まる数値は16進数とみなされる)
浮動小数点数(float)
末尾にeまたはEを付けて指数表記することもできる。
num = 1.234 # 浮動小数点数
num = 1.2e3 # 浮動小数点数(指数表記) 1.2 × 10^3
num = 1.2E-3 # 浮動小数点数(指数表記) 1.2 × 10^(-3)
虚数(complex)
末尾にjまたはJをつけて虚数型になる。
num = 3.14j
真偽値(bool)
頭文字が大文字であることに注意。
bool = True
bool = False
Falseと見なされる値:
- 0
- 0.0
- ''
- []
- ()
- {}
これ以外はTrueになる。
値無し(None)
x = None
文字列(str)
str = "Hello world"
str = 'Hello world'
生文字列
rまたはRを各クォーテーションの前につけると、文字列内のエスケープシーケンスを無視する。
str = 'aaa\nbbb' # \n は改行とみなされる
str = r'aaa\nbbb' # \n はバックスラッシュ文字(\)と小文字nとみなされる
フォーマット文字列
fまたはFを各クォーテーションの前につけると、文字列中の{}に式を埋め込むことができる。
name = "Yamada"
age = 26
print(f"My name is {name}. I'm {age} years old.")
a = 5
b = 3
print(f"{a + b}") #=> 8
{}を二重にしてエスケープ:
print(f"{{n}}") # {n}
カンマ(,)で数値の桁区切りをする。
n = 12345
print(f"{n:,}") # 12,345
進数表記に変換できる。
n = 123
print(f"{n}") # 123 ... 10進数
print(f"{n:b}") # 1111011 ... 2進数
print(f"{n:o}") # 173 ... 8進数
print(f"{n:x}") # 7b ... 16進数(小文字)
print(f"{n:X}") # 7B ... 16進数(大文字)
print(f"{n:#}") # 123
print(f"{n:#b}") # 0b1111011
print(f"{n:#o}") # 0o173
print(f"{n:#x}") # 0x7b
print(f"{n:#X}") # 0X7B
print(f"{n:08}") # 00000123
print(f"{n:08b}") # 01111011
print(f"{n:08o}") # 00000173
print(f"{n:08x}") # 0000007b
print(f"{n:08X}") # 0000007B
小数の表示のフォーマット
n = 12.3456
print(f"{n:.2f}") # 12.35
print(f"{n:8.2f}") # 12.35
print(f"{n:.2e}") # 1.23e+01
print(f"{n:.2E}") # 1.23E+01
print(f"{n:.2g}") # 1.23
print(f"{n:.2%}") # 1234.56%
複数行文字列
str = """A simple example module
This module is ...
"""
改行エスケープでもいい。
str = "Hello \
world!"
文字列の連結
print("Hello " "world!")
文字列のフォーマット
errmsg = "Can't open file"
errcode = 19042
msg = "ERROR: %s (%d)" % (errmsg, errcode)
print(msg) #=> ERROR: Can't open file (19042)
print("%s" % "ABC") #=> ABC
print("%d" % 123) #=> 123
print("%f" % 1.23) #=> 1.230000
print("%x" % 255) #=> ff
print("%o" % 255) #=> 377
print("%%%d" % 80) #=> %80
その他の処理
詳細
間に挟んで連結
li = ['a', 'b', 'c']
print(','.join(li)) # 'a,b,c'
置換
s = 'abcde, abcde'
print(s.replace('bcd', 'XXX')) # 'aXXXe, aXXXe'
print(s.replace('e', 'X', 1)) # 'abcdX, abcde'
検索
s = 'abcabcabc'
print('初めて現れるbは' + str(s.find('b') + 1) + '文字目') # '初めて現れるbは2文字目'
print('3文字目以降に初めて現れるbは' + str(s.find('b', 2) + 1) + '文字目') # '3文字目以降に初めて現れるbは4文字目'
出現回数
s = 'aaabbc'
print(s.count('b')) # 2
スペースで分割
a = 'Nice to meet you'
print(a.split()) # ['Nice', 'to', 'meet', 'you']
繰り返し
s = 'abc'
print(s*2) # 'abcabc'
変数・定数
変数
変数名は英数字とアンダーバー(_)で構成する。頭文字に数字は使えない。 正規表現では[a-zA-Z_][a-zA-Z0-9_]*。
value1 = 123
_value1 = 123
test_value = 123
TEST_VALUE = 123
リスト・タプル・辞書
リスト(list)
a = [10, 20, 30, 40]
[]を使って要素を参照する。
a = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
a1 = a[0] # 0番目: 'A'
a2 = a[2] # 2番目: 'C'
a1 = a[-1] # 最後の文字 'G'
a2 = a[-3:-1] # 最後から3番目の文字から最後から1番目の前の文字: ['E', 'F']
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a1 = a[2:4] # 2番目から3番目: [2, 3]
a2 = a[2:] # 2番目から最後: [2, 3, 4, 5, 6, 7, 8, 9]
a3 = a[:4] # 最初から3番目: [0, 1, 2, 3]
a1 = a[1:8:2] # 1番目から7番目まで2個とばし: [1, 3, 5, 7]
+でリストを結合できる。
print([1, 2, 3] + [4, 5, 6]) #=> [1, 2, 3, 4, 5, 6]
リストの長さ
print(len([1, 2, 3])) #=> 3
タプル(tuple)
リストと違って中身を変更できない。
a = (10, 20, 30, 40)
要素が1つのときは注意が必要。
a = (10) # タプルではなく数値の10となる
a = (10,) # タプルの(10,)となる
タプルを戻り値にする場合
def get_date():
return 2022, 10, 9
year, month, day = get_date()
print("%04d/%02d/%02d" % (year, month, day)) # 2022/10/09
辞書(dict)
d = {'Yamada': 30, 'Suzuki': 40, 'Tanaka': 80}
[]を使って要素にアクセスする。
d1 = d['Yamada']
d2 = d['Suzuki']
d3 = d['Tanaka']
リスト関数
map()はリストの各要素に処理をしたものを返す。
a = [1, 2, 3]
def double(x): return x * 2
print(list(map(double, a))) #=> [2, 4, 6] : 関数方式
print(list(map(lambda x: x * 2, a))) #=> [2, 4, 6] : lambda方式
print([x * 2 for x in a]) #=> [2, 4, 6] : 内包表記(後述)
filter()は元のリストから条件を満たす要素だけを残したリストを返す。
a = [1, 2, 3]
def isodd(x): return x % 2
print(list(filter(isodd, a))) #=> [1, 3] : 関数方式
print(list(filter(lambda x: x % 2, a))) #=> [1, 3] : lambda方式
print([x for x in a if x % 2]) #=> [1, 3] : 内包表記(後述)
reduce()は総和を計算するときなどに使う。
from functools import reduce
a = [1, 2, 3, 4, 5]
def add(x, y): return x + y
print(reduce(add, a)) #=> 15 : 関数方式
print(reduce(lambda x, y: x + y, a)) #=> 15 : lambda方式
リストの内包表記
a = [1, 2, 3]
print([2*x for x in a]) #=> [2, 4, 6]
print([2*x for x in a if x == 3]) #=> [6]
print([[x, 2*x] for x in a]) #=> [[1, 2], [2, 4], [3, 6]]
print([(x, 2*x) for x in a]) #=> [(1, 2), (2, 4), (3, 6)]
b = [4, 5, 6]
print([x * y for x in a for y in b]) #=> [4, 5, 6, 8, 10, 12, 12, 15, 18]
print([a[i] * b[i] for i in range(len(a))]) #=> [4, 10, 18]
セット(set)
重複のないリスト。いくつかの論理演算ができる。
a = set(['red', 'blue', 'green'])
b = set(['green', 'yellow', 'white'])
print(a) #=> set(['red', 'blue', 'green'])
print(b) #=> set(['green', 'yellow', 'white'])
print(a - b) #=> set(['red', 'blue'])
print(a | b) #=> set(['red', 'blue', 'green', 'yellow', 'white'])
print(a & b) #=> set(['green'])
print(a ^ b) #=> set(['red', 'blue', 'yellow', 'white'])
print('green' in a) #=> True
a.add('black')
print(a) #=> set(['red', 'blue', 'green', 'black'])
その他の処理
詳細
要素追加・拡張・結合
li = [1, 2, 3, 4]
li.append(5)
print(li) # [1, 2, 3, 4, 5]
li = [1, 2, 3]
li.extend([4, 5])
print(li) # [1, 2, 3, 4, 5]
tpl = 1, 2, 3
tpl2 = 4, 5, 6
print(tpl + tpl2) # (1, 2, 3, 4, 5, 6)
dict = {'a': 1, 'b': 'Hi', 'c': True}
dict['d'] = 123
dict.setdefault('e', 'default')
dict = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'c': 4, 'd': 5, 'e': 6}
print(dict.update(dict2)) # {'a': 1, 'b': 2, 'c': 4, 'd': 5, 'e': 6}
末尾の要素を消す
li = [1, 2, 3, 2]
li.remove(2)
print(li) # [1, 3, 2]
挿入
li = [1, 3]
li.insert(1, 2)
print(li) # [1, 2, 3]
含まれている個数
li = [1, 2, 3, 2, 2]
print(li.count(2)) # 3
tpl = 1, 2, 3
print(tpl.count(3)) # 1
検索
li = [1, 2, 3]
print('初めて現れる2は' + str(li.index(2)+1) + '文字目')
tpl = 1,2,3
print(tpl.index(1)) # 0
最大・最小
li = [1, 2, 3]
print(max(li)) # 3
print(min(li)) # 1
tpl = 1, 2, 3
print(max(tpl)) # 3
print(min(tpl)) # 1
ソート
li = [2, 1, 3]
print(li.sort()) # [1, 2, 3]
tpl = 2, 1, 3
print(surted(tpl)) # (1, 2, 3)
辞書のリスト化
dict = {'a': 1, 'b': 'Hi', 'c': True}
print(list(dict.keys())) # ['a', 'b', 'c']
dict = {'a': 1, 'b': 'Hi', 'c': True}
print(list(dict.values())) # [1, 'Hi', True]
演算子
算術演算子
+a # 正数
-a # 負数
a + b # 加算
a - b # 減算
a * b # 乗算
a / b # 除算
a % b # a を b で割った余り
a ** b # a の b 乗
a // b # 切り捨て除算
ビット演算子
~a # ビット反転
a & b # AND:論理積(aもbも1のビットが1)
a | b # OR:論理和(aまたはbが1のビットが1)
a ^ b # XOR:排他的論理和(aまたはbが1のビットが1)
a << b # b ビット左シフト
a >> b # b ビット右シフト
代入演算子
a = b # a に b を代入する
a += b # a = a + b に同じ
a -= b # a = a - b に同じ
a *= b # a = a * b に同じ
a /= b # a = a / b に同じ
a %= b # a = a % b に同じ
a **= b # a = a ** b に同じ
a //= b # a = a // b に同じ
a &= b # a = a & b に同じ
a |= b # a = a | b に同じ
a ^= b # a = a ^ b に同じ
a <<= b # a = a << b に同じ
a >>= b # a = a >> b に同じ
比較演算子
a == b # a が b と等しい
a != b # a が b と異なる
a < b # a が b よりも小さい
a > b # a が b よりも大きい
a <= b # a が b 以下である
a >= b # a が b 以上である
a is b # a が b と等しい
a is not b # a が b と異なる
a in b # a が b に含まれる (a, b は共に文字列、または、b はリストやタプル)
a not in b # a が b に含まれない (a, b は共に文字列、または、b はリストやタプル)
ブール演算子
a and b # a も b も真であれば真
a or b # a または b が真であれば真
not a # a が偽であれば真
条件演算
x if c else y
文字列演算
a + b # 文字列 a と 文字列 b を連結します
a * n # 文字列 a を n 回繰り返します
a[n] # 文字列 a の中の n 番目の文字を取り出します
a[n:m] # 文字列 a の中の n 番目から m 番目までの文字列を取り出します
a[n:] # 文字列 a の中の n 番目から最後までの文字列を取り出します
a[:m] # 文字列 a の中の 0 番目から m 番目までの文字列を取り出します
a[n:m:s] # 文字列 a の中の n 番目から m 番目までの文字列を s個とばしで取り出します
条件式(三項演算子)
err = 0
print("OK" if err == 0 else "NG")
代入式
代入の文が値を返すようになる。
s = "ABCDEF"
if (len := len(s)) > 5:
print("LONG")
else:
print("SHORT")
行列積
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# [[1*5+2*7=19, 1*6+2*8=22], [3*5+4*7=43, 3*6+4*8=50]]
print(np.dot(A, B)) # [[19, 22], [43, 50]]
print(A @ B) # [[19, 22], [43, 50]]
制御構文
条件式(if, else, elsif)
num = 12
if num > 10:
print("BIG")
print("BIG")
print("BIG")
if num > 10:
print("BIG")
else:
print("SMALL")
if num > 10:
print("BIG")
elif num == 10:
print("NORMAL")
else:
print("SMALL")
繰り返し(while, else)
n = 0
while n < 10:
print(n)
n += 1
n = 0
while n < 10:
print(n)
n += 1
else:
print('END')
繰り返し(for, in)
for n in [1, 2, 3]: # 配列
print(n) #=> 1, 2, 3
for n in (1, 2, 3): # タプル
print(n) #=> 1, 2, 3
for c in "ABC": # 文字列
print(c) #=> A, B, C
for k in {'one': 1, 'two': 2, 'three': 3}: # 辞書
print(k) #=> one, two, three
for line in open("sample.txt"): # ファイルの中身
print(line) # 1行ずつ表示
elseを使う例
for n in [1, 2, 3]:
print(n)
else:
print('END')
単に指定回数分繰り返す場合
for n in range(10):
print(n)
ループを抜ける(break)
for n in range(10):
if n == 5:
break
print(n) # 0, 1, 2, 3, 4
ループを繰り返す(continue)
for n in range(10):
if n == 5:
continue
print(n) # 0, 1, 2, 3, 4, 6, 7, 8, 9
例外処理(try, except, else, finally, as, raise)
str = 'ABC'
try:
c = str[5] # 5番目の文字が無いので、IndexError例外が発生します
except IOError:
print('IOError') # IOError例外の場合、このブロックが実行されます
except IndexError:
print('IndexError') # IndexError例外の場合、このブロックが実行されます
except:
print('Unknown') # 上記以外の例外の場合、このブロックが実行されます
else:
print('Other') # 例外が発生しなかった場合、このブロックが実行されます
finally:
print('Finally') # 常に、このブロックが実行されます
asで例外情報を変数に格納する。
try:
xxx
except SystemError as e:
print("SystemError")
print(e)
raiseは例外を発生させる。
# 元の例外をそのまま投げる
except Exception as e:
raise e
# 新たな例外を生成して投げる
except Exception:
raise MyError()
# 元の例外情報をつけて、新たな例外を投げる
except Exception as e:
raise MyError() from e
# 元の例外を無視して、新たな例外を投げる
except Exception:
raise MyError() from None
with構文
例えばfileオブジェクトはopen()するとclose()しないといけないが、withは自動で呼び出してくれる。
# withを用いない書き方
f = open("test.txt")
print(f.read())
f.close()
# withを用いた書き方1
with open("test.txt") as f:
print(f.read())
# withを用いた書き方2
f = open("test.txt")
with f:
print(f.read())
デリート文(del)
オブジェクトを削除する。
x = 5
y = [1, 2, 3]
z = MyClass()
del x, y, z
マッチ文(match)
他の言語のswitch文。
c = 3
match c:
case 1:
print("One")
case 2:
print("Two")
case 3:
print("Three")
case _:
print("Other")
コルーチン(async, await)
import asyncio
import requests
urls = [
"https://www.yahoo.co.jp",
"https://www.google.com",
"https://www.wikipedia.com"
]
async def getsize(url):
print(f"getsize({url}) START")
loop = asyncio.get_event_loop()
r = await loop.run_in_executor(None, requests.get, url)
print(f"getsize({url}) END {len(r.text)} bytes")
async def main():
print('main() START')
tasks = [asyncio.create_task(getsize(url)) for url in urls]
await asyncio.gather(*tasks)
print('main() END')
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
関数
関数
def add(x, y):
print(x + y)
add(3, 5) #=> 8
def add(x, y):
ans = x + y
return ans
n = add(3, 5)
print(n) #=> 8
def func():
return 3, "ABC"
n, s = func()
print(n, s) #=> 3 ABC
キーワード引数
def repeat_msg(msg, repeat=3):
for i in range(repeat):
print(msg)
repeat_msg('Hello') # Hello, Hello, Hello
repeat_msg('Yahho', repeat=5) # Yahho, Yahho, Yahho, Yahho, Yahho
可変引数
def func(a1, a2, *args, **kwargs):
print(a1) #=> A
print(a2) #=> B
print(args) #=> ('C', 'D')
print(kwargs) #=> {'k1': 'K1', 'k2': 'K2'}
func('A', 'B', 'C', 'D', k1='K1', k2='K2')
変数を渡す場合は*や**を付ける必要がある。
def func(a1, a2, *args, **kwargs):
print(a1) #=> A
print(a2) #=> B
print(args) #=> ('C', 'D')
print(kwargs) #=> {'k1': 'K1', 'k2': 'K2'}
args = ('C', 'D')
kwargs = {'k1': 'K1', 'k2': 'K2'}
func('A', 'B', *args, **kwargs) #=> A, B, ('C', 'D'), {'k1': 'K1', 'k2': 'K2'}
グローバル変数(global)
関数の中でグローバル変数に代入できないので、globalを使って関数内で定義した変数をグローバル化して扱う必要がある。
count = 0 # グローバル変数
def func1():
print(count) # 参照することはできる
def func2():
global count # global宣言してやれば
count += 1 # 代入することもできる
ラムダ式(lambda)
myfunc = lambda x, y: x + y
print(myfunc(3, 5)) #=> 8
イテレータ(iterator)
class MyRange:
def __init__(self, max):
self._max = max
def __iter__(self):
self._count = 0
return self
def __next__(self):
result = self._count
if result >= self._max:
raise StopIteration
self._count += 1
return result
for n in MyRange(5):
print(n) #=> 0, 1, 2, 3, 4
ジェネレータ(yield)
def funcA(list):
ret = []
for n in list:
ret.append(n * 2)
return ret
for n in funcA([1, 2, 3, 4, 5]):
print(n) #=> 2, 4, 6, 8, 10
上記は下記と同値
def funcB(list):
for n in list:
yield n * 2
for n in funcB([1, 2, 3, 4, 5]):
print(n) #=> 2, 4, 6, 8, 10
デコレータ(@)
指定した関数の前後に処理を行う。
def mydecolater(func): # デコレータを定義する
def wrapper():
print("start") # 前処理を実行する
func() # デコレート対象の関数を実行する
print("end") # 後処理を実行する
return wrapper
@mydecolater
def hello():
print("hello")
hello() #=> start, hello, end
クラス
クラス(class)
class MyClass:
"""A simple example class""" # 三重クォートによるコメント
def __init__(self): # コンストラクタ
self.name = ""
def getName(self): # getName()メソッド
return self.name
def setName(self, name): # setName()メソッド
self.name = name
a = MyClass() # クラスのインスタンスを生成
a.setName("Tanaka") # setName()メソッドをコール
print(a.getName()) # getName()メソッドをコール
クラス変数・インスタンス変数(attribute)
class MyClass:
def __init__(self):
self.name = "" # インスタンス変数
a1 = MyClass()
a1.name = "Tanaka"
a2 = MyClass()
a2.name = "Suzuki"
print(a1.name) #=> Tanaka
print(a2.name) #=> Suzuki
メソッド(method)
class MyClass:
name = ""
def setName(self, name): # 第一引数は自インスタンス(self)
self.name = name
a = MyClass()
a.setName("Tanaka")
コンストラクタ(__init__)
class MyClass:
def __init__(self, name):
self.name = name
def getName(self):
return self.name
a = MyClass("Tanaka")
print(a.getName()) #=> Tanaka
デストラクタ(__del__)
class MyClass:
def __init__(self):
print("INIT!")
def __del__(self):
print("DEL!")
a = MyClass() #=> INIT!
del a #=> DEL!
文字列化(__str__)
class MyClass:
def __init__(self, name):
self.name = name
def __str__(self):
return "My name is " + self.name
a = MyClass("Yamada")
print(a) #=> My name is Yamada
継承(inheritance)
class MyClass:
def hello(self):
print("Hello")
class MyClass2(MyClass):
def world(self):
print("World")
a = MyClass2()
a.hello() #=> Hello
a.world() #=> World
親クラス(super())
class MyClass1(object):
def __init__(self):
self.val1 = 123
class MyClass2(MyClass1):
def __init__(self):
super(MyClass2, self).__init__()
self.val2 = 456
a = MyClass2()
print(a.val1) #=> 123
print(a.val2) #=> 456
パッケージとモジュール
モジュール(module)
「mymod.py」の中身が以下であるとする:
def myfunc():
print("Hello!")
このとき、
import mymod
mymod.myfunc() #=> Hello!
その他
型の取得
type('10') == str # true
ファイル生成
f = open('○○.txt', 'w')
f.write('Hi')
f.close()
現在時刻
import datetime
now = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9)))
print(now.hour) # (現在の時間)
ランダム
import random
rand = random.random() # [0.0, 1.0) からランダムな実数
rand_int = random.randint(a, b) # [a, b] からランダムな整数
li = [ 'a', 'b', 'c', 'd' ]
rand_choice = random.choice(li) # リストからランダムに1つ選択
重複なしランダム抽出
import random
print(random.sample(list_, 10)
ディレクトリのファイル一覧
import os
path = "./○○"
files = os.listdir(path)
files_file = [i for i in files if os.path.isfile(os.path.join(path, i))]
JSON
開く
import json
a = json.load(open('○○.json'), encoding="utf-8")
書き換える
import json
dict = { 'a': 'Hi' }
with open('○○.json', 'w') as changed_file:
json.dump(dict, changed_file, indent=2)
tkinter
ウィンドウを開く
import tkinter
import tkinter.font as font
frm = tkinter.Tk()
geo = '600x400' # ウィンドウのサイズ
frm.geometry(geo)
frm.title(config.window.name)
fontC = font.Font(family='Helvetica', size=20, weight='bold')
tkinter.Label(
frm,
text='Text', # テキスト
fg='#64ec86', # 文字色
bg='#ffff00', # 文字の背景色
font=fontC
).pack(side='top')
button = tkinter.Button(frm) # ボタン作成
button["text"] = 'Click here!' # ボタンのテキスト設定
button.pack(side='top') # ボタンの設置位置変更
frm.mainloop()
メッセージボックス
from tkinter import messagebox
messagebox.showinfo('タイトル', '内容')
messagebox.showerror('タイトル', '内容')