Python グラフィカル インターフェイス開発ツール、Python グラフィカル インターフェイス開発チュートリアル

この記事では、Python グラフィカル インターフェイス開発と Python グラフィカル インターフェイス開発ツールについて説明します。お役に立てば幸いです。このサイトをブックマークすることを忘れないでください。

1. ルートフォーム

        (1) ルートフォームオブジェクトの作成

        ①tkinter.Tk():ルートフォームオブジェクトを作成します。使用後すぐにウィンドウが表示されますので、高等学校情報技術系Python試験問題を受け取るにはrootを忘れずに行ってください。

        ②root.title(name): ルートフォームのタイトルを設定します。

        ③root.geometry('aaaxbbb'):ルートフォームのサイズを設定します。ここでの乗算記号は小文字の x、aaa は幅、bbb は高さであることに注意してください。

        ④root.mainloop(): 上のコードを監視し、ウィンドウが閉じるまで下のコードをブロックします。

import tkinter

root = tkinter.Tk()
root.title('myapp')    #不要写成root.title='myapp',这与c++窗体不同
root.geometry('500x300')
root.mainloop()

        (2) コントロールレイアウト

        .pack() メソッド (例として Label を使用)

        ①tkinter.Label(root,..,text,fg,relief):ラベルオブジェクトを作成します。このうち、rootはルートの形状、textはラベルの文字、fgはラベルの色で様々な色を英語で表現、reliefはラベルのエッジ属性、relief=tkinter.GROOVEはエッジの凹み属性です。Label の L は大文字であることに注意してください。

        ②label.pack():ルートフォームにラベルを配置します。配置ルールは、パラメータのないデフォルトの方法を使用した場合、縦方向に上から下へ重ならない密接な形式で配置され、横方向の位置は中央に配置されます。

        ③label.pack()ではfillやsideなどのパラメータを設定できます。このうち、パラメータ fill は、fill=X、fill=Y、または fill=BOTH の値を取ることができ、それぞれ、コントロールが水平方向、垂直方向、または 2 次元方向の残りのスペースを埋めることができることを意味します。パラメータ Side 可能な値:side=TOP (デフォルト)、side=LEFT、side=RIGHT、side=BOTTOM、それぞれ次のコントロール インスタンスに対するこのコントロール インスタンスのレイアウトの方向を示します。

import tkinter

root=tkinter.Tk()
lbred=tkinter.Label(root,text='red',fg='red',relief=tkinter.GROOVE)
lbred.pack()
lbgreen=tkinter.Label(root,text='绿',fg='green',relief=tkinter.GROOVE)
lbgreen.pack(side=tkinter.LEFT)
lbblue=tkinter.Label(root,text='blue',fg='blue',relief=tkinter.GROOVE)
lbblue.pack(fill=tkinter.BOTH)
root.mainloop()

         .grid() メソッド

        テーブル レイアウトに基づいて、対応するテーブルにドロップ コントロールを配置します。一部のパラメータの意味は次のとおりです。
        ① 列、行: コントロールの行と列の座標。デフォルトは 0 です (座標は 0 から始まることに注意してください)。

        ②columnspan、rowspan: コントロールがまたがる行と列の数、デフォルトは 1 です。

        ③ipadx、ipady: インスタンス コントロールによって表示される領域のピクセル数によって、コントロールのサイズが定義されます。

        ④padx、pady: インスタンス コントロールが配置されているセルのサイズ。セルのサイズを定義します。

        .place()方法

        親コンテナ内の相対位置に基づいてスペースをレイアウトします。

        ①x,y: ルートフォームを基準としたコントロールの座標。

        ②relx、relie: ルートフォームに対するコントロールの相対位置。

        ③高さと幅: コントロールの高さと幅。(単位はピクセルです)。

        ④relheight と relwidth: ルートフォームに対するコントロールの相対的な高さと幅。

注: Grid() メソッドと混合できます。

import tkinter

root = tkinter.Tk()
root.title('myapp')    #不要写成root.title='myapp',这与c++窗体不同
root.geometry('500x300')
msg1=tkinter.Message(root,text='我是一行文字我是另一行文字',relief=tkinter.GROOVE)
msg1.place(relx=0.2,rely=0.4,relwidth=0.6,relheight=0.4)
root.mainloop()

