午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

【Python】GUI編程(Tkinter)教程

 袁先森lemon 2022-08-05 發(fā)布于山東

什么是Tkinter?

Tkinter 是 Python 的標(biāo)準(zhǔn) GUI 庫(kù)。Python 使用 Tkinter 可以快速的創(chuàng)建 GUI 應(yīng)用程序。

由于 Tkinter 是內(nèi)置到 python 的安裝包中、只要安裝好 Python 之后就能 import Tkinter 庫(kù)、而且 IDLE 也是用 Tkinter 編寫而成、對(duì)于簡(jiǎn)單的圖形界面 Tkinter 還是能應(yīng)付自如。

使用

導(dǎo)入

import tkinter

注意:Python3.x 版本使用的庫(kù)名為 tkinter,即首寫字母 T 為小寫。

創(chuàng)建一個(gè)GUI程序

  • 1、導(dǎo)入 Tkinter 模塊

  • 2、創(chuàng)建控件

  • 3、指定這個(gè)控件的 master, 即這個(gè)控件屬于哪一個(gè)

  • 4、告訴 GM(geometry manager) 有一個(gè)控件產(chǎn)生了。

#!/usr/bin/python3import tkintertop = tkinter.Tk()# 進(jìn)入消息循環(huán)top.mainloop()

窗口主體框架 

每一個(gè) tkinter 應(yīng)用的主體框架都可以包含下面這部分. 定義 window窗口 和 window的一些屬性, 然后書寫窗口內(nèi)容, 最后執(zhí)行window.mainloop讓窗口活起來(lái).

import tkinter as tkwindow = tk.Tk()window.title('my window')window.geometry('500x500')#注意:這里的乘是×不是*# 這里是窗口的內(nèi)容window.mainloop()

窗口內(nèi)容

Label & Button 標(biāo)簽和按鈕

這次我們會(huì)建立一個(gè)用來(lái)描述的標(biāo)簽 tk.Label, 比如:

import tkinter as tk#創(chuàng)建窗口window=tk.Tk()window.title('Mywindow')#窗口的標(biāo)題window.geometry('200x100')#窗口的大小#定義一個(gè)labell = tk.Label(window,text='Hi! this is TK!',    # 標(biāo)簽的文字bg='green',     # 標(biāo)簽背景顏色font=('Arial', 12),     # 字體和字體大小width=15, height=2  # 標(biāo)簽長(zhǎng)寬(以字符長(zhǎng)度計(jì)算))l.pack()    # 固定窗口位置window.mainloop()

關(guān)于Label的更多內(nèi)容可以看這里https://www.runoob.com/python/python-tk-label.html

我們也可以通過(guò)變量的形式控制標(biāo)簽的顯示, 這時(shí)我們引入按鈕 tk.Button的概念, 沒點(diǎn)一次按鈕, 標(biāo)簽變化一次. 用一下內(nèi)容替換上面的標(biāo)簽. 并把需要變化的文字存成變量 var:

var = tk.StringVar()    # 這時(shí)文字變量?jī)?chǔ)存器l = tk.Label(window,textvariable=var,   # 使用 textvariable 替換 text, 因?yàn)檫@個(gè)可以變化bg='green', font=('Arial', 12), width=15, height=2)l.pack()

接著我們來(lái)做 按鈕 tk.Button:

b = tk.Button(window,text='hit me',      # 顯示在按鈕上的文字width=15, height=2,command=hit_me)     # 點(diǎn)擊按鈕式執(zhí)行的命令b.pack()    # 按鈕位置

那么點(diǎn)擊是的命令我們用 ifelse語(yǔ)句來(lái)判斷. 用 on_hit來(lái)判斷當(dāng)前狀態(tài).

on_hit = False  # 默認(rèn)初始狀態(tài)為 Falsedef hit_me():global on_hitif on_hit == False:     # 從 False 狀態(tài)變成 True 狀態(tài)on_hit = Truevar.set('you hit me')   # 設(shè)置標(biāo)簽的文字為 'you hit me'else:       # 從 True 狀態(tài)變成 False 狀態(tài)on_hit = Falsevar.set('') # 設(shè)置 文字為空

完整代碼:

import tkinter as tk#創(chuàng)建窗口window=tk.Tk()window.title('Mywindow')#窗口的標(biāo)題window.geometry('200x100')#窗口的大小#定義一個(gè)labelvar=tk.StringVar()#定義一個(gè)字符串變量l = tk.Label(window,textvariable=var,    # 標(biāo)簽的文字bg='green',     # 標(biāo)簽背景顏色font=('Arial', 12),     # 字體和字體大小width=15, height=2  # 標(biāo)簽長(zhǎng)寬)l.pack()    # 固定窗口位置#定義一個(gè)全局變量,來(lái)表明字符顯示與不顯示on_hit=False#按鈕的函數(shù)def hit_me():global on_hit#聲明全局變量if on_hit==False:on_hit=Truevar.set('You hit me!')else:on_hit=Falsevar.set('')#按鈕b=tk.Button(window,text='點(diǎn)我',width=15,height=2,command=hit_me)#點(diǎn)擊按鈕執(zhí)行一個(gè)名為“hit_me”的函數(shù)b.pack()window.mainloop()

沒有點(diǎn)擊時(shí):

Label & Button 標(biāo)簽和按鈕

點(diǎn)擊第一次:

Label & Button 標(biāo)簽和按鈕

點(diǎn)擊第二次:

Label & Button 標(biāo)簽和按鈕

Entry & Text 輸入, 文本框

窗口主體框架 

每一個(gè)tkinter應(yīng)用的主體框架都包含以下幾部分:

  • 主窗口: window,及主窗口的一些基本屬性(標(biāo)題、大小)

  • 讓窗口活起來(lái):window.mainloop()

import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')##顯示出來(lái)window.mainloop()

窗口內(nèi)容(窗口上的控件)

創(chuàng)建按鈕分別觸發(fā)兩種情況

b1 = tk.Button(window,text="insert point",width=15,height=2,command=insert_point)b1.pack()b2 = tk.Button(window,text="insert end",command=insert_end)b2.pack()

創(chuàng)建輸入框entry,用戶輸入任何內(nèi)容都顯示為*

e = tk.Entry(window,show='*')e.pack()

創(chuàng)建一個(gè)文本框用于顯示

t = tk.Text(window,height=2)t.pack()

定義觸發(fā)事件時(shí)的函數(shù)(注意:因?yàn)镻ython的執(zhí)行順序是從上往下,所以函數(shù)一定要放在按鈕的上面)

