未分類

TkinterでPython用GUIを作る

サーボ制御用デスクトップアプリを作ったら、歩行ロボットをラズパイで制御させられるかなと思って、GUI製作メモ。

 

コード

後半のレイアウト作成で苦戦。CSSと同じく、望んだ位置に配置するのは難しい。
ホントは、ラベルースライダの横並びを縦に並べたかった。

メモ

  • パーツ一つ一つをウィジェットと呼ぶ
  • ウィジェットはクラス継承でツリー構造になってる
  • Tkinterは標準ライブラリ、Tkinter.ttkはデザイン綺麗なライブラリ
  • 配置の決め方は、pack place gridの3パターン
    • pack ; CSSのfloatみたいな感じ。親ウィジェット内を指定方向に並べてく
    • grid : 使ってない。表とセルみたいな配置?
    • place : CSSのposition風。x、y座標で固定させる。
      親ウィジェットからの相対座標?PC上でしか動かす予定ないし最終的にはこれでつくるのかも。
###tkinterパッケージ
from tkinter import * #アスタリスクは、tkinterパッケージを前置きなしで使える。(Tk()など⇐tkinterのメソッド)
###ttk=Tkのテーマ付きウィジェット(画面の部品=ウィジェット)
from tkinter import ttk

class ServoController(ttk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
#        super()を使うと、サブクラスからスーパークラスを参照し、スーパークラスのメソッドを利用することができる
#        self.master = master
#        self.master.text("get_ScaleValue")
#        self.master.geometry('400x60')
        print(self.master)
        self.create_widget()

    def slider_changed(self, scale_val):
        print(scale_val)#(",end=")#
    
    def create_widget(self):
#        pw_main = PanedWindow(self.master,bg="lightblue")
#        pw_main.pack(expand=True, fill=BOTH)
#        pw_right = PanedWindow(pw_main, orient=VERTICAL)
#        pw_main.add(pw_right)

#        self.button = ttk.Button(self.master, text="Button")
#        pw_right.add(self.button)
        self.label = ttk.Label(self.master, text="Motor %d /pin %d"%(16,11))
        self.var_scale = DoubleVar()
        self.var_scale.set(0.3)
        self.scale1 = Scale(self.master, orient="h", from_=0.0, to=180.0, length=256,  variable=self.var_scale,command=self.slider_changed)

        self.label.pack()
#        self.label.pack(padx=10)
        self.scale1.pack()

if __name__ == "__main__":
    t = 10
    geometry=str('800x'+str(t*60))

    root = Tk()
    root.geometry(geometry)
    root.title("get_ScaleValue")

    print(geometry)

    window=ttk.Frame(root)#, orient=VERTICAL)


    ServoControllerArray= []#各スライダー部のオブジェクト配列
    for i in range(t):
        ServoControllerArray.append(ServoController(master=window))
#    ServoControllerArray.append(ServoController(master=window))
#    ServoController[0].label(text="1")

        #window.add(ServoControllerArray[i])
    print(ServoControllerArray)

    window.pack(side=LEFT)

    root.mainloop()

参考サイト

Tkinterとttkの比較https://www.python-beginners.com/entry/20181228/1546007370

リファレンスhttps://cercopes-z.com/Python/stdlib-tkinter-widget-methods-py.html#method-pack

スライダーバーの値を返すhttps://teratail.com/questions/287719

クラス関係

https://qiita.com/Anaakikutsushit/items/c67d4edb0c01a97f3130

https://docs.python.org/ja/3/tutorial/classes.html

-未分類

© 2021 技術科・情報科のサイト Powered by AFFINGER5