2. 共通コントロール

        (1) よく使われるコントロールの紹介

                よく使用されるスペースは次のとおりです。

コントロール 名前 効果
ボタン ボタン クリックトリガーイベント
キャンバス キャンバス グラフィックを描画するか、特別なコントロールを描画します
チェックボタン チェックボックス 複数の選択肢
エントリ 入力ボックス 単一行のテキスト入力を受け入れる
フレーム フレーム コントロールのグループ化に使用されます
ラベル ラベル 一行テキスト表示
リストボックス リストボックス テキストリストを表示
メニュー       メニュー メニューコマンドの作成
メッセージ 情報 複数行のテキストラベル。ラベルの使用法と同様
ラジオボタン 単一ボックス 相互に排他的な複数のオプションから単一の選択を行う
規模 スライダー  マウスをドラッグして値を変更します
スクロール・バー スライダー つまりスクロールバー
文章 テキストボックス 受け入れまたは出力して複数行のテキストを表示します
トップレベル 新しいフォームコンテナを作成する 最上位に新しいフォームコンテナを作成します

                 コントロールの共通プロパティ:

属性  説明する 価値
アンカー テキストの開始位置 中央 (デフォルト)、東、南、西、北、北東、南東、南西、北西
バックグラウンド 背景色 「赤」、「緑」など
BD 大胆な なし
カーソル マウスオーバーカーソル -
フォント フォント 例: ('中国の新魏',32)
フロム         前景色 「赤」、「緑」など
身長 高さ (テキスト制御単位はピクセルではなく行です) 番号
画像 画像を表示 なし
正当化する 複数行のテキストの配置 中央 (デフォルト)、左、右、上、下
パドクス ピクセルを水平方向に拡張する なし
水田 ピクセルを垂直方向に拡張する なし
安心 ボーダースタイル 平坦、隆起、陥没、溝、尾根
コントロールインスタンスの状態が利用可能かどうか 通常 (デフォルト)、無効
幅 (テキスト コントロールの単位はピクセルではなく行です) なし
from tkinter import *
root=Tk()
lb = Label(root,text='hello world!',\
        bg='#00ffff',\
        fg='green',\
        font=('微软雅新',32),\
        relief=GROOVE,\
        width=20,\
        height=2)
lb.pack()
root.mainloop()

注: 幅と高さの単位は列または行です。これは、pack() または Grid() を使用して配置するときにテーブル単位で指定されるためです。place() を使用して配置した場合、コントロールのサイズを place パラメーターで設定できます。単位はピクセルです。

        (2) テキスト入出力関連のコントロール

        .Label と Message : Label には 1 行のテキストが表示され、Message には複数行のテキストが表示されます。残りのプロパティは基本的に同じです。

        text 属性は、最初のレンダリング時の固定テキストにのみ使用できます。テキストを変更する必要がある場合は、次の 2 つの方法があります。

        ①configure()メソッドを使用してテキストの値を変更します。

        ② tkinterの内部型変数var=StringVar()を定義し、その値を変更するとテキストも変更できます。

        方法 1:configure() メソッドを使用してテキストの値を変更する

from tkinter import *
import time

root=Tk()
root.geometry('500x300')

def gettime():
        nowtime=time.strftime("%H:%M:%S")
        lb.config(text=nowtime)
        root.after(1000,gettime) #1000ms后调用gettime()函数

if __name__=='__main__':
        root.title('time')
        lb=Label(root,text='',fg='red',font=('微软雅新',80))
        lb.pack()
        gettime()
        root.mainloop()

注: この例では config() が使用されていますが、実際には、configure() も同じ効果があります。違いについては、使用中に違いが見つからず、ネットで情報を探しても無駄でした。

          方法 2: textvariable 変数属性を使用してテキストの変更を実装します。

        

from tkinter import *
import time
root=Tk()
root.geometry('500x300')

def gettime():
        nowtime=time.strftime("%H:%M:%S")
        #lb.configure(text=nowtime,fg='green')
        var.set(nowtime)
        root.after(1000,gettime) #1000ms后调用gettime()函数

if __name__=='__main__':
        root.title('time')
        var=StringVar() #创建一个特殊变量对象
        lb=Label(root,textvariable=var,fg='red',font=('微软雅新',80)) #注意这里定义Label时定义textvariable而不是text
        lb.pack()
        gettime()
        root.mainloop()

        .テキストボックス(テキスト)

        テキストボックスのメソッドは次のとおりです。