def insert_point():var = e.get()t.insert('insert',var)def insert_end():var = e.get()t.insert('end',var)

完整代碼:

import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#定義一個(gè)輸入框entrye=tk.Entry(window,show=None)#如果是輸入密碼,可以寫show='*'e.pack()#定義按鈕功能def insert_point():var=e.get()t.insert('insert',var)def insert_end():var=e.get()t.insert('end',var)#這里還可以定義字符串插入的具體位置,比如t.insert('1.1',var),表示插入到第一行第一列
#定義2個(gè)按鈕 Button b1 = tk.Button(window,text="insert point",width=15,height=2,command=insert_point) b1.pack() b2 = tk.Button(window,text="insert end",command=insert_end) b2.pack() #定義一個(gè)文本框 Text t=tk.Text(window,height=2) t.pack() ##顯示出來(lái) window.mainloop()

窗口界面

測(cè)試一下 

第一次:在entry中輸入tkinter,在text中輸入0000并將光標(biāo)定位在中間位置,點(diǎn)擊insert point

Entry & Text 輸入, 文本框

第二次:點(diǎn)擊insert end

Entry & Text 輸入, 文本框

Listbox 列表部件

創(chuàng)建主窗口

import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')##顯示出來(lái)window.mainloop()

創(chuàng)建一個(gè)label用于顯示 

var1 = tk.StringVar()    #創(chuàng)建變量l =tk.Label(window,bg='yellow',width=4,textvariable=var1)l.pack()

創(chuàng)建一個(gè)方法用于按鈕的點(diǎn)擊事件

def print_selection():value = lb.get(lb.curselection())   #獲取當(dāng)前選中的文本var1.set(value)     #為label設(shè)置值

創(chuàng)建一個(gè)按鈕

b1 = tk.Button(window, text='print selection', width=15,height=2, command=print_selection)b1.pack()

創(chuàng)建一個(gè)Listbox和變量var2,并將var2的值賦給Listbox

var2 = tk.StringVar()var2.set((11,22,33,44)) #為變量設(shè)置值#創(chuàng)建Listboxlb = tk.Listbox(window, listvariable=var2)  #將var2的值賦給Listbox#創(chuàng)建一個(gè)list并將值循環(huán)添加到Listbox控件中l(wèi)ist_items = [1,2,3,4]for item in list_items:lb.insert('end', item)  #從最后一個(gè)位置開始加入值lb.insert(1, 'first')       #在第一個(gè)位置加入'first'字符lb.insert(2, 'second')      #在第二個(gè)位置加入'second'字符lb.delete(2)                #刪除第二個(gè)位置的字符lb.pack()

完整代碼:

import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#創(chuàng)建一個(gè)lablevar1 = tk.StringVar()    #創(chuàng)建變量l =tk.Label(window,bg='yellow',width=4,textvariable=var1)l.pack()#按鈕事件def print_selection():value = lb.get(lb.curselection())   #獲取當(dāng)前選中的文本var1.set(value)     #為label設(shè)置值#創(chuàng)建一個(gè)按鈕b1 = tk.Button(window, text='print selection', width=15,height=2, command=print_selection)b1.pack()#創(chuàng)建一個(gè)Listbox和變量var2,并將var2的值賦給Listboxvar2 = tk.StringVar()var2.set((11,22,33,44)) #為變量設(shè)置值#創(chuàng)建Listboxlb = tk.Listbox(window, listvariable=var2)  #將var2的值賦給Listbox#創(chuàng)建一個(gè)list并將值循環(huán)添加到Listbox控件中l(wèi)ist_items = [1,2,3,4]#定義列表for item in list_items:lb.insert('end', item)  #從最后一個(gè)位置開始加入值lb.insert(1, 'first')       #在第一個(gè)位置加入'first'字符lb.insert(2, 'second')      #在第二個(gè)位置加入'second'字符lb.delete(2)                #刪除第二個(gè)位置的字符lb.pack()##顯示出來(lái)window.mainloop()

演示

Radiobutton 選擇按鈕

這一次的效果將會(huì)像下面的圖片一樣.

Radiobutton 選擇按鈕

如果選擇了某個(gè)選項(xiàng), 效果就會(huì)如下.

Radiobutton 選擇按鈕

radiobutton 部件

首先我們需要定義一個(gè) var用來(lái)將 radiobutton 的值和 Label 的值聯(lián)系在一起. 然后創(chuàng)建一個(gè)radiobutton部分:

var = tk.StringVar()l = tk.Label(window, bg='yellow', width=20, text='empty')l.pack()r1 = tk.Radiobutton(window, text='Option A',variable=var, value='A',command=print_selection)r1.pack()

其中variable=varvalue='A'的意思就是,當(dāng)我們鼠標(biāo)選中了其中一個(gè)選項(xiàng),把value的值A放到變量var中,然后賦值給variable

觸發(fā)功能

我們將定義一個(gè)功能, 用來(lái)對(duì)選擇的 radiobutton 進(jìn)行操作. print_selection功能就是選擇了某個(gè) radiobutton 后我們會(huì)在屏幕上打印的選項(xiàng).

def print_selection():l.config(text='you have selected ' + var.get())

當(dāng)觸發(fā)這個(gè)函數(shù)功能時(shí),我們的 label中就會(huì)顯示 text所賦值的字符串即 'you have selected’, 后面則是我們所選中的選項(xiàng) var.get()就是獲取到變量 var的值, 舉個(gè)例子就是我們一開始所做的將選項(xiàng) “option A” 選中時(shí)的值以 “A” 放入 var中, 所以獲取的也就是A 即如果我們這時(shí)候選中 “option A” 選項(xiàng),label顯示的值則是 “you have selected A”.

完整代碼:

import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#創(chuàng)建一個(gè)lablevar= tk.StringVar()    #創(chuàng)建變量l =tk.Label(window,bg='yellow',width=20,height=2,text='empty')l.pack()#實(shí)現(xiàn)將選擇的選項(xiàng)顯示在labledef print_selection():l.config(text='you have selected'+var.get())#創(chuàng)建幾個(gè)Radiobuttonr1 = tk.Radiobutton(window, text='Option A',variable=var, value='A',command=print_selection)r1.pack()r2 = tk.Radiobutton(window, text='Option B',variable=var, value='B',command=print_selection)r2.pack()r3 = tk.Radiobutton(window, text='Option C',variable=var, value='C',command=print_selection)r3.pack()##顯示出來(lái)window.mainloop()

