記事のディレクトリ
tkinterモジュールによって提供される公式文書:tkinter公式ウェブサイト
または:tkinterbook(比較的定期的で、初心者が見つけるのに適しています)
演習1:tkinterモジュールを体験して、ボタンクリックイベント処理を実装します
import tkinter
import tkinter.messagebox as messagebox
Clichong = tkinter.Tk() #根窗口,主命令窗口tk
bt1 = tkinter.Button(Clichong)
bt1["text"] = "2020/11/18"
bt1.pack() #一定要添加这句,text才能正常的显示
def TouchRection(c):
messagebox.showinfo("Message","今天是2020/11/18")
bt1.bind("<Button-1>",TouchRection) #对事件进行绑定
Clichong.mainloop() #调用组件的mainloop方法,进入事件循环
Clichong = tkinter.Tk()
Clichong.geometry("500x100+100+150") # 设置窗口的位置与大小,宽度500,高度100,距离左边屏100,距离上边屏150,注意格式
演習2:コンポーネントを理解し、オブジェクト指向プログラムを作成してみます
- その他とWm:
TkinterのGUIコンポーネントには2つのルート親クラスがあり、それらはすべてオブジェクトクラスを直接継承します。
その他:これはすべてのコンポーネントのルート親クラスです。
・wm:主にウィンドウマネージャーと通信するためのいくつかの機能を提供します。 - Tk
MiscとWmは、アプリケーションのメインウィンドウを表すサブクラスTkを派生させます。一般的なアプリケーションでは、Tkを直接または間接的に使用する必要があります。 - Pack、Place、Grid
Pack、Place、Gridはレイアウトマネージャーです。レイアウトマネージャーは、サイズ、位置などのコンポーネントを管理します。コンテナ内のコンポーネントは、レイアウトマネージャを介して合理的に配置できます。
一般的に使用されるコンポーネントの要約リスト:
# 面向对象的gui程序写法
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self,master = None):
super().__init__(master)
self.master = master
# self.pack() #可加可不加,看把空间放置在哪里
self.createbutton()
def TouchRection(s):
messagebox.showinfo("Message", "今天是2020/11/18")
def createbutton(self):
"""创建按钮1"""
bt1 = Button(self.master)
bt1["text"] = "bt1"
bt1["command"] = self.TouchRection #不用加括号
# bt1.bind("<Button-1>", self.TouchRection) #上下两句的作用相同
bt1.pack()
"""创建按钮2推出主页面"""
bt2 = Button(self.master)
bt2["text"] = "Exit"
bt2["command"] = self.master.destroy #无需索引号
bt2.pack()
"""推出按钮,功能与bt2相同,但是不同写法"""
bt3 = Button(self.master, text = "Quit", command = self.master.destroy)
bt3.pack()
Clichong = Tk()
Clichong.geometry("400x100+100+150")
Clichong.title("面向对象编程")
app = Application(master=Clichong)
Clichong.mainloop()
演習3:コンポーネントラベルの使用
1.テキストを表示する
# 面向对象的gui程序写法
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self,master = None):
super().__init__(master)
self.master = master
# self.pack()
self.createlabel()
def createlabel(self):
lb1 = Label(self.master)
lb1["text"] = "My name is Clichong!"
lb1.pack()
Clichong = Tk()
Clichong.geometry("400x100+100+150")
Clichong.title("Label的使用")
app = Application(master=Clichong)
Clichong.mainloop()
2.ラベルテキストフォーマット操作
lb2 = Label(self.master)
lb2["text"] = "2:My name is Clichong!" # 设置文本
lb2["fg"] = "red" # 设置字体颜色
lb2["bg"] = "blue" # 设置背景颜色
lb2["font"] = "黑体", 15 # 设置字体与大小
lb2["width"] = 30 # 设置label的宽度
lb2["height"] = 1 # 设置label的高度
lb2.pack()
# 也可以一句设置多个信息
# lb3 = Label(self.master,text = "3:My name is Clichong!", width = 30, height = 1,fg = "red", bg = "yellow",font=("黑体", 15)) # 太长,不美观
lb3 = Label(self.master,\
text = "3:My name is Clichong!",\
width = 30,\
height = 1,\
fg = "red",\
bg = "yellow",\
font = ("黑体",15)\
)
lb3.pack()
3.画像を表示します
# 显示图像
global photo # 把 photo 声明成全局变量。如果是局部变量,本方法执行完毕后,图像对象销毁,窗口显示不出图像。
photo = PhotoImage(file = "photo/pngphoto/小黄人.png")
lb4 = Label(self.master)
lb4["image"] = photo
lb4.pack()
4.ラベルの複数行のテキスト形式の操作
# 多行文本
lb5 = Label(self.master)
lb5["text"] = "Lawrence\nClichong\nSakura\n"
lb5["borderwidth"] = 6 # 设置边框长度
lb5["relief"] = "groove" # 设置边框效果
lb5["justify"] = "left" # 设置文本的对齐格式
lb5.pack()
完成したテストコード:
# 面向对象的gui程序写法
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self,master = None):
super().__init__(master)
self.master = master
# self.pack()
self.createlabel()
def createlabel(self):
lb1 = Label(self.master)
lb1["text"] = "1:My name is Clichong!"
lb1.pack()
lb2 = Label(self.master)
lb2["text"] = "2:My name is Clichong!" # 设置文本
lb2["fg"] = "red" # 设置字体颜色
lb2["bg"] = "blue" # 设置背景颜色
lb2["font"] = "黑体", 15 # 设置字体与大小
lb2["width"] = 30 #设置label的宽度
lb2["height"] = 1 #设置label的高度
lb2.pack()
# 也可以一句设置多个信息
lb3 = Label(self.master,\
text = "3:My name is Clichong!",\
width = 30,\
height = 1,\
fg = "red",\
bg = "yellow",\
font = ("黑体",15)\
)
lb3.pack()
# 显示图像
global photo # 把 photo 声明成全局变量。如果是局部变量,本方法执行完毕后,图像对象销毁,窗口显示不出图像。
photo = PhotoImage(file = "photo/pngphoto/小黄人.png")
lb4 = Label(self.master)
lb4["image"] = photo
lb4.pack()
# 多行文本
lb5 = Label(self.master)
lb5["text"] = "Lawrence\nClichong\nSakura\n"
lb5["borderwidth"] = 6 # 设置边框长度
lb5["relief"] = "groove" # 设置边框效果
lb5["justify"] = "left" # 设置文本的对齐格式
lb5.pack()
Clichong = Tk()
Clichong.geometry("400x400+100+150")
Clichong.title("Label的使用")
app = Application(master=Clichong)
Clichong.mainloop()
最終的なレンダリング:
5.オプション詳細説明
オプションオプションを設定する方法は3つあり、さまざまなGUIコンポーネントで一貫して使用できます。
- オブジェクトを作成するときは、可変パラメーターを使用します
fred = Button(self, fg="red", bg="blue")
- オブジェクトを作成した後、ディクショナリインデックスメソッドを使用します
fred["fg"] = "red"
fred["bg"] = "blue"
- オブジェクトを作成した後、config()メソッドを使用します
fred.config(fg="red", bg="blue")
コンポーネントのオプションオプションを表示する方法:
- config()メソッドの戻り値を出力することにより、オプションオプション
print(fred.config())を確認できます。 - IDEでコンポーネントオブジェクトの構築メソッドをクリックして、監視するメソッドを入力し
ます。次のコードが表示されます。
上記のコードには、「標準オプション標準オプション」と「ウィジェット固有オプションコンポーネント固有オプション」があります。
一般的なオプションを次のように要約します。
演習5:ボタンの使用
フォーマット設定方法は実際にはラベルに似ています、あなたはそれをここでチェックすることができます:
# 面向对象的gui程序写法
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self,master = None):
super().__init__(master)
self.master = master
# self.pack()
self.createlabel()
def MyLoginEnter(s):
messagebox.showinfo("登录界面", "hello world")
def createlabel(self):
global photo # 把 photo 声明成全局变量。如果是局部变量,本方法执行完毕后,图像对象销毁,窗口显示不出图像。
photo = PhotoImage(file = "photo/pngphoto/小黄人.png")
bt1 = Button(self.master)
bt1["image"] = photo
bt1.pack()
bt2 = Button(self.master,text = "Enter",width = 20,height = 10,font = ("宋体",10,))
bt2["anchor"] = "nw" #设置位置
bt2["command"] = self.MyLoginEnter # 不需要添加括号
bt2.pack()
Clichong = Tk()
Clichong.geometry("400x400+100+150")
Clichong.title("Label的使用")
app = Application(master=Clichong)
Clichong.mainloop()
演習6:シンプルなログインインターフェイスを実現するための1行のテキストボックスの入力
# 面向对象的gui程序写法
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self,master = None):
super().__init__(master)
self.master = master
self.pack()
self.createlabel()
self.entername = "Clichong"
self.entercode = "123456"
def MyLoginEnter(self):
if self.et1.get() == self.entername and self.et2.get() == self.entercode:
messagebox.showinfo("登录成功", "主人欢迎回来~~~")
else:
messagebox.showerror("登录失败","客人你来错地方了~~~")
def createlabel(self):
lb1 = Label(self.master,text = "登录",font = 20)
lb1.pack()
et1 = Entry(self.master,width = 20)
et1.pack()
lb2 = Label(self.master, text="密码", font=20)
lb2.pack()
et2 = Entry(self.master, width=20)
et2.pack()
bt1 = Button(self.master, text = "Enter",width = 15)
bt1["command"] = self.MyLoginEnter
bt1.pack()
self.et1 = et1
self.et2 = et2
Clichong = Tk()
Clichong.geometry("200x150+100+150")
Clichong.title("Label的使用")
app = Application(master=Clichong)
Clichong.mainloop()
テスト:
パスワードが正しく入力されています:パスワードが正しく
入力されていません:
入力時に改善し、保護します。
et1 = Entry(self.master,width = 20,show = "*")
et1.pack()
et2 = Entry(self.master, width=20,show = "*")
et2.pack()
演習7:テキストの複数行のテキストボックスの使用
テキスト(複数行のテキストボックス)は、主に複数行のテキストを表示するために使用されます。また、Webリンク、画像、HTMLページ、さらにはCSSスタイルシートを表示したり、コンポーネントを追加したりすることもできます。そのため、単純なテキストプロセッサ、テキストエディタ、またはWebブラウザとしてよく使用されます。たとえば、IDLEはテキストコンポーネントで構成されています。
1.テキストボックスの内容の入力と取得
# 面向对象的gui程序写法
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self,master = None):
super().__init__(master)
self.master = master
self.pack()
self.createlabel()
def createlabel(self):
tx1 = Text(self.master,width = 40, height = 12)
tx1["bg"] = "pink"
tx1.pack()
tx1.insert(1.0,"My name is Clichong!")
tx1.insert(2.0, "Your name is Lawrence!") # 此时还没2.0,所以自动的在末尾添加
tx1.insert(3.0,"Today is 2020/11/19")
self.tx1 = tx1
bt1 = Button(self,text = "重复插入文本", command = self.Textfunction1)
bt1.pack(side = "left")
def Textfunction1(self):
self.tx1.insert(3.2, "Clichong") # 若没有第三行,则在末尾添加Clichong
self.tx1.insert(INSERT, "Putty") # 在指定的光标处添加putty信息
print(self.tx1.get(1.0, 1.6)) # 打印第一行的全部数据
print("所有在文本内容为:"+self.tx1.get(1.0,END)) # 打印全部的文本内容
def Textfunction2(self):
print("a")
Clichong = Tk()
Clichong.geometry("400x300+100+150")
Clichong.title("Text的使用")
app = Application(master=Clichong)
Clichong.mainloop()
コードテスト:
2.テキストボックスに画像を挿入します
bt2 = Button(self,text = "插入图片", command = self.Textfunction2)
bt2.pack(side = "left")
def Textfunction2(self):
global photo # 不可缺少,否则无法显示
photo = PhotoImage(file = "photo/pngphoto/小黄人.png")
self.tx1.image_create(END,image = photo)
3.テキストボックスにボタンを挿入します
bt3 = Button(self, text="插入按钮", command=self.Textfunction3)
bt3.pack(side="left")
def Textfunction3(self):
textbt1 = Button(self.tx1,text = "textbt1") #按钮显示在文本框内
self.tx1.window_create(END,window = textbt1)
4.テキストボックスはロゴにスタイルを追加します
bt4 = Button(self, text="插入标志", command=self.Textfunction4)
bt4.pack(side="left")
def Textfunction4(self):
self.tx1.delete(1.0,END)
self.tx1.insert(INSERT, "good good study day day up!\n百度,搜一下就知道\n")
self.tx1.tag_add("flag1",1.10, 1.15) # 增加一个标记,名字为flag1,范围是1.0-1.5
self.tx1.tag_add("flag2", 2.0, 2.5) # 再增加一个标记,名字为flag2,范围是2.0-2.5
self.tx1.tag_config("flag2", background= "yellow", foreground="red",underline=True) #设置背景颜色与字体颜色
self.tx1.tag_config("flag1", background="blue", foreground="red")
5.テキストボックスのロゴにハイパーリンクを追加します
bt5 = Button(self, text="插入链接", command=self.Textfunction5)
bt5.pack(side="left")
def Textfunction5(self):
self.tx1.delete(1.0, END)
self.tx1.insert(END,"taobao.com\nbaidu.com\n")
self.tx1.tag_add("flag1", 2.0,2.9) #添加标志
self.tx1.tag_config("flag1", underline=True) # 添加下划线
self.tx1.tag_bind("flag1","<Button-1>",self.for_Textfunction5) # 为标记作一个链接调转的绑定
def for_Textfunction5(self,event):
webbrowser.open("http://www.baidu.com")
baidu.comをクリックすると、通常どおりBaidu検索ページを開くことができます
。完全なコードは次のとおりです。
# 面向对象的gui程序写法
from tkinter import *
from tkinter import messagebox
import webbrowser
class Application(Frame):
def __init__(self,master = None):
super().__init__(master)
self.master = master
self.pack()
self.createlabel()
def createlabel(self):
tx1 = Text(self.master,width = 40, height = 12)
tx1["bg"] = "pink"
tx1.pack()
tx1.insert(1.0,"My name is Clichong!")
tx1.insert(2.0, "Your name is Lawrence!") # 此时还没2.0,所以自动的在末尾添加
tx1.insert(3.0,"Today is 2020/11/19")
self.tx1 = tx1
bt1 = Button(self,text = "插入文字", command = self.Textfunction1)
bt1.pack(side = "left")
bt2 = Button(self,text = "插入图片", command = self.Textfunction2)
bt2.pack(side = "left")
bt3 = Button(self, text="插入按钮", command=self.Textfunction3)
bt3.pack(side="left")
bt4 = Button(self, text="插入标志", command=self.Textfunction4)
bt4.pack(side="left")
bt5 = Button(self, text="插入链接", command=self.Textfunction5)
bt5.pack(side="left")
def Textfunction1(self):
self.tx1.insert(3.2, "Clichong") # 若没有第三行,则在末尾添加Clichong
self.tx1.insert(INSERT, "Putty") # 在指定的光标处添加putty信息
print(self.tx1.get(1.0, 1.6)) # 打印第一行的全部数据
print("所有在文本内容为:"+self.tx1.get(1.0,END)) # 打印全部的文本内容
def Textfunction2(self):
global photo # 不可缺少,否则无法显示
photo = PhotoImage(file = "photo/pngphoto/小黄人.png")
self.tx1.image_create(END,image = photo) #文本框中插入图片
def Textfunction3(self):
textbt1 = Button(self.tx1,text = "textbt1") # 按钮显示在文本框内
self.tx1.window_create(END,window = textbt1)
def Textfunction4(self):
self.tx1.delete(1.0,END)
self.tx1.insert(INSERT, "good good study day day up!\n百度,搜一下就知道\n")
self.tx1.tag_add("flag1",1.10, 1.15) # 增加一个标记,名字为flag1,范围是1.0-1.5
self.tx1.tag_add("flag2", 2.0, 2.5) # 再增加一个标记,名字为flag2,范围是2.0-2.5
self.tx1.tag_config("flag2", background= "yellow", foreground="red",underline=True) #设置背景颜色与字体颜色
self.tx1.tag_config("flag1", background="blue", foreground="red")
def Textfunction5(self):
self.tx1.delete(1.0, END)
self.tx1.insert(END,"taobao.com\nbaidu.com\n")
self.tx1.tag_add("flag1", 2.0,2.9)
self.tx1.tag_config("flag1", underline=True)
self.tx1.tag_bind("flag1","<Button-1>",self.for_Textfunction5)
def for_Textfunction5(self,event):
webbrowser.open("http://www.baidu.com")
Clichong = Tk()
Clichong.geometry("400x300+100+150")
Clichong.title("Text的使用")
app = Application(master=Clichong)
Clichong.mainloop()
演習8:ラジオボタンラジオボタンとチェックボタンチェックボタン
# 面向对象的gui程序写法
from tkinter import *
from tkinter import messagebox
import webbrowser
class Application(Frame):
def __init__(self,master = None):
super().__init__(master)
self.master = master
self.pack()
self.createlabel1()
# self.createlabel2()
def createlabel1(self):
self.var = StringVar()
self.var.set(" ") # 初始化为未选择状态
rbt1 = Radiobutton(self,text = "蔬菜面",value = "answer1", width = 6, height = 2, variable = self.var)
rbt2 = Radiobutton(self, text="牛腩面", value="answer2", width = 6, height = 2,variable=self.var)
rbt3 = Radiobutton(self, text="豚骨拉面", value="answer3",width = 6, height = 2, variable=self.var)
rbt1.pack(side = "left") # 编成一行
rbt2.pack(side = "left")
rbt3.pack(side = "left")
def createlabel2(self):
self.choose1 = StringVar();self.choose1.set(" "); # 初始化为未选择状态
self.choose2 = StringVar();self.choose2.set(" ");
self.choose3 = StringVar();self.choose3.set(" ");
cbt1 = Checkbutton(self, text = "蒸饺", width = 6, height = 2, variable = self.choose1,onvalue=1, offvalue=0)
cbt2 = Checkbutton(self, text="煎饺", width=6, height=2, variable=self.choose2,onvalue=1, offvalue=0)
cbt3 = Checkbutton(self, text="汤饺", width=6, height=2, variable=self.choose3,onvalue=1, offvalue=0)
cbt1.pack(side = "left")
cbt2.pack(side = "left")
cbt3.pack(side = "left")
Clichong = Tk()
Clichong.geometry("400x300+100+150")
Clichong.title("Text的使用")
app = Application(master=Clichong)
Clichong.mainloop()