Python 1年間のまとめ widget編 ⑮

Pythonの学習を初めてから約1年が過ぎました。 

何もないところから始めたので、遅々として進歩しませんでしたが、参考書・ネット・質問サイトなどの力を借りて何とか簡単なソフト(アプリ)は作れるようになりました。

 

しかしたまにしか使わないcodingを覚えているわけではないので、必要な時にここを見てコピペをすればなんとかなるだろうと思い簡単に必要なcodeをアップすることにしました。 順不同の備忘録です。

Pythonのtkinterによる表示を標準としました。

 

ご注意!
 ここに書きんだcodeは、indent(字下げ)がうまく機能していないようです。 indentは半角4ケです。

 

****************************************

① ウインドーを作る(部品なし, 300×400大きさ)

import tkinter as tk

root = tk.Tk()
root.geometry(“300×400”)

root.mainloop()

———————————–

モニターの解像度が”1920×1080”で、画面の中央にウインドーを表示したい時は下記のようなcodeとなる。

import tkinter as tk

root = tk.Tk()
root.geometry(“300×400+900+350”) #ウインドーの左上の端をx=900、y=350と指定する

root.mainloop()

 

② 自分のパソコン・モニターの解像度を調べる

from ctypes import windll

w = windll.user32.GetSystemMetrics(0) # 横幅
h = windll.user32.GetSystemMetrics(1) # 縦幅

print(w, h)

私のモニターの解像度はサイズは”1920 x 1080”ですので、次のように表示されます。

>>> 1920 1080

なので、root.geometry(“1920×1080”)と指定すると、モニター画面一杯の大きさのウインドーが表示されます。

自分のモニターの解像度はディスプレイ設定で簡単に分かりますので、どれ位の大きさのウインドー(root.geometry())にすればよいか暗算できますね。

 

③ 自分のパソコン・モニターの解像度を調べる Ⅱ

tkinterを使うなら、こちらの方が分かり易いですね。

import tkinter

root = tkinter.Tk()

w=root.winfo_screenwidth()
h=root.winfo_screenheight()

print(w, h)

root.geometry(“300×300+200+200”)

root.mainloop()

これで
>>> 1920 1080 と表示されます。

root.geometry(“300×300+200+200”)は;
 モニターの左上から200(x)、200(y)の位置に大きさが300×300のウインドーが表示されます。

 

これで下記のようなものが作れます。

 

 

 

 

 

 

 

 

④ ラベルを張り付ける

基本的な部品(widgetと言います)には、ラベル・テキストボックス・ボタン等が有ります。
そして場合によっては、それらを表示するためにパネル・キャンバスとかが出てきます。

まずラベルを張り付けましょう。

import tkinter as tk

root = tk.Tk()
root.geometry(“300×400”)
 ここへラベル表示のcode(下の二行)を書きます。
root.mainloop()

 

次のようにラベルを指定して、pack()で張り付けます。

label_1 = tk.Label(text=”label_1″, bg=”Blue”)
label_1.pack()

————————————

runすると次のようなラベルの付いたwindowが出来ます。

 

 

 

 

 

 

 

 

⑤ ラベルの位置決め


  位置決めは次の三通りあります。
  ・lable.pack()   一列表示用
  ・label.grid()  複数行表示用
  ・lable.place()   表示場所を指定する
  それぞれに表示文字、font、背景色、labelの形状などの属性を指定できます。

————————————————-

import tkinter as tk
root = tk.Tk()

root.geometry(“300×300”)

label = tk.Label(
  root,
  text=”Python”,
  bg=”lime green”,
  fg=”blue”,
  cursor=”star”,#カーソルでheart, star, circle表示できる (triangle, square — NG)
  font=(“Helvetica”, 16, “bold”),
  relief=”groove” #raised, ridge, sunken, solid 等指定可能
  )

#label.pack(fill = ‘x’) #横一杯に広げる
label.pack(fill = ‘x’,padx=100) #横幅を調整する, padx=0は’x’と同じ

label2=tk.Label(root, text= “”) #一行空けたいとき
label2.pack()

root.mainloop()

————————————————-

上のcodeを実行すると次のような図が得られる。

 

 

 

 

 

 

 

 

 

 

 

⑥ ラベル文字を変更する

余りラベルの文字を変更しないけれど、ラベルに文字列を呼び込む場合もあるので書いておきます。

import tkinter as tk

root = tk.Tk()
root.geometry(‘300×200’)
root.title(‘クマさんの百人一首’)

lbl_1=tk.Label(root,text=’ラベルL_1′, bg=”white”)
lbl_1.place(x=30, y=50)