演示:

Scale 尺度

這一次的效果將會(huì)像下面的圖片一樣.

Scale 尺度

如果拖動(dòng)滾動(dòng)條, 效果就會(huì)如下.

Scale 尺度
Scale 尺度

scale 部件

s = tk.Scale(window, label='try me', from_=5, to=11, orient=tk.HORIZONTAL,length=200, showvalue=0, tickinterval=2, resolution=0.01, command=print_selection)s.pack()

這里的參數(shù)label是指scale部件的名稱,即在這里scale部件名稱為try me

  • 參數(shù)from_=5,to=11的意思就是從5到11,即這個(gè)滾動(dòng)條最小值為5,最大值為11(這里使用from_是因?yàn)樵趐ython中有from這個(gè)關(guān)鍵詞)

  • 參數(shù)orient=tk.HORIZONTAL在這里就是設(shè)置滾動(dòng)條的方向,如我們所看到的效果圖,這里HORIZONTAL就是橫向。

  • 參數(shù)length這里是指滾動(dòng)條部件的長(zhǎng)度,但注意的是和其他部件width表示不同,width表示的是以字符為單位,比如width=4,就是4個(gè)字符的長(zhǎng)度,而此處的length=200,是指我們常用的像素為單位,即長(zhǎng)度為200個(gè)像素

  • 參數(shù)resolution=0.01這里我們可以借助數(shù)學(xué)題來(lái)理解,我們做的很多數(shù)學(xué)題都會(huì)讓我們來(lái)保留幾位小數(shù),此處的0.01就是保留2位小數(shù),即效果圖中的5.00 9.00等等后面的兩位小數(shù),如果保留一位就是resolution=0.1這里的showvalue就是設(shè)置在滾動(dòng)條上方的顯示。showvalue=0顯示的就是效果圖,上方無(wú)結(jié)果顯示,如果改為showvalue=1,則會(huì)顯示為:

Scale 尺度

參數(shù)tickinterval設(shè)置的就是坐標(biāo)的間隔,此處為tickinterval=2,顯示的即為效果圖中的5.00 7.00 9.00 11.00 如果改為tickinterval=3則為5.00 8.00 11.00:

Scale 尺度

觸發(fā)功能 

l = tk.Label(window, bg='yellow', width=20, text='empty')l.pack()def print_selection(v):l.config(text='you have selected ' + v)

這里相比前面多了參數(shù)v,這里的參數(shù)v即將滾動(dòng)條定位的數(shù)據(jù),即如效果圖中最開始,定位到5.00,label中顯示you have selected 5.00

完整代碼:

import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#創(chuàng)建一個(gè)labell =tk.Label(window,bg='yellow',width=20,height=2,text='empty')l.pack()#實(shí)現(xiàn)將選擇的選項(xiàng)顯示在labledef print_selection(v):l.config(text='you have selected'+v)#創(chuàng)建一個(gè)Scales=tk.Scale(window,label='Try me',from_=5,to=11,orient=tk.HORIZONTAL,length=200,showvalue=1,tickinterval=3,resolution=0.01,command=print_selection)s.pack()##顯示出來(lái)window.mainloop()

Checkbutton 勾選項(xiàng)

運(yùn)行之后的效果將會(huì)像下面的圖片一樣,此時(shí)不作任何操作.

Checkbutton 勾選項(xiàng)

如果只選中第一個(gè)選項(xiàng),即圖中的python, 效果就會(huì)如下.

Checkbutton 勾選項(xiàng)

如果只選中第二個(gè)選項(xiàng),即圖中的c++, 效果就會(huì)如下.

Checkbutton 勾選項(xiàng)

如果兩個(gè)選項(xiàng)都選中, 效果就會(huì)如下.

Checkbutton 勾選項(xiàng)

如果兩個(gè)選項(xiàng)都不選中, 效果就會(huì)如下.

Checkbutton 勾選項(xiàng)

Checkbutton部件

var1 = tk.IntVar()c1 = tk.Checkbutton(window, text='Python', variable=var1, onvalue=1, offvalue=0,command=print_selection)c1.pack()

參數(shù)onvalue和前面講的部件radiobutton中的value相似, 當(dāng)我們選中了這個(gè)checkbutton,onvalue的值1就會(huì)放入到var1中, 然后var1將其賦值給參數(shù)variableoffvalue用法相似,但是offvalue是在沒有選中這個(gè)checkbutton時(shí),offvalue的值1放入var1,然后賦值給參數(shù)variable這是創(chuàng)建一個(gè)checkbutton部件,以此類推,可以創(chuàng)建多個(gè)checkbutton

觸發(fā)功能

def print_selection():if (var1.get() == 1) & (var2.get() == 0):   #如果選中第一個(gè)選項(xiàng),未選中第二個(gè)選項(xiàng)l.config(text='I love only Python ')elif (var1.get() == 0) & (var2.get() == 1): #如果選中第二個(gè)選項(xiàng),未選中第一個(gè)選項(xiàng)l.config(text='I love only C++')elif (var1.get() == 0) & (var2.get() == 0):  #如果兩個(gè)選項(xiàng)都未選中l(wèi).config(text='I do not love either')else:l.config(text='I love both')             #如果兩個(gè)選項(xiàng)都選中

相對(duì)于前面學(xué)過(guò)的 print_selection,這一段比較長(zhǎng),其實(shí)功能差不多,只不過(guò)加了if...elif...else來(lái)選擇控制而已即如代碼注釋,config在前面已經(jīng)講過(guò)就是將參數(shù)text的值顯示,這里的var1.get() == 1就是前面所說(shuō)的var1獲得的變量onvalue=1,var1.get() == 0即是var1獲得的變量offvalu=0同理var2也是如此。

完整代碼:

import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#創(chuàng)建一個(gè)lablel =tk.Label(window,bg='yellow',width=20,height=2,text='empty')l.pack()#實(shí)現(xiàn)將選擇的選項(xiàng)顯示在labledef print_selection():if (var1.get() == 1) & (var2.get() == 0):   #如果選中第一個(gè)選項(xiàng),未選中第二個(gè)選項(xiàng)l.config(text='I love only Python ')elif (var1.get() == 0) & (var2.get() == 1): #如果選中第二個(gè)選項(xiàng),未選中第一個(gè)選項(xiàng)l.config(text='I love only C++')elif (var1.get() == 0) & (var2.get() == 0):  #如果兩個(gè)選項(xiàng)都未選中l(wèi).config(text='I do not love anything')else:l.config(text='I love both')             #如果兩個(gè)選項(xiàng)都選中var1=tk.IntVar()var2=tk.IntVar()#創(chuàng)建2個(gè)cheakButtoncl=tk.Checkbutton(window,text='Python',variable=var1,onvalue=1,offvalue=0,command=print_selection)cl.pack()c2=tk.Checkbutton(window,text='C++',variable=var2,onvalue=1,offvalue=0,command=print_selection)c2.pack()##顯示出來(lái)window.mainloop()

演示:

Canvas 畫布

運(yùn)行之后的效果將會(huì)像下面的圖片一樣.

Canvas 畫布

如果點(diǎn)擊move這個(gè)button, 效果就會(huì)如下.

Canvas 畫布

Canvas部件

canvas = tk.Canvas(window, bg='blue', height=100, width=200)canvas.pack()

這里的參數(shù)和以往學(xué)過(guò)的部件一樣,所以就不再一一解釋。 如果你想下載那個(gè) instagram 的圖標(biāo), 可以點(diǎn)擊這里下載, 或者直接右鍵保存下面的圖像.

Canvas 畫布
image_file = tk.PhotoImage(file='ins.gif')image = canvas.create_image(10, 10, anchor='nw', image=image_file)

這里的代碼主要是實(shí)現(xiàn)我們最終看到的在左上角的那張小圖片。 image_file = tk.PhotoImage(file='ins.gif')這一句是創(chuàng)造一個(gè)變量存放ins.gif這張圖片。 image = canvas.create_image(10, 10, anchor='nw', image=image_file)里面的參數(shù)10,10就是圖片放入畫布的坐標(biāo), 而這里的anchor=nw則是把圖片的左上角作為錨定點(diǎn),在加上剛剛給的坐標(biāo)位置,即可將圖片位置確定。 最后一個(gè)參數(shù)的意思大家應(yīng)該都知道,就是將剛剛存入的圖片變量,賦值給image

x0, y0, x1, y1= 50, 50, 80, 80line = canvas.create_line(x0, y0, x1, y1)

這段代碼主要實(shí)現(xiàn)的是畫一條直線,后面()中給的參數(shù)就是線段兩點(diǎn)的坐標(biāo),兩點(diǎn)確定一條直線。此處給的就是從坐標(biāo)(50,50)到(80,80)畫一條直線。

oval = canvas.create_oval(x0, y0, x1, y1, fill='red')  #創(chuàng)建一個(gè)圓,填充色為`red`紅色arc = canvas.create_arc(x0+30, y0+30, x1+30, y1+30, start=0, extent=180)  #創(chuàng)建一個(gè)扇形rect = canvas.create_rectangle(100, 30, 100+20, 30+20)   #創(chuàng)建一個(gè)矩形

這里面就是創(chuàng)建扇形時(shí)多了兩個(gè)沒見過(guò)的參數(shù)start=0extent=180,其實(shí)就是從0度到180度,就好像扇子的邊打開一樣。在我們看來(lái)就是個(gè)半圓, 如果改為extent=90,我們看到的就是一個(gè)1/4圓

觸發(fā)功能 

def moveit():canvas.move(rect, 0, 2)

這里的觸發(fā)不再是以往的print_selection了,哈哈,那么這里的是怎么樣的功能呢,首先我們從單詞理解來(lái)看就是移動(dòng)的函數(shù),在視頻中也演示過(guò)了, 就是我們每點(diǎn)一次button矩形就會(huì)移動(dòng)這里canvas.move(rect, 0, 2)的參數(shù)(rect,0,2)就是移動(dòng)rect這個(gè)變量,即我們看到的矩形 后面的0和2,也就是橫坐標(biāo)移動(dòng)0個(gè)單位,縱坐標(biāo)移動(dòng)2個(gè)單位,簡(jiǎn)單的說(shuō)就是每次點(diǎn)擊,橫向不動(dòng),縱向移動(dòng)兩個(gè)單位。

完整代碼:

import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#新建畫布#顯示圖片canvas=tk.Canvas(window,bg='blue',height=100,width=200)image_file=tk.PhotoImage(file='ins.gif')image=canvas.create_image(0,0,anchor='nw',image=image_file)#畫線x0,y0,x1,y1=50,50,80,80line=canvas.create_line(x0,y0,x1,y1)#畫?oval=canvas.create_oval(x0,y0,x1,y1,fill='red')#畫一個(gè)扇形arc = canvas.create_arc(x0+30, y0+30, x1+30, y1+30, start=0, extent=90)#畫一個(gè)矩形rect = canvas.create_rectangle(100, 30, 100+20, 30+20)canvas.pack()def moveit():canvas.move(rect,0,2)#創(chuàng)建一個(gè)Buttonb=tk.Button(window,text='Move',command=moveit)b.pack()##顯示出來(lái)window.mainloop()

演示:

Menubar 菜單

這一次的效果將會(huì)像下面的圖片一樣.

Menubar 菜單

注意這里的操作系統(tǒng)是蘋果的 MacOS, 它的菜單欄位置和 Windows 的不一樣.

Menubar 菜單
Menubar 菜單

menubar 部件 

下面是我們制作整個(gè)菜單欄的流程, 我們先需要加入一個(gè) Menubar 作為整體框架, 然后再在 Menubar 中加一些部件.

##創(chuàng)建一個(gè)菜單欄,這里我們可以把他理解成一個(gè)容器,在窗口的上方menubar = tk.Menu(window)##定義一個(gè)空菜單單元filemenu = tk.Menu(menubar, tearoff=0)##將上面定義的空菜單命名為`File`,放在菜單欄中,就是裝入那個(gè)容器中menubar.add_cascade(label='File', menu=filemenu)##在`File`中加入`New`的小菜單,即我們平時(shí)看到的下拉菜單,每一個(gè)小菜單對(duì)應(yīng)命令操作。##如果點(diǎn)擊這些單元, 就會(huì)觸發(fā)`do_job`的功能filemenu.add_command(label='New', command=do_job)filemenu.add_command(label='Open', command=do_job)##同樣的在`File`中加入`Open`小菜單filemenu.add_command(label='Save', command=do_job)##同樣的在`File`中加入`Save`小菜單filemenu.add_separator()##這里就是一條分割線##同樣的在`File`中加入`Exit`小菜單,此處對(duì)應(yīng)命令為`window.quit`filemenu.add_command(label='Exit', command=window.quit)

