この記事では、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)メニュー