lbl_2=tk.Label(root,text=’ラベル_2′, bg=”white”)
lbl_2.place(x=130, y=50)

# ボタンクリックでラベルの文字を変更する関数を作る
def btn_click():
 lbl_1[“text”] = “更新完了と変更”
 lbl_2[“text”] = “Pyhonと変更”

# ボタンクリックイベントと関数の関連付け
btn=tk.Button(text=’ラベル文字変更する’, width=20,command = btn_click)
btn.place(x=30,y=100)

 

—————————————————-

 

runすると右の図のようにラベルの文字が変更されている。

 

 

 

 

 

 

⑦ テキストボックスを作る

では、次は計算結果や文字列を表示するテキストボックスを表示させます。
Entryというウイジェットを使います。

———————————————–

import tkinter as tk

root = tk.Tk()
root.geometry(‘300×200’)
root.title(‘テキストボックス’)

# ラベル
lbl_1 = tk.Label(text=’数値’)
lbl_1.place(x=30, y=70)

# テキストボックス
txt_1 = tk.Entry(width=20)
txt_1.place(x=90, y=70)

# テキストボックスに文字をセット
txt_1.insert(tk.END,”1234″)

root.mainloop()

————————————————–

これをrunすると次の図が出来ます。 
codeの説明は簡単ですので省略します。

 

 

 

 

 

 

 

 

⑧ テキストの移動
 Entryを二つ作って移動させます。  

————————————————-

import tkinter as tk


root = tk.Tk()
root.geometry(‘300×200’)
root.title(‘テキストボックス’)

# ラベル1
lbl_1 = tk.Label(text=’数値1′)
lbl_1.place(x=30, y=70)

# テキストボックス1
txt_1 = tk.Entry( width=20)
txt_1.place(x=90, y=70)

# ラベル2
lbl_1 = tk.Label(text=’数値2′)
lbl_1.place(x=30, y=100)

# テキストボックス2
txt_2 = tk.Entry( width=20)
txt_2.place(x=90, y=100)

# テキストボックス1に文字をセット
txt_1.insert(tk.END,”1234″)


# テキストボックス1の文字列をget
txt_1.get() #この式をテキスト2への入力に使う(変数に入れても良い)

# テキストボックス1の文字列をテキストボックス2へ移動
txt_2.insert(tk.END,txt_1.get())


#テキストボックスをクリア
txt_1.delete(0, tk.END) 


root.mainloop()

——————————————————-

これでテキストの移動が出来ました。

 

 

 

 

 

 

 

 

兎に角順序だてて、一つ一つ処理を指示しなければ正しく動作しません。 

作る方のボケ予防に最適です。

 

⑨ 写真・画像(PNG)を表示させる


割と簡単に表示できますが、この関数ではjpgは動作しません。 

———————————————————

import tkinter as tk

root=tk.Tk()
root.geometry(‘200×300’)

#画像表示
img=tk.PhotoImage(file=’1.png’)

canvas=tk.Canvas(width=200, height=300)
canvas.place(x=20, y=20)
canvas.create_image(0,0, image=img, anchor=tk.NW) #image=(img)でも良い

root.mainloop()

———————————————————

次の画像が表示されます。

 

 

 

 

 

 

 

 

 

⑩ チェックボタンのon/off

これも選択肢の選択追加などで使うので是非覚えておきたい。

先ず一個のチェックボタンのon/offしましょう。

—————————————————————-

import tkinter as tk

root=tk.Tk()
root.geometry(“300×200”)
root.title(“チェックボックスのon-off”)

# チェックON・OFF変数。Trueでonに設定
bln = tk.BooleanVar()
bln.set(True)

# チェックボタン
# チェックボタンのチェック状態は「tk.BooleanVar」型で設定する。
chk = tk.Checkbutton(root, variable=bln, text=’ チェックボタンをon/offする’)
chk.place(x=50, y=70)

root.mainloop()

——————————————————————–

runすると次のような図ができる。 

 

 

 

 

 

 

 

 

⑪ ラジオボタンのon/off

import tkinter as tk

root = tk.Tk()
root.geometry(‘300×200’)
root.title(‘ラジオボタン’)

# チェック有無変数
var = tk.IntVar()

# ラジオボタン1をonにするするために、チェックを入れる
var.set(1) #ラジオボタンは常に一個しかonに出来ません。


# ラジオボタン作成
radio_1 = tk.Radiobutton(root, value=0, variable=var, text=’Python’).place(x=70, y=40)

radio_2 = tk.Radiobutton(root, value=1, variable=var, text=’Java’).place(x=70, y=70)