同樣的我們?cè)诙x另一個(gè)菜單Edit也是如此和定義的File菜單一樣 這里再來(lái)看一下效果中比較不一樣的菜單就是File中的Import菜單, 在這個(gè)菜單選項(xiàng)中, 我們還能分支出更多的選項(xiàng).

submenu = tk.Menu(filemenu)##和上面定義菜單一樣,不過(guò)此處實(shí)在`File`上創(chuàng)建一個(gè)空的菜單filemenu.add_cascade(label='Import', menu=submenu, underline=0)##給放入的菜單`submenu`命名為`Import`submenu.add_command(label="Submenu1", command=do_job)##這里和上面也一樣,在`Import`中加入一個(gè)小菜單命令`Submenu1`

觸發(fā)功能

counter = 0def do_job():global counterl.config(text='do '+ str(counter))counter+=1

這里的功能就是每觸發(fā)一次命令,counter就會(huì)+1,在label上的顯示就會(huì)從 do 0 ,do 1 , do 2…

完整代碼:

import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#新建一個(gè)labell=tk.Label(window,text='',bg='yellow')l.pack()#計(jì)數(shù)counter = 0def do_job():global counterl.config(text='do '+ str(counter))counter+=1#創(chuàng)建菜單menubar=tk.Menu(window)#菜單一filemenu=tk.Menu(menubar,tearoff=0)#一級(jí)菜單menubar.add_cascade(label='File',menu=filemenu)#二級(jí)菜單filemenu.add_command(label='New',command=do_job)filemenu.add_command(label='Open',command=do_job)filemenu.add_separator()#分割線filemenu.add_command(label='Exit',command=window.quit)#菜單二editmenu=tk.Menu(menubar,tearoff=0)#一級(jí)菜單menubar.add_cascade(label='Edit',menu=editmenu)#二級(jí)菜單editmenu.add_command(label='Cut',command=do_job)editmenu.add_command(label='Paste',command=do_job)##菜單一子菜單submenu=tk.Menu(filemenu)#一級(jí)菜單filemenu.add_cascade(label='Import',menu=submenu,underline=0)#二級(jí)菜單submenu.add_command(label='Submeau1',command=do_job)submenu.add_command(label='Submeau1',command=do_job)window.config(menu=menubar)##顯示出來(lái)window.mainloop()

演示:

Frame 框架

這一次的效果將會(huì)像下面的圖片一樣.

Frame 框架

Frame 部件 

Frame 是一個(gè)在 Windows 上分離小區(qū)域的部件, 它能將 Windows 分成不同的區(qū),然后存放不同的其他部件. 同時(shí)一個(gè) Frame 上也能再分成兩個(gè) Frame, Frame 可以認(rèn)為是一種容器.

###定義一個(gè)`label`顯示`on the window`tk.Label(window, text='on the window').pack()###在`window`上創(chuàng)建一個(gè)`frame`frm = tk.Frame(window)frm.pack()###在剛剛創(chuàng)建的`frame`上創(chuàng)建兩個(gè)`frame`,我們可以把它理解成一個(gè)大容器里套了一個(gè)小容器,即`frm`上有兩個(gè)`frame` ,`frm_l`和`frm_r`frm_l = tk.Frame(frm)frm_r = tk.Frame(frm)###這里是控制小的`frm`部件在大的`frm`的相對(duì)位置,此處`frm_l`就是在`frm`的左邊,`frm_r`在`frm`的右邊f(xié)rm_l.pack(side='left')frm_r.pack(side='right')###這里的三個(gè)label就是在我們創(chuàng)建的frame上定義的label部件,還是以容器理解,就是容器上貼了標(biāo)簽,來(lái)指明這個(gè)是什么,解釋這個(gè)容器。tk.Label(frm_l, text='on the frm_l1').pack()##這個(gè)`label`長(zhǎng)在`frm_l`上,顯示為`on the frm_l1`tk.Label(frm_l, text='on the frm_l2').pack()##這個(gè)`label`長(zhǎng)在`frm_l`上,顯示為`on the frm_l2`tk.Label(frm_r, text='on the frm_r1').pack()##這個(gè)`label`長(zhǎng)在`frm_r`上,顯示為`on the frm_r1`

完整代碼:

import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')###定義一個(gè)`label`顯示`on the window`tk.Label(window, text='on the window').pack()###在`window`上創(chuàng)建一個(gè)`frame`frm = tk.Frame(window,bg='green')frm.pack()###在剛剛創(chuàng)建的`frame`上創(chuàng)建兩個(gè)`frame`,我們可以把它理解成一個(gè)大容器里套了一個(gè)小容器,即`frm`上有兩個(gè)`frame` ,`frm_l`和`frm_r`frm_l = tk.Frame(frm,bg='red')frm_r = tk.Frame(frm,bg='blue')###這里是控制小的`frm`部件在大的`frm`的相對(duì)位置,此處`frm_l`就是在`frm`的左邊,`frm_r`在`frm`的右邊f(xié)rm_l.pack(side='left')frm_r.pack(side='right')###這里的三個(gè)label就是在我們創(chuàng)建的frame上定義的label部件,還是以容器理解,就是容器上貼了標(biāo)簽,來(lái)指明這個(gè)是什么,解釋這個(gè)容器。tk.Label(frm_l, text='on the frm_l1',bg='red').pack()##這個(gè)`label`長(zhǎng)在`frm_l`上,顯示為`on the frm_l1`tk.Label(frm_l, text='on the frm_l2',bg='red').pack()##這個(gè)`label`長(zhǎng)在`frm_l`上,顯示為`on the frm_l2`tk.Label(frm_r, text='on the frm_r1',bg='blue').pack()##這個(gè)`label`長(zhǎng)在`frm_r`上,顯示為`on the frm_r1`##顯示出來(lái)window.mainloop()

演示:

messagebox 彈窗

其實(shí)這里的messagebox就是我們平時(shí)看到的彈窗。 我們首先需要定義一個(gè)觸發(fā)功能,來(lái)觸發(fā)這個(gè)彈窗 這里我們就放上以前學(xué)過(guò)的button按鈕

tk.Button(window, text='hit me', command=hit_me).pack()

通過(guò)觸發(fā)功能,調(diào)用messagebox