方法 関数
delete(開始位置, [,終了位置]) 指定した領域のテキストを削除します
get(開始位置, [,終了位置]) 指定した領域のテキストを取得します
挿入(位置,[,文字列]...) 指定した位置にテキストを挿入する
see(位置) 在指定位置是否可见文本,返回布尔值
index(标记) 返回标记所在的行和列
mark_names() 返回所有标记名称
mark_set(标记,位置) 在指定位置设置标记
mark_unset(标记) 去除标记

        上表位置的取值可为整数,浮点数或END(末尾),例如0.0表示第0列第0行

from tkinter import *
import time
import datetime

root=Tk()
root.geometry('500x300')

def gettime():
        nowtime=str(datetime.datetime.now())+'\n'
        txt.insert(END,nowtime)
        root.after(1000,gettime) #1000ms后调用gettime()函数

if __name__=='__main__':
        root.title('timetext')
        txt=Text(root)
        txt.pack()
        gettime()
        root.mainloop()

        .输入框(Entry):接受单行文本输入的控件。通常只用get()和delete()两个方法,delete(0,END)可清空输入框。

        (3)按钮(Button)

         button相应鼠标单击事件。相应的事件函数需先定义好,然后用以下两种方法调用函数。

        .直接调用函数。command=函数名。注意函数名后加括号不加参数

        .利用匿名函数调用函数和传递参数。参数的表达式为,“command=lambda”:函数名(参数列表)。例如:“command=lambda:run2(inp1.get(),inp2.get())”。

from tkinter import *
 
def run1():
     a = float(inp1.get())
     b = float(inp2.get())
     s = '%0.2f+%0.2f=%0.2f\n' % (a, b, a + b)
     txt.insert(END, s)   # 追加显示运算结果
     inp1.delete(0, END)  # 清空输入
     inp2.delete(0, END)  # 清空输入
 
def run2(x, y):
     a = float(x)
     b = float(y)
     s = '%0.2f+%0.2f=%0.2f\n' % (a, b, a + b)
     txt.insert(END, s)   # 追加显示运算结果
     inp1.delete(0, END)  # 清空输入
     inp2.delete(0, END)  # 清空输入
 
root = Tk()
root.geometry('460x240')
root.title('简单加法器')
 
lb1 = Label(root, text='请输入两个数,按下面两个按钮之一进行加法计算')
lb1.place(relx=0.1, rely=0.1, relwidth=0.8, relheight=0.1)
inp1 = Entry(root)
inp1.place(relx=0.1, rely=0.2, relwidth=0.3, relheight=0.1)
inp2 = Entry(root)
inp2.place(relx=0.6, rely=0.2, relwidth=0.3, relheight=0.1)
 
# 方法-直接调用 run1()
btn1 = Button(root, text='方法一', command=run1)
btn1.place(relx=0.1, rely=0.4, relwidth=0.3, relheight=0.1)
 
# 方法二利用 lambda 传参数调用run2()
btn2 = Button(root, text='方法二', command=lambda: run2(inp1.get(), inp2.get()))
btn2.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)
 
# 在窗体垂直自上而下位置60%处起,布局相对窗体高度40%高的文本框
txt = Text(root)
txt.place(rely=0.6, relheight=0.4)
 
root.mainloop()

        (4)单选按钮(Radiobutton)

        排除具有共有属性外,还具有显示文本(text)、返回变量(variable)、返回值(value)、响应函数名(command)等重要属性。响应函数名“command=函数名”的用法与Button相同,函数名最后不要加括号。

        返回变量variable=var通常应预先声明变量的类型var=IntVar()或var=StringVar(),在所调用的函数中方可用var.get()方法获取被选中实例的value值。

from tkinter import *
def Mysel():
      dic = {0:'甲',1:'乙',2:'丙'}
      s = "您选了" + dic.get(var.get()) + "项"
      lb.config(text = s)
 
root = Tk()
root.title('单选按钮')
lb = Label(root)
lb.pack()
 
var = IntVar()
rd1 = Radiobutton(root,text="甲",variable=var,value=0,command=Mysel)
rd1.pack()
 