radio_3 = tk.Radiobutton(root, value=2, variable=var, text=’C#’).place(x=70, y=100)

# チェックされているラジオボタン
print(var.get())

root.mainloop()

——————————————

runすると次のようにラジオボタン2が選択されております(var.set(1) はボタン2です)。

 

 

 

 

 

 

 

⑫ リストボックスの作り方

 

# listbox1.py 10/15/2019

import tkinter as tk

root=tk.Tk()
root.title(“ListBox1”)
root.geometry(“200×200”)

lbl=tk.Label(root, text=”Listbox”, bg=”yellow”).grid(pady=20)

listbox=tk.Listbox(root, height=5) #リスト行数
for line in [
    “聖徳太子”,
    “太平洋戦争”,
    “ポツダム宣言”,
    “仏教伝来”,
    “壬申の乱”
    ]:
listbox.insert(tk.END, line)
listbox.select_set(2) #リストの3番目を選択(2ではない!)
listbox.grid(padx=30, pady=10)

root.mainloop()

 

 

 

 

 

 

 

 

 

 

⑬ 複数行書けるテキストボックス

# text1.py 10/16/2019

import tkinter as tk

root=tk.Tk()
root.title(“TextBox”)
root.geometry(“200×200”)

label=tk.Label(root, text=” TextBox(not Entry)”, bg=”yellow”).place(x=30, y=20)

text = tk.Text(root, width=15, height=6) #ここへplace()を書くとinsertが不動作
text.place(x=30, y=50)
text.insert(tk.END, “Python\nJave\nVBA\nC++\nUnix”)

root.mainloop()

 

 

 

 

 

 

 

 

⑭ 複数行テキストボックスの作り方

import tkinter as tk

root = tk.Tk()
root.title(“基本ウインドー1”)
root.geometry(“200×200+500+200”)#見やすいように中央に表示する

lbl_1=tk.Label(root, text= “Label_1″, width=10, bg=”yellow”)
lbl_1.place(x=10, y=20)

txt_1 = tk.Text(root, width=20, height=4)#1とすれば1行のみ表示されえる
txt_1.insert(tk.END, “Python\nJave\nVBA\nC++\nUnix”)
txt_1.place(x=20, y=50)


def all_erace():
    lbl_1[“text”] = “”
    txt_1.delete(‘1.0’, ‘end’)

btn_1=tk.Button(root, text=”全部消す”, command=all_erace)
btn_1.place(x=30, y=120)

root.mainloop()

これをrunして、コマンドボタン(全部消す)をクリックすると、ラベルとテキスト文字が消されます。
ラベル・Entry・Textボックスの文字列の消し方が違うので非常に面倒です。 

 

もっと便利なライブラリーを誰か作ってくれればよいのにね(探せばあるかも)。 
自分で作ればいいのだけれどね(まだそのレベルではありません)。

 

 

 

 

 

 

 

 

 

 

⑮ スケールの使い方

やっと ttkではなく、Python標準のtkinterでスケールを使える方法が出来ました。

ウイジェット・スケールは、数値範囲の中から選ばれた数値に該当したテキスト・画像・音源などを選択表示(または演奏)することができます。 

—————————————

import tkinter as tk


#初期化用ボタンのクラス
class DefaultButton(tk.Button):
    def __init__(self, var, master=None):
        super().__init__(
            master=master,
            width=15,
            text=”set default(124)”,
            command=self.set_default,
            )
        self.var = var

    def set_default(self):
        self.var.set(124)

if __name__ == “__main__”:
    root = tk.Tk()
    root.title(“Scaleの使い方”)
    root.geometry(“200×200”)

    #変数の設定
    var = tk.IntVar(
    master=root,
    value=124,
    )

    #現在値表示用ラベルの設定
    lbl = tk.Label(
    master=root,
    width=10,
    textvariable=var,
    )
    lbl.pack()

    #スケールの設定
    scl = tk.Scale(
    master=root,
    length=200,
    from_=0,
    to=255,
    orient=”horizontal”,
    showvalue=False,
    variable=var
    )
    skl.pack()

    #ボタンの設定
    btn = DefaultButton(
    master=root,
    var=var,
    )
    btn.pack()

root.mainloop()

—————————————

 

 

 

 

 

 

 

続く

Python別館
高齢者運転免許認知症テスト

最近は高齢者は3年に一度の認知症テストが有ります。 先日受けてきたのですが、確か次のようなテストが有 …

Python別館
Pythonファイルをexe化する ⑤

Pythonンプログラムを作っても、他人に渡す時はexeファイルにしないといけません。コマンドプロン …

Python別館
うるう年を計算する ③

先にカレンダー作成をしましたが、来年はオリンピックの年でまた閏年でもあります。閏年とは、・西暦が4で …