def hit_me():tk.messagebox.showinfo(title='Hi', message='hahahaha')

這里點(diǎn)擊button按鈕就會(huì)彈出提示對(duì)話窗

下面給出幾種形式

tk.messagebox.showinfo(title='',message='')#提示信息對(duì)話窗tk.messagebox.showwarning()#提出警告對(duì)話窗tk.messagebox.showerror()#提出錯(cuò)誤對(duì)話窗tk.messagebox.askquestion()#詢問選擇對(duì)話窗

如果給出如下定義就是打印出我們所選項(xiàng)對(duì)應(yīng)的值

def hit_me():print(tk.messagebox.askquestion(title='Hi', message='hahahaha'))

同樣創(chuàng)建方法都是一樣的形式

print(tk.messagebox.askquestion())#返回yes和noprint(tk.messagebox.askokcancel())#返回true和falseprint(tk.messagebox.askyesno())#返回true和falseprint(tk.messagebox.askretrycancel())#返回true和false

完整代碼:

import tkinter as tkimport tkinter.messageboxwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')def hit_me():#tk.messagebox.showinfo(title='',message='')#提示信息對(duì)話窗#tk.messagebox.showwarning()#提出警告對(duì)話窗#tk.messagebox.showerror()#提出錯(cuò)誤對(duì)話窗#tk.messagebox.askquestion(title='Hi', message='hahahaha')#詢問選擇對(duì)話窗print(tk.messagebox.askquestion(title='Hi', message='hahahaha'))#打印出我們所選項(xiàng)對(duì)應(yīng)的值tk.Button(window,text='Hit me',command=hit_me).pack()##顯示出來(lái)window.mainloop()

演示:

pack grid place 放置位置

pack 

首先我們先看看我們常用的pack(), 他會(huì)按照上下左右的方式排列.

tk.Label(window, text='1').pack(side='top')#上tk.Label(window, text='1').pack(side='bottom')#下tk.Label(window, text='1').pack(side='left')#左tk.Label(window, text='1').pack(side='right')#右

grid 

接下里我們?cè)诳纯?code>grid(), grid 是方格, 所以所有的內(nèi)容會(huì)被放在這些規(guī)律的方格中.

for i in range(4):for j in range(3):tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10)

以上的代碼就是創(chuàng)建一個(gè)四行三列的表格,其實(shí)grid就是用表格的形式定位的。這里的參數(shù) row為行,colum為列,padx就是單元格左右間距,pady就是單元格上下間距。

place 

再接下來(lái)就是place(), 這個(gè)比較容易理解,就是給精確的坐標(biāo)來(lái)定位,如此處給的(20,10),就是將這個(gè)部件放在坐標(biāo)為(x,y)的這個(gè)位置 后面的參數(shù)anchor=nw就是前面所講的錨定點(diǎn)是西北角。

tk.Label(window, text=1).place(x=20, y=10, anchor='nw')

完整代碼(只能用一種方式放置):

import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#packtk.Label(window, text='1').pack(side='top')#上tk.Label(window, text='1').pack(side='bottom')#下tk.Label(window, text='1').pack(side='left')#左tk.Label(window, text='1').pack(side='right')#右#girdfor i in range(4):for j in range(3):tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10)#placetk.Label(window, text=1).place(x=20, y=10, anchor='nw')##顯示出來(lái)window.mainloop()

例子 登錄窗口1

這一次效果圖是這樣的:

例子 登錄窗口1

都是前面熟悉的參數(shù)。為了防止大家忘記,特意加上代碼注釋。

界面創(chuàng)建 

# welcome imagecanvas = tk.Canvas(window, height=200, width=500)#創(chuàng)建畫布image_file = tk.PhotoImage(file='welcome.gif')#加載圖片文件image = canvas.create_image(0,0, anchor='nw', image=image_file)#將圖片置于畫布上canvas.pack(side='top')#放置畫布(為上端)

這里創(chuàng)建的就是我們效果圖中的welcome, 如果你想使用和我一樣的 welcome 的圖片, 你可以在這里下載。

# user informationtk.Label(window, text='User name: ').place(x=50, y= 150)#創(chuàng)建一個(gè)`label`名為`User name: `置于坐標(biāo)(50,150)tk.Label(window, text='Password: ').place(x=50, y= 190)var_usr_name = tk.StringVar()#定義變量var_usr_name.set('example@python.com')#變量賦值'example@python.com'entry_usr_name = tk.Entry(window, textvariable=var_usr_name)#創(chuàng)建一個(gè)`entry`,顯示為變量`var_usr_name`即圖中的`example@python.com`entry_usr_name.place(x=160, y=150)var_usr_pwd = tk.StringVar()entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, show='*')#`show`這個(gè)參數(shù)將輸入的密碼變?yōu)閌***`的形式entry_usr_pwd.place(x=160, y=190)

這里就是創(chuàng)建我們熟悉的登錄界面,就是常見的用戶名,密碼。

# login and sign up buttonbtn_login = tk.Button(window, text='Login', command=usr_login)#定義一個(gè)`button`按鈕,名為`Login`,觸發(fā)命令為`usr_login`btn_login.place(x=170, y=230)btn_sign_up = tk.Button(window, text='Sign up', command=usr_sign_up)btn_sign_up.place(x=270, y=230)

這里定義的就是我們的登錄按鈕。

觸發(fā)功能

def usr_login():passdef usr_sign_up():pass

本節(jié)我們只是把登錄的界面做出來(lái),并沒有對(duì)觸發(fā)功能詳細(xì)的去定義。等下節(jié)會(huì)繼續(xù)完善這個(gè)例子。

例子 登錄窗口2

這一次效果圖是這樣的:

例子 登錄窗口2

觸發(fā)的 usr_login 功能 

##這兩行代碼就是獲取用戶輸入的`usr_name`和`usr_pwd`usr_name = var_usr_name.get()usr_pwd = var_usr_pwd.get()##這里設(shè)置異常捕獲,當(dāng)我們第一次訪問用戶信息文件時(shí)是不存在的,所以這里設(shè)置異常捕獲。##中間的兩行就是我們的匹配,即程序?qū)⑤斎氲男畔⒑臀募械男畔⑵ヅ?。try:with open('usrs_info.pickle', 'rb') as usr_file:usrs_info = pickle.load(usr_file)except FileNotFoundError:##這里就是我們?cè)跊]有讀取到`usr_file`的時(shí)候,程序會(huì)創(chuàng)建一個(gè)`usr_file`這個(gè)文件,并將管理員##的用戶和密碼寫入,即用戶名為`admin`密碼為`admin`。with open('usrs_info.pickle', 'wb') as usr_file:usrs_info = {'admin': 'admin'}pickle.dump(usrs_info, usr_file)

這一部分就是將用戶輸入的用戶名和密碼獲取到,和我們保存在usr_file中的數(shù)據(jù)對(duì)比。針對(duì)正確的密碼和錯(cuò)誤的密碼分別對(duì)待.

#如果用戶名和密碼與文件中的匹配成功,則會(huì)登錄成功,并跳出彈窗`how are you?`加上你的用戶名。if usr_name in usrs_info:if usr_pwd == usrs_info[usr_name]:tk.messagebox.showinfo(title='Welcome', message='How are you? ' + usr_name)##如果用戶名匹配成功,而密碼輸入錯(cuò)誤,則會(huì)彈出'Error, your password is wrong, try again.'else:tk.messagebox.showerror(message='Error, your password is wrong, try again.')else:   # 如果發(fā)現(xiàn)用戶名不存在is_sign_up = tk.messagebox.askyesno('Welcome','You have not sign up yet. Sign up today?')# 提示需不需要注冊(cè)新用戶if is_sign_up:usr_sign_up()

下面是用戶名存在但是一個(gè)密碼正確, 一個(gè)密碼錯(cuò)誤.

例子 登錄窗口2
例子 登錄窗口2

下面是用戶不存在, 提示需不需要注冊(cè)一個(gè)新的用戶.

例子 登錄窗口2

因?yàn)楸竟?jié)只是定義usr_sign_up并沒有實(shí)質(zhì)功能,所以選擇之后沒有太大變化。 這一部分就是匹配的主要內(nèi)容,如果匹配成功,就會(huì)登錄進(jìn)去,否則就會(huì)失敗。

本節(jié)主要是詳細(xì)介紹登錄功能,下節(jié)會(huì)繼續(xù)完善注冊(cè)命令。 

例子 登錄窗口3

這一次效果圖是這樣的:

例子 登錄窗口3

usr_sign_up 界面

window_sign_up = tk.Toplevel(window)window_sign_up.geometry('350x200')window_sign_up.title('Sign up window')

這一段首先是創(chuàng)建一個(gè)注冊(cè)的窗口。這里和以往不同的是,多了一個(gè)tk.Toplevel我們打個(gè)比方,就好像我們前面所學(xué) 的frame一樣,就是在編輯的功能下還有很多功能一樣,這里就是在主體窗口的window上創(chuàng)建一個(gè)Sign up window窗口。

new_name = tk.StringVar()#將輸入的注冊(cè)名賦值給變量new_name.set('example@python.com')#將最初顯示定為'example@python.com'tk.Label(window_sign_up, text='User name: ').place(x=10, y= 10)#將`User name:`放置在坐標(biāo)(10,10)。entry_new_name = tk.Entry(window_sign_up, textvariable=new_name)#創(chuàng)建一個(gè)注冊(cè)名的`entry`,變量為`new_name`entry_new_name.place(x=150, y=10)#`entry`放置在坐標(biāo)(150,10).new_pwd = tk.StringVar()tk.Label(window_sign_up, text='Password: ').place(x=10, y=50)entry_usr_pwd = tk.Entry(window_sign_up, textvariable=new_pwd, show='*')entry_usr_pwd.place(x=150, y=50)new_pwd_confirm = tk.StringVar()tk.Label(window_sign_up, text='Confirm password: ').place(x=10, y= 90)entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*')entry_usr_pwd_confirm.place(x=150, y=90)# 下面的 sign_to_Mofan_Python 我們?cè)俸竺娼又f(shuō)btn_comfirm_sign_up = tk.Button(window_sign_up, text='Sign up', command=sign_to_Mofan_Python)btn_comfirm_sign_up.place(x=150, y=130)

相信大家對(duì)這一段代碼已經(jīng)很熟悉了,因?yàn)檫@是大家前面所學(xué)過(guò)的知識(shí)。其實(shí)就是像我們平時(shí)所見的注冊(cè)窗口有一樣,在Sign up window窗口 上添加new_name,new_pwd, new_pwd_confirm,還有最后一個(gè)注冊(cè)按鈕。這里便于大家復(fù)習(xí),我們將new_name這段詳細(xì)介紹一下(如代碼注釋)。 到這里就完成了我們這個(gè)注冊(cè)的主要界面用戶名,密碼,確認(rèn)密碼。效果圖如下:

例子 登錄窗口3

sign_to_Mofan_Python() 功能 

def usr_sign_up():def sign_to_Mofan_Python():##以下三行就是獲取我們注冊(cè)時(shí)所輸入的信息np = new_pwd.get()npf = new_pwd_confirm.get()nn = new_name.get()##這里是打開我們記錄數(shù)據(jù)的文件,將注冊(cè)信息讀出with open('usrs_info.pickle', 'rb') as usr_file:exist_usr_info = pickle.load(usr_file)##這里就是判斷,如果兩次密碼輸入不一致,則提示`'Error', 'Password and confirm password must be the same!'`if np != npf:tk.messagebox.showerror('Error', 'Password and confirm password must be the same!')##如果用戶名已經(jīng)在我們的數(shù)據(jù)文件中,則提示`'Error', 'The user has already signed up!'`elif nn in exist_usr_info:tk.messagebox.showerror('Error', 'The user has already signed up!')##最后如果輸入無(wú)以上錯(cuò)誤,則將注冊(cè)輸入的信息記錄到文件當(dāng)中,并提示注冊(cè)成功`'Welcome', 'You have successfully signed up!'`##然后銷毀窗口。else:exist_usr_info[nn] = npwith open('usrs_info.pickle', 'wb') as usr_file:pickle.dump(exist_usr_info, usr_file)tk.messagebox.showinfo('Welcome', 'You have successfully signed up!')##然后銷毀窗口。window_sign_up.destroy()

這里其實(shí)和前面所講的login功能類似,如代碼注釋。

注冊(cè)成功就是我們一開始展示的效果圖。

到此,我們的這個(gè)程序已經(jīng)完善。這里給大家奉上我們最后的成果。

完整代碼:

import tkinter as tkimport pickleimport tkinter.messageboxwindow = tk.Tk()window.title('Welcome To Myapp!')##窗口尺寸window.geometry('450x300')# welcome imagecanvas = tk.Canvas(window, height=200, width=500)#創(chuàng)建畫布image_file = tk.PhotoImage(file='welcome.gif')#加載圖片文件image = canvas.create_image(0,0, anchor='nw', image=image_file)#將圖片置于畫布上canvas.pack(side='top')#放置畫布(為上端)# user informationtk.Label(window, text='用戶名: ').place(x=50, y= 150)#創(chuàng)建一個(gè)`label`名為`User name: `置于坐標(biāo)(50,150)tk.Label(window, text='密碼: ').place(x=50, y= 190)#用戶名輸入框var_usr_name = tk.StringVar()#定義變量var_usr_name.set('example@python.com')#變量賦值'example@python.com'entry_usr_name = tk.Entry(window, textvariable=var_usr_name)#創(chuàng)建一個(gè)`entry`,顯示為變量`var_usr_name`即圖中的`example@python.com`entry_usr_name.place(x=160, y=150)#密碼輸入框var_usr_pwd = tk.StringVar()entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, show='*')#`show`這個(gè)參數(shù)將輸入的密碼變?yōu)閌***`的形式entry_usr_pwd.place(x=160, y=190)#登錄事件def usr_login():##這兩行代碼就是獲取用戶輸入的`usr_name`和`usr_pwd`usr_name = var_usr_name.get()usr_pwd = var_usr_pwd.get()##這里設(shè)置異常捕獲,當(dāng)我們第一次訪問用戶信息文件時(shí)是不存在的,所以這里設(shè)置異常捕獲。##中間的兩行就是我們的匹配,即程序?qū)⑤斎氲男畔⒑臀募械男畔⑵ヅ?。try:with open('usrs_info.pickle', 'rb') as usr_file:usrs_info = pickle.load(usr_file)except EOFError:##這里就是我們?cè)跊]有讀取到`usr_file`的時(shí)候,程序會(huì)創(chuàng)建一個(gè)`usr_file`這個(gè)文件,并將管理員##的用戶和密碼寫入,即用戶名為`admin`密碼為`admin`。with open('usrs_info.pickle', 'wb') as usr_file:usrs_info = {'admin': 'admin'}pickle.dump(usrs_info, usr_file)#如果用戶名和密碼與文件中的匹配成功,則會(huì)登錄成功,并跳出彈窗`how are you?`加上你的用戶名。if usr_name in usrs_info:if usr_pwd == usrs_info[usr_name]:tk.messagebox.showinfo(title='歡迎', message='你好' + usr_name)##如果用戶名匹配成功,而密碼輸入錯(cuò)誤,則會(huì)彈出'Error, your password is wrong, try again.'else:tk.messagebox.showerror(message='錯(cuò)誤,你的密碼有問題,請(qǐng)重新輸入')else:   # 如果發(fā)現(xiàn)用戶名不存在is_sign_up = tk.messagebox.askyesno('Welcome','你還沒有注冊(cè),現(xiàn)在注冊(cè)?')# 提示需不需要注冊(cè)新用戶if is_sign_up:usr_sign_up()#注冊(cè)事件def usr_sign_up():def sign_to_app():##以下三行就是獲取我們注冊(cè)時(shí)所輸入的信息np = new_pwd.get()npf = new_pwd_confirm.get()nn = new_name.get()##這里是打開我們記錄數(shù)據(jù)的文件,將注冊(cè)信息讀出with open('usrs_info.pickle', 'rb') as usr_file:exist_usr_info = pickle.load(usr_file)##這里就是判斷,如果兩次密碼輸入不一致,則提示`'Error', 'Password and confirm password must be the same!'`if np != npf:tk.messagebox.showerror('Error', '兩次密碼輸入不一致哦!')##如果用戶名已經(jīng)在我們的數(shù)據(jù)文件中,則提示`'Error', 'The user has already signed up!'`elif nn in exist_usr_info:tk.messagebox.showerror('Error', '這個(gè)用戶名已經(jīng)注冊(cè)了!')##最后如果輸入無(wú)以上錯(cuò)誤,則將注冊(cè)輸入的信息記錄到文件當(dāng)中,并提示注冊(cè)成功`'Welcome', 'You have successfully signed up!'`##然后銷毀窗口。else:exist_usr_info[nn] = npwith open('usrs_info.pickle', 'wb') as usr_file:pickle.dump(exist_usr_info, usr_file)tk.messagebox.showinfo('Welcome', '你成功注冊(cè)了!')##然后銷毀窗口。window_sign_up.destroy()window_sign_up = tk.Toplevel(window)window_sign_up.geometry('350x200')window_sign_up.title('用戶注冊(cè)')#新用戶名new_name = tk.StringVar()#將輸入的注冊(cè)名賦值給變量new_name.set('example@python.com')#將最初顯示定為'example@python.com'tk.Label(window_sign_up, text='用戶名: ').place(x=10, y= 10)#將`User name:`放置在坐標(biāo)(10,10)。entry_new_name = tk.Entry(window_sign_up, textvariable=new_name)#創(chuàng)建一個(gè)注冊(cè)名的`entry`,變量為`new_name`entry_new_name.place(x=150, y=10)#`entry`放置在坐標(biāo)(150,10).#新密碼new_pwd = tk.StringVar()tk.Label(window_sign_up, text='密碼: ').place(x=10, y=50)entry_usr_pwd = tk.Entry(window_sign_up, textvariable=new_pwd, show='*')entry_usr_pwd.place(x=150, y=50)#防止密碼填錯(cuò)new_pwd_confirm = tk.StringVar()tk.Label(window_sign_up, text='重復(fù)密碼: ').place(x=10, y= 90)entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*')entry_usr_pwd_confirm.place(x=150, y=90)# 下面的 sign_to_appbtn_comfirm_sign_up = tk.Button(window_sign_up, text='注冊(cè)', command=sign_to_app)btn_comfirm_sign_up.place(x=150, y=130)# 登錄和注冊(cè)按鈕btn_login = tk.Button(window, text='登錄', command=usr_login)#定義一個(gè)`button`按鈕,名為`Login`,觸發(fā)命令為`usr_login`btn_login.place(x=170, y=230)btn_sign_up = tk.Button(window, text='注冊(cè)', command=usr_sign_up)btn_sign_up.place(x=270, y=230)##顯示出來(lái)window.mainloop()

演示:

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約