rd2 = Radiobutton(root,text="乙",variable=var,value=1,command=Mysel)
rd2.pack()
 
rd3 = Radiobutton(root,text="丙",variable=var,value=2,command=Mysel)
rd3.pack()
 
root.mainloop()

        (5)复选框:(Checkbutton)

        该控件除具有共有属性外,还具有显示文本(text)、返回变量(variable)、选中返回值(onvalue)和未选中默认返回值(offvalue)等重要属性。

        返回变量variable=var 通常可以预先逐项分别声明变量的类型var=IntVar() (默认)或 var=StringVar(), 在所调用的函数中方可分别调用 var.get()方法 取得被选中实例的 onvalue或offvalue值。


from tkinter import *
import tkinter
 
def run():
     if(CheckVar1.get()==0 and CheckVar2.get()==0 and CheckVar3.get()==0 and CheckVar4.get()==0):
         s = '您还没选择任何爱好项目'
     else:
         s1 = "足球" if CheckVar1.get()==1 else ""
         s2 = "篮球" if CheckVar2.get() == 1 else ""
         s3 = "游泳" if CheckVar3.get() == 1 else ""
         s4 = "田径" if CheckVar4.get() == 1 else ""
         s = "您选择了%s %s %s %s" % (s1,s2,s3,s4)
     lb2.config(text=s)
 
root = tkinter.Tk()
root.title('复选框')
lb1=Label(root,text='请选择您的爱好项目')
lb1.pack()
 
CheckVar1 = IntVar()
CheckVar2 = IntVar()
CheckVar3 = IntVar()
CheckVar4 = IntVar()
 
ch1 = Checkbutton(root,text='足球',variable = CheckVar1,onvalue=1,offvalue=0)
ch2 = Checkbutton(root,text='篮球',variable = CheckVar2,onvalue=1,offvalue=0)
ch3 = Checkbutton(root,text='游泳',variable = CheckVar3,onvalue=1,offvalue=0)
ch4 = Checkbutton(root,text='田径',variable = CheckVar4,onvalue=1,offvalue=0)
 
ch1.pack()
ch2.pack()
ch3.pack()
ch4.pack()
 
btn = Button(root,text="OK",command=run)
btn.pack()
 
lb2 = Label(root,text='')
lb2.pack()
root.mainloop()

        (6)列表框(Listbox)与 组合框(Combobox)

        . 列表框(Listbox)

方法 功能描述
curselection() 返回光标选中项目编号的元组,注意并不是单个的整数
delete(起始位置,终止位置) 删除项目,终止位置可省略,全部清空为delete(0,END)
get(起始位置,终止位) 返回范围所含项目文本的元组,终止位置可忽略
insert(位置,项目元素) 插入项目元素(若有多项,可用列表或元组类型赋值),若位置为END,则将项目元素添加在最后
size() 返回列表框行数

        列表框实质上就是将Python 的列表类型数据可视化呈现,在程序实现时,也可直接对相关列表数据进行操作,然后再通过列表框展示出来 。

from tkinter import *

root=Tk()
root.geometry('500x300')

def init():
        list=['数学','物理','化学','语文','外语']
        listbox.delete(0,END)
        for item in list:
                listbox.insert(END,item)
        return

def insert():
        if entry.get() != '':
                if listbox.curselection() !=():
                        id=listbox.curselection()[0]
                        listbox.insert(id,entry.get())
                else:
                        listbox.insert(END,entry.get())
        return
def change():
        if entry.get() !='':
                if listbox.curselection() != ():
                        id=listbox.curselection()[0]
                        listbox.delete(id)
                        listbox.insert(id,entry.get())
        return
def delete():
        if listbox.curselection() != ():
                listbox.delete(listbox.curselection())
        return
def clear():
        listbox.delete(0,END)
        return

