狠狠撸

狠狠撸Share a Scribd company logo
tkinter の話
2020-09-18
西本 卓也(株式会社シュアルタ)
@nishimotz / @24motz
1
おまえ誰よ
? 京都(1996年~2002年)→ 現在は広島
? NVDA日本語チーム www.nvda.jp
? PyCon mini Hiroshima → 2020年10月10日オンライン開催
? PyCon JP 2020 でコミュニティの話をした
? すごい広島 with Pythonで「標準ライブラリなLT会」を紹介された
? ソース
? tkinterの話題
? https://gist.github.com/nishimotz/ca2d5eac2002b908a7da3aaa2f162f48
? まわり将棋
? https://gist.github.com/nishimotz/67b1e1cd245eadb2b2597db650a8c772
2
動機
? ゲームセンターあらしと学ぶ プログラミング入門
? 知り合いの息子さんと2回ほど読書会
? この本のアプローチ
? 公式 Python
? エディタは IDLE
? 標準ライブラリだけでスカッシュゲーム
? tkinter
? 扱わないこと
? クラス定義
? データ構造
3
4
Python で予約語の一覧を出す方法
? 51ページに import keyword が紹介されている
5
tkinter
? https://docs.python.org/ja/3/library/tkinter.html
? Tcl/Tk の Tk
? Tk の仕様書にたらいまわしにされる
6
tkinter/__init__.py より
7
import tkinter
from tkinter.constants import *
tk = tkinter.Tk()
frame = tkinter.Frame(tk, relief=RIDGE, borderwidth=2)
frame.pack(fill=BOTH,expand=1)
label = tkinter.Label(frame, text="Hello, World")
label.pack(fill=X, expand=1)
button = tkinter.Button(frame,text="Exit",command=tk.destroy)
button.pack(side=BOTTOM)
tk.mainloop()
8
9
10
多重継承による実装
? Fluent Python 第1版 第12章 継承の功罪
? 「標準ライブラリで多重継承を極端に用いている例」として紹介
11
>>> import tkinter
>>> def print_mro(cls):
... print(', '.join(c.__name__ for c in cls.__mro__))
...
>>> print_mro(tkinter.Toplevel)
Toplevel, BaseWidget, Misc, Wm, object
>>> print_mro(tkinter.Canvas)
Canvas, Widget, BaseWidget, Misc, Pack, Place, Grid, XView, YView, object
>>>
使い方(公式)
12
import tkinter as tk
class Application(tk.Frame):
(中略)
root = tk.Tk()
app = Application(master=root)
app.mainloop()
canvas が便利
13
def create_widgets(self):
self.cv = tk.Canvas(self, width=440, height=440)
# omitted
self.cv.create_text(60, 60, text="歩", tag="player")
self.cv.pack(side="top")
def set_player_pos(self, x, y):
self.cv.coords("player", x, y)
def set_player_text(self, text):
self.cv.itemconfigure("player", text=text)
def button_pressed(self):
# omitted
self.set_player_text("香")
ttk = テーマ付きウィジェット
? https://docs.python.org/ja/3/library/tkinter.ttk.html
14
>>> from tkinter import ttk
>>> import tkinter
>>> root = tkinter.Tk()
>>> ttk.Style().configure("TButton", padding=6, relief="flat", background="#ccc")
>>> btn = ttk.Button(text="Hello")
>>> btn.pack()
これから
? 「こんにちはPython」で勉強した人に...
? さらに tkinter を深掘りしてもらう?
? 割り切りが必要
? 別の GUI ツールキット?
? レトロゲームエンジン Pyxel
? https://github.com/kitao/pyxel/blob/master/README.ja.md
15

More Related Content

200918 hannari-python