if __name__=='__main__':
        root.title('列表框实验')
        fm1=Frame(root)
        fm2=Frame(root)
        fm1.place(relx=0.0)
        fm2.place(relx=0.5)
        listbox=Listbox(fm1)
        listbox.pack()
        entry=Entry(fm2)
        entry.pack()
        btn1=Button(fm2,text='初始化',command=init)
        btn2=Button(fm2,text='插入',command=insert)
        btn3=Button(fm2,text='修改',command=change)
        btn4=Button(fm2,text='删除',command=delete)
        btn5=Button(fm2,text='清空',command=clear)
        btn1.pack(fill=X)
        btn2.pack(fill=X)
        btn3.pack(fill=X)
        btn4.pack(fill=X)
        btn5.pack(fill=X)
        root.mainloop()

        . 组合框(Combobox)

        该控件并不包含在 tkinter 模块中,而是与 TreeView、Progressbar、Separator等控件一同包含在tkinter 的子模块ttk中。因此使用该控件前,应先from tkinter.ttk import *。

from tkinter import *
from tkinter.ttk import *
root=Tk()
root.geometry('500x300')

def cul(event): #注意一定要传递一个参数,将来这个参数代表实例本身
        c=cb.current()
        try:
                a=float(input1.get())
                b=float(input2.get())
        except:
                return
        dict={0:a+b,1:a-b,2:a*b,3:a/b}
        lb.configure(text=str(dict.get(c)))
        return

if __name__=='__main__':
        root.title('四则运算')
        input1=Entry(root)
        input2=Entry(root)
        input1.place(relx=0.1,rely=0.1)
        input2.place(relx=0.5,rely=0.1)
        cb=Combobox(root,values=['加','减','乘','除'])
        cb.place(relx=0.1,rely=0.5)
        cb.bind('<<ComboboxSelected>>',cul) #设置复选框被选择的相应函数
        lb=Label(root)
        lb.place(relx=0.5,rely=0.5)
        root.mainloop()

        指定变量var=StringVar(),并设置实例属性 textvariable = var,values=[列表...]。组合框控件常用方法有:获得所选中的选项值get()和获得所选中的选项索引current()。

        :定义的cur()函数必须带一个参数,名字可以任意。因为当定义<<ComboboxSelected>>事件的相应函数时,也将实例cb传入了进去。

        (7)スライダー:(スケール)

        スライダー (スケール) は、直感的な数値入力のための対話型コントロールです。その主なプロパティを以下の表に示します。

属性 機能説明
から_ 開始値 (可能な最小値)
ラベルの付いた ラベルのテキスト、デフォルトはなしです
長さ スライダー コントロール インスタンスの幅 (水平方向) または高さ (垂直方向)、デフォルトは 100 ピクセルです。
オリエント スライダー コントロール インスタンスのレンダリング方向、VERTCAL または HORIZONTAL (デフォルト)
繰り返し遅延 マウスの応答遅延、デフォルトは 300ms
解決 分解能の精度、つまり最小値の間隔
スライダーの長さ スライダーの幅、デフォルトは 30 ピクセルです
状態。state=DISABLED が設定されている場合、スライダー コントロール インスタンスは使用できません。
ティック間隔 ルーラーの間隔のデフォルトは 0 です。設定が小さすぎると、オーバーラップしてしまいます。
終了値(取り得る最大値)
変数 数値を返します。タイプは IntVar (整数)、DoubleVar (浮動小数点数)、または StringVar (文字列) です。
コントロール インスタンス自体の幅。デフォルトは 15 ピクセルです。

        スライダー コントロール インスタンスの主なメソッドは、get() や set(value) など、比較的単純です。スライダー コントロール インスタンスの主なメソッドは、get() や set(value) など、比較的単純です。

        スライダー インスタンスは、マウスの左ボタンのリリース イベント <ButtonRelease-1> にバインドすることもでき、イベント パラメーターを実行関数に追加してイベント応答を実装します。これらは単一括弧「<」、「>」であり、二重括弧「<<」、「>>」ではないことに注意してください。

from tkinter import *

root=Tk()
root.geometry('500x300')
def getval(event):
        c=var.get()
        lb.configure(text=f'滑块的取值为{c}')
        return

if __name__=='__main__':
        root.title('滑块实验')
        var=DoubleVar()
        sc=Scale(root,orient=HORIZONTAL,length=200,from_=1.0,to=5.0,label='请拖动滑块',tickinterval=1,resolution=0.05,variable=var)
        sc.pack()
        lb=Label(root,text='滑块取值为1')
        lb.pack()
        sc.bind('<ButtonRelease-1>',getval)
        root.mainloop()

        (8)メニュー

おすすめ

転載: blog.csdn.net/chatgpt001/article/details/132955612