python3.7运行界面_Python初学——窗口视窗Tkinter

2024-02-25 04:50

本文主要是介绍python3.7运行界面_Python初学——窗口视窗Tkinter,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

此篇文章是跟着沫凡小哥的视频学习的,附上学习网址:https://morvanzhou.github.io/tutorials/python-basic/

什么是 tkinter 窗口

1.1 什么是 Tkinter

Python自带的可编辑的GUI界面,是一个图像窗口。

Tkinter是使用 python 进行窗口视窗设计的模块。简单的构造,多平台,多系统的兼容性, 能让它成为让你快速入门定制窗口文件的好助手。它在 python 窗口视窗模块中是一款简单型的。所以用来入门,熟悉窗口视窗的使用,非常有必要。

tkinter 的窗口部件

2.1 Label & Button 标签和按钮

窗口主体框架

每一个tkinter应用的主体框架都可以包含下面这部分,定义window窗口和window的一些属性,然后书写窗口内容,最后执行window.mainloop让窗口活起来。

importtkinter as tk

window=tk.Tk()

window.title('my window')

window.geometry('300x100')#这里是窗口的内容

window.mainloop()

首先建立一个用来描述的标签tk.Label(注意对象的首字母一般是大写),示例代码如下所示:

l =tk.Label(window,

text='OMG! this is TK!', #标签的文字

bg='green', #背景颜色

font=('Arial', 12), #字体和字体大小

width=15, height=2) #标签长宽l.pack()#固定窗口位置

运行结果如图所示:

1212449-20170829213813499-169541743.png

我们也可以通过变量的形式控制标签的显示,这时我们引入按钮 tk.Button 的概念,每点一次按钮,标签变化一次。 用以下内容替换上面的标签. 并把需要变化的文字存成变量 var:

var = tk.StringVar() #这时文字变量储存器

l =tk.Label(window,

textvariable=var, #使用 textvariable 替换 text, 因为这个可以变化

bg='green', font=('Arial', 12), width=15, height=2)

l.pack()

接着做按钮tk.Button:

b =tk.Button(window,

text='hit me', #显示在按钮上的文字

width=15, height=2,

command=hit_me) #点击按钮式执行的命令

b.pack() #按钮位置

hit_me函数如下:

on_hit = False #默认初始状态为 False

defhit_me():globalon_hitif on_hit == False: #从 False 状态变成 True 状态

on_hit =True

var.set('you hit me') #设置标签的文字为 'you hit me'

else: #从 True 状态变成 False 状态

on_hit =False

var.set('') #设置文字为空

运行结果如下所示:

没有点击动作时:

1212449-20170829213537437-79898659.png

点击第一次:

1212449-20170829213553593-2118176487.png

点击第二次:

1212449-20170829213537437-79898659.png

完整代码:

importtkinter as tk

window=tk.Tk()

window.title('my window')

window.geometry('300x100')

var=tk.StringVar()

l=tk.Label(window,textvariable=var,bg='green',font=('Arial',12),width=15,

height=2)

l.pack()

on_hit=Falsedefhit_me():globalon_hitif on_hit==False:

on_hit=True

var.set('you hit me')else:

on_hit=False

var.set('')

b=tk.Button(window,text='hit me',width=15,

height=2,command=hit_me)

b.pack()

window.mainloop()

2.2 Entry & Text 输入, 文本框

在定义了窗口的基础上,首先定义一个Entry,代码如下所示:

e = tk.Entry(window,show=None)

e.pack()

注意这里的show,可以自定义显示你想要在Entry中显示的字符,例如像输入密码时,可令show=‘*’

本节实现的例子功能为,如下所示的一个窗口,从上至下分别为定义的Entry、Button、Button和Text。两个Button分别命名为insert point和insert end,获取Entry中输入的内容并且分别在光标位置、末尾插入,内容显示在Text中。

1212449-20170829212208530-1674103891.png

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)

函数的定义如下所示:

definsert_point():

var=e.get()

t.insert('insert',var)definsert_end():

var=e.get()

t.insert('end',var)

完整代码如下:

importtkinter as tk

window=tk.Tk()

window.title('my window')

window.geometry('300x300')

e= tk.Entry(window,show=None)

e.pack()definsert_point():

var=e.get()

t.insert('insert',var)definsert_end():

var=e.get()

t.insert('end',var)

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()

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

t.pack()

window.mainloop()

运行结果如下所示,首先在Entry中输入111111,点击按钮1,如下:

1212449-20170829212829874-1100978534.png

选择某一点作为插入位置,再在Entry中输入2,点击按钮1

1212449-20170829212851015-1202127737.png

在Entry中输入3,点击按钮2

1212449-20170829212905249-1715341745.png

此外,insert还能实现具体位置的内容插入,例如将inser_end函数更改如下:

definsert_end():

var=e.get()

t.insert(2.2,var)

则insert_end实现在Text的2行2列出插入内容,运行结果如下所示:

1212449-20170829213356702-1892358046.png

2.3 Listbox 列表部件

本节例子实现功能为:如下所示,从上到下分别为Label、Button和Listbox,Button实现将Listbox中当前光标选中的内容显示在Label中。

1212449-20170830104839858-471005522.png

在定义好窗口的基础上首先定义Label,设置底色为黄色,并且要将文本内容定义为变量,代码如下:

var1=tk.StringVar()

l=tk.Label(window,bg='yellow',width=4,textvariable=var1)

l.pack()

接着定义Button,命名为‘print selection’,并定义command的函数,如下所示:

defprint_selection():

value=lb.get(lb.curselection())

var1.set(value)

b1= tk.Button(window, text='print selection', width=15,

height=2, command=print_selection)

b1.pack()

最后定义Listbox,如下所示实现了Listbox中内容的设置、插入、删除等。

var2=tk.StringVar()

var2.set((11,22,33,44))

lb=tk.Listbox(window,listvariable=var2)

list_items=[1,2,3,4]for item inlist_items:

lb.insert('end',item)

lb.insert(1,'first')

lb.insert(2,'second')

lb.delete(2)

lb.pack()

完整代码如下所示:

importtkinter as tk

window=tk.Tk()

window.title('my window')

window.geometry('300x300')

var1=tk.StringVar()

l=tk.Label(window,bg='yellow',width=4,textvariable=var1)

l.pack()defprint_selection():

value=lb.get(lb.curselection())

var1.set(value)

b1= tk.Button(window, text='print selection', width=15,

height=2, command=print_selection)

b1.pack()

var2=tk.StringVar()

var2.set((11,22,33,44))

lb=tk.Listbox(window,listvariable=var2)

list_items=[1,2,3,4]for item inlist_items:

lb.insert('end',item)

lb.insert(1,'first')

lb.insert(2,'second')

lb.delete(2)

lb.pack()

window.mainloop()

2.4 Radiobutton 选择按钮

1212449-20170830112908343-1406284074.png

如图所示,Radiobutton即为上图中可选择的按钮,本节实现选中不同的Radiobutton时打印出相应的内容。

首先定义底色为黄色的Label,代码见完整代码。

接着要定义三个Radiobutton:

r1=tk.Radiobutton(window,text='Option A',

variable=var,value='A',

command=print_selection)

r1.pack()

Radiobutton放在window上,命名为‘Option A’,其中var=tk.StringVar(),接着令按钮的variable等于var,并且赋值为‘A’。

print_selection函数的定义如下:

defprint_selection():

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

config能对所有的参数进行更改,在函数定义中选择text属性进行更改。

完整代码如下:

importtkinter as tk

window=tk.Tk()

window.title('my window')

window.geometry('300x300')

var=tk.StringVar()

l=tk.Label(window,bg='yellow',width=20,text='empty')

l.pack()defprint_selection():

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

r1=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()

window.mainloop()

运行结果如下所示,当未选中时,Label内容显示为empty,当选中某一个Radiobutton时,则Label中显示相应的内容

1212449-20170830120019733-1746533735.png

2.5 Scale 尺度

可以被拉动的一个条,Scale返回的是一个数字。如下所示,当拉动时会在Label上显示具体的数字。

1212449-20170830121227687-561728222.png

完整代码如下:

importtkinter as tk

window=tk.Tk()

window.title('my window')

window.geometry('300x300')

l=tk.Label(window,bg='yellow',width=20,text='empty')

l.pack()defprint_selection(v):

l.config(text='you have selected'+v)

s=tk.Scale(window,label='try me',from_=5,to=11,orient=tk.HORIZONTAL,

length=200,showvalue=0,tickinterval=3,resolution=0.01,command=print_selection)

s.pack()

window.mainloop()

定义Scale的属性时,名字为label,from to为取值范围,from_是为了区分python中的from,Scale还有横向和竖向属性,注意为tk.横向/竖向。length为显示的长度,不同于Label中的width,width的单位是字符,和length的单位是像素。showvalue即是否显示所选中的数字,取值为0时不显示,为1时显示。显示的标签单位长度为tickinterval,即显示出的数字的间隔,取值为3时,即显示5,8,11。resolution为要保留的小数个数。

在Scale中所定义的command功能是有默认传入值的,该传入值即为Scale标签当前标注的值。所以在定义print_selection函数时需要定义一个参数用于表示该传入值。

2.6 Checkbutton 勾选项

与Radiobutton类似,但是Radiobutton选中一个后其他默认为不选中,但是Checkbutton类似于多选,可以选中多个。

定义两个Checkbutton,如下所示:

var1=tk.IntVar()

var2=tk.IntVar()

c1=tk.Checkbutton(window,text='Python',variable=var1,onvalue=1,offvalue=0,

command=print_selection)

c2=tk.Checkbutton(window,text='C++',variable=var2,onvalue=1,offvalue=0,

command=print_selection)

c1.pack()

c2.pack()

首先定义两个变量var1和var2,为整型。

两个Checkbutton的variable分别等于var1和var,并且选中时value为1,即onvalue=1,未选中时offvalue=0.

command的print_selection定义如下,根据var1和var2的值来进行相应的操作。

defprint_selection():if(var1.get()==1)&(var2.get()==0):

l.config(text='I love only Python')elif(var1.get()==0)&(var2.get()==1):

l.config(text='I love only C++')elif(var1.get()==0)&(var2.get()==0):

l.config(text='I do not love either')else:

l.config(text='I love both')

完整代码如下所示:

importtkinter as tk

window=tk.Tk()

window.title('my window')

window.geometry('300x300')

l=tk.Label(window,bg='yellow',width=20,text='empty')

l.pack()defprint_selection():if(var1.get()==1)&(var2.get()==0):

l.config(text='I love only Python')elif(var1.get()==0)&(var2.get()==1):

l.config(text='I love only C++')elif(var1.get()==0)&(var2.get()==0):

l.config(text='I do not love either')else:

l.config(text='I love both')

var1=tk.IntVar()

var2=tk.IntVar()

c1=tk.Checkbutton(window,text='Python',variable=var1,onvalue=1,offvalue=0,

command=print_selection)

c2=tk.Checkbutton(window,text='C++',variable=var2,onvalue=1,offvalue=0,

command=print_selection)

c1.pack()

c2.pack()

window.mainloop()

运行结果如下所示:

1212449-20170830151821999-1670385348.png

单独选中Python时:

1212449-20170830151838765-2111085244.png

单独选中C++时:

1212449-20170830151858562-543098582.png

两个都选中:

1212449-20170830151912624-1451549879.png

两个都不选:

1212449-20170830151927140-408417588.png

2.7 Canvas 画布

规定一片区域,可以放置图片、图形等等,并且可以把位置和形状进行改变。

importtkinter as tk

window=tk.Tk()

window.title('my window')

window.geometry('300x300')

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

image_file=tk.PhotoImage(file='3.png')

image=canvas.create_image(10,10,anchor='nw',image=image_file)

x0,y0,x1,y1=90,90,120,120line=canvas.create_line(x0,y0,x1,y1)

oval=canvas.create_oval(x0,y0,x1,y1,fill='yellow')

arc=canvas.create_arc(x0+30,y0+30,x1+30,y1+30,start=0,extent=180,fill='green')

rect=canvas.create_rectangle(100,30,100+20,30+20)

canvas.pack()defmoveit():

canvas.move(rect,0,2)

b=tk.Button(window,text='move',command=moveit).pack()

window.mainloop()

首先定义一个Canvas。

放置一张图片,首先读取读片并存入到image_file中,接着Canvas通过create.image将图片放置到画布上。注意10,10为放置的坐标,anchor意为锚点,即锚定的位置,可选择的属性如下所示:

1212449-20170830163540140-1753817424.png

nw即为放置在左上角,图片最左上角的点放置的坐标应为所定义的10,10.

接着create.line从坐标为(90,90)到(120,120)绘制一条直线。

create.oval为绘制圆形,fill填充颜色。

create.arc为绘制扇形,start和extent表示该扇形从0°到180°。

create.rectangle为绘制一个正方形。

此外,定义了一个button,该按钮的作用是每点击一次,rect对象,即为所绘制的正方形下移两格,moveit函数中0表示x方向的位移为0,2为y方向上的位移变化尺度。结果如下所示。

1212449-20170830215804593-1429544731.png

单机move按钮,正方形的位置发生变化:

1212449-20170830215919405-1086513776.png

2.8 Menubar 菜单

菜单条,如下所示为本节将要完成的简单菜单条。

1212449-20170831144648343-972675203.png

首先在窗口window上定义一个Menu

menubar=tk.Menu(window)

接着在menubar上创建File选项,首先同样定义一个Menu,此时的Menu是放置在menubar上的,并通过add_cascade(cascade:级联)放置在menubar上

filemenu=tk.Menu(menubar,tearoff=0)

menubar.add_cascade(label='File',menu=filemenu)

接着如上图所示,在File选项中,增加New、Open、Save,分隔线、以及Exit

filemenu.add_command(label='New',command=do_job)

filemenu.add_command(label='Open',command=do_job)

filemenu.add_command(label='Save',command=do_job)

filemenu.add_separator()

filemenu.add_command(label='Exit',command=window.quit)

同理,增加Edit选项,代码详见完整代码

1212449-20170831150612312-2007770468.png

接着,我们来创建File中的Submenu,如下图所示

1212449-20170831150745499-1541181243.png

submenu=tk.Menu(filemenu)

filemenu.add_cascade(label='Import',menu=submenu,underline=0)

submenu.add_command(label='Submenu1',command=do_job)

在代码中,do_job做了一个简单的显示功能,如下所示:

counter=0defdo_job():globalcounter

l.config(text='do'+str(counter))

counter+=1

完整代码:

importtkinter as tk

window=tk.Tk()

window.title('my window')

window.geometry('300x300')

l=tk.Label(window,text='',bg='yellow')

l.pack()

counter=0defdo_job():globalcounter

l.config(text='do'+str(counter))

counter+=1menubar=tk.Menu(window)

filemenu=tk.Menu(menubar,tearoff=0)

menubar.add_cascade(label='File',menu=filemenu)

filemenu.add_command(label='New',command=do_job)

filemenu.add_command(label='Open',command=do_job)

filemenu.add_command(label='Save',command=do_job)

filemenu.add_separator()

filemenu.add_command(label='Exit',command=window.quit)

editmenu=tk.Menu(menubar,tearoff=0)

menubar.add_cascade(label='Edit',menu=editmenu)

editmenu.add_command(label='Cut',command=do_job)

editmenu.add_command(label='Copy',command=do_job)

editmenu.add_command(label='Paste',command=do_job)

submenu=tk.Menu(filemenu)

filemenu.add_cascade(label='Import',menu=submenu,underline=0)

submenu.add_command(label='Submenu1',command=do_job)

window.config(menu=menubar)

window.mainloop()

2.9 Frame 框架

底层框架,可以在上面放各种小部件

1212449-20170831153241233-1873031410.png

importtkinter as tk

window=tk.Tk()

window.title('my window')

window.geometry('300x300')

tk.Label(window,text='on the window').pack()

frm=tk.Frame(window)

frm.pack()

frm_l=tk.Frame(frm,)

frm_r=tk.Frame(frm)

frm_l.pack(side='left')

frm_r.pack(side='right')

tk.Label(frm_l,text='on the frm_l1').pack()

tk.Label(frm_l,text='on the frm_l2').pack()

tk.Label(frm_r,text='on the frm_r1').pack()

window.mainloop()

首先定义一个主Frame,放在window上

接着定义了第二层的两个Frame,分别放在主Frame的左右侧

在左边的Frame上放置了两个标签,右边放了一个标签

2.10 messagebox 弹窗

在window的基础上定义一个Button

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

如图所示:

1212449-20170831155803358-1066047677.png

接着定义一个弹窗,在运行时出现错误

AttributeError: module 'tkinter' has no attribute 'messagebox'

试着加入import则可运行成功

from tkinter import messagebox

messagebox有多种功能,接下来将分别细述

(1)showinfo

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

1212449-20170831155811608-1664917087.png

(2)showwarning

tk.messagebox.showwarning(title='Hi', message='nononono')

1212449-20170831162153593-1400276754.png

(3)showerror

tk.messagebox.showerror(title='Hi', message='No!! never')

1212449-20170831162321780-956294917.png

(4)askquestion返回是字符串,即返回的是‘yes’或者‘no’,可通过print打印出来以更好的理解

print(tk.messagebox.askquestion(title='Hi', message='hahahaha')) #return 'yes' , 'no'

1212449-20170831163042796-775078388.png

选择是打印出的值为‘yes’

1212449-20170831163105499-1288155563.png

根据return的值可进一步选择需要的操作

if return==‘yes’

(5)askyesno

返回的是True或者False

print(tk.messagebox.askyesno(title='Hi', message='hahahaha')) #return True, False

1212449-20170831165921374-1910955528.png

同样可根据返回的值来进一步操作。

(6)asktrycancel

print(tk.messagebox.asktrycancel(title='Hi', message='hahahaha')) #return True, False

但是不知道为什么运行时出现错误:AttributeError: module 'tkinter.messagebox' has no attribute 'asktrycancel'

(7)askokcancel

print(tk.messagebox.askokcancel(title='Hi', message='hahahaha')) #return True, False

1212449-20170831172947858-1178394500.png

(8)askyesnocancel

print(tk.messagebox.askyesnocancel(title="Hi", message="haha")) #return, True, False, None

1212449-20170831173017733-1548738749.png

完整代码:

importtkinter as tk

window=tk.Tk()

window.title('my window')

window.geometry('200x200')defhit_me():#tk.messagebox.showinfo(title='Hi', message='hahahaha')

#tk.messagebox.showwarning(title='Hi', message='nononono')

#tk.messagebox.showerror(title='Hi', message='No!! never')

#print(tk.messagebox.askquestion(title='Hi', message='hahahaha')) # return 'yes' , 'no'

#print(tk.messagebox.askyesno(title='Hi', message='hahahaha')) # return True, False

#print(tk.messagebox.asktrycancel(title='Hi', message='hahahaha')) # return True, False

#print(tk.messagebox.askokcancel(title='Hi', message='hahahaha')) # return True, False

print(tk.messagebox.askyesnocancel(title="Hi", message="haha")) #return, True, False, None

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

window.mainloop()

2.11 pack grid place 放置位置

(1)pack

side属性来决定所放置的位置,共有top、bottom、left、right

tk.Label(window,text='1').pack(side='top')tk.Label(window,text='1').pack(side='bottom')tk.Label(window,text='1').pack(side='left')t

tk.Label(window,text='1').pack(side='right')

1212449-20170831194348296-686822776.png

(2)grid

按照格点(方格的形式来放置)

for i in range(4):for j in range(3):

tk.Label(window,text=1).grid(row=i,column=j,padx=10,pady=10)

无padx和pady时:

1212449-20170831194736483-1955561197.png

其中padx、pady用于填充显示,padx和pady用于设置框架的外部填充显示,ipadx和ipady用于设置框架的内部显示。

1212449-20170831194552327-1646462205.png

(3)place

能精确放置到某一坐标处

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

1212449-20170831194859890-1870184406.png

登录窗口例子

3.1 例子1 登录窗口

综合前面所学习的内容,设计如下窗口

1212449-20170831210626187-188127549.png

代码如下所示:

importtkinter as tk

window=tk.Tk()

window.title('Welcome to Mofan Python')

window.geometry('450x300')#welcome image

canvas = tk.Canvas(window, height=200, width=500)

image_file= tk.PhotoImage(file='welcome.gif')

image= canvas.create_image(0,0, anchor='nw', image=image_file)

canvas.pack(side='top')#user information

tk.Label(window, text='User name:').place(x=50, y= 150)

tk.Label(window, text='Password:').place(x=50, y= 190)

var_usr_name=tk.StringVar()

var_usr_name.set('example@python.com')

entry_usr_name= tk.Entry(window, textvariable=var_usr_name)

entry_usr_name.place(x=160, y=150)

var_usr_pwd=tk.StringVar()

entry_usr_pwd= tk.Entry(window, textvariable=var_usr_pwd, show='*')

entry_usr_pwd.place(x=160, y=190)defusr_login():pass

defusr_sign_up():pass

#login and sign up button

btn_login = tk.Button(window, text='Login', command=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)

window.mainloop()

3.2 例子1 登录窗口

本节添加了Login的功能,代码如下:

defusr_login():

usr_name=var_usr_name.get()

usr_pwd=var_usr_pwd.get()try:

with open('usrs_info.pickle', 'rb') as usr_file:

usrs_info=pickle.load(usr_file)exceptFileNotFoundError:

with open('usrs_info.pickle', 'wb') as usr_file:

usrs_info= {'admin': 'admin'}

pickle.dump(usrs_info, usr_file)if usr_name inusrs_info:if usr_pwd ==usrs_info[usr_name]:

tk.messagebox.showinfo(title='Welcome', message='How are you?' +usr_name)else:

tk.messagebox.showerror(message='Error, your password is wrong, try again.')else:

is_sign_up= tk.messagebox.askyesno('Welcome','You have not sign up yet. Sign up today?')ifis_sign_up:

usr_sign_up()

首先以读二进制的方式打开并下载存储用户信息的文件,如果文件不存在,则建立该文件,并且加入了用户名为admin、密码为admin的用户。

如果用户名在用户信息文件中存在,密码输入正确时,会弹出欢迎窗口,否则则显示密码错误。

如果用户不存在,则弹出窗口询问是否要进行注册,并通过返回的True或是False的值进行注册操作。

运行结果如下所示:

输入密码错误时:

1212449-20170901164204999-144808161.png

正确输入密码时:

1212449-20170901164242233-654399170.png

用户不存在时:

1212449-20170901164303343-1879208960.png

3.3 例子1 登录窗口

注册时将会弹出新窗口,如下所示:

1212449-20170901170133296-438981566.png

首先定义一个新窗口

window_sign_up=tk.Toplevel(window)

window_sign_up.geometry('350x200')

window_sign_up.title('Sign up window')

定义User name、Password和Confirm password,以及三个Entry和一个Button

new_name =tk.StringVar()

new_name.set('example@python.com')

tk.Label(window_sign_up, text='User name:').place(x=10, y= 10)

entry_new_name= tk.Entry(window_sign_up, textvariable=new_name)

entry_new_name.place(x=150, y=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)

btn_confirm_sign_up= tk.Button(window_sign_up, text='Sign up', command=sign_to_Mofan_Python)

btn_confirm_sign_up.place(x=150, y=130)

接着定义函数sign_to_Mofan_Python

defsign_to_Mofan_Python():

np=new_pwd.get()

npf=new_pwd_confirm.get()

nn=new_name.get()

with open('usrs_info.pickle', 'rb') as usr_file:

exist_usr_info=pickle.load(usr_file)if np !=npf:

tk.messagebox.showerror('Error', 'Password and confirm password must be the same!')elif nn inexist_usr_info:

tk.messagebox.showerror('Error', 'The user has already signed up!')else:

exist_usr_info[nn]=np

with 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()

打开读取文件usrs_info,首先判断密码是否相等,如果不相等,则弹出窗口提示密码输入不一致

如果用户名存在,则弹出窗口提示用户名已经注册

注册合格的话,则将信息存放,pickle里面存放的是一个字典,exist_usr_info[nn] =np该句即为username:password,通过dump将新的注册信息传入到用户信息文件中。并弹出窗口提示注册成功

最后通过destory关闭注册窗口

完整代码如下:

defusr_sign_up():defsign_to_Mofan_Python():

np=new_pwd.get()

npf=new_pwd_confirm.get()

nn=new_name.get()

with open('usrs_info.pickle', 'rb') as usr_file:

exist_usr_info=pickle.load(usr_file)if np !=npf:

tk.messagebox.showerror('Error', 'Password and confirm password must be the same!')elif nn inexist_usr_info:

tk.messagebox.showerror('Error', 'The user has already signed up!')else:

exist_usr_info[nn]=np

with 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()

window_sign_up=tk.Toplevel(window)

window_sign_up.geometry('350x200')

window_sign_up.title('Sign up window')

new_name=tk.StringVar()

new_name.set('example@python.com')

tk.Label(window_sign_up, text='User name:').place(x=10, y=10)

entry_new_name= tk.Entry(window_sign_up, textvariable=new_name)

entry_new_name.place(x=150, y=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)

btn_confirm_sign_up= tk.Button(window_sign_up, text='Sign up', command=sign_to_Mofan_Python)

btn_confirm_sign_up.place(x=150, y=130)

运行结果如下所示:

当用户名已存在时:

1212449-20170901172859015-1728522219.png

当密码输入不一致时:

1212449-20170901173011233-362264083.png

当注册成功时:

1212449-20170901173054437-391473976.png

点击确定后注册窗口关闭

用注册的用户进行登录,弹出窗口:

1212449-20170901173130155-1114473151.png

这篇关于python3.7运行界面_Python初学——窗口视窗Tkinter的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744445

相关文章

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

22.手绘Spring DI运行时序图

1.依赖注入发生的时间 当Spring loC容器完成了 Bean定义资源的定位、载入和解析注册以后,loC容器中已经管理类Bean 定义的相关数据,但是此时loC容器还没有对所管理的Bean进行依赖注入,依赖注入在以下两种情况 发生: 、用户第一次调用getBean()方法时,loC容器触发依赖注入。 、当用户在配置文件中将<bean>元素配置了 lazy-init二false属性,即让

21.手绘Spring IOC运行时序图

1.再谈IOC与 DI IOC(lnversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创 建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让 容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们所看到的配置文件。 DI(Dependency Injection)依赖注入:就是指对象是被动接受依赖类

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请尝试使用 st.altair_chart 指定所需的图表。 Function signa

python实现最简单循环神经网络(RNNs)

Recurrent Neural Networks(RNNs) 的模型: 上图中红色部分是输入向量。文本、单词、数据都是输入,在网络里都以向量的形式进行表示。 绿色部分是隐藏向量。是加工处理过程。 蓝色部分是输出向量。 python代码表示如下: rnn = RNN()y = rnn.step(x) # x为输入向量,y为输出向量 RNNs神经网络由神经元组成, python

python 喷泉码

因为要完成毕业设计,毕业设计做的是数据分发与传输的东西。在网络中数据容易丢失,所以我用fountain code做所发送数据包的数据恢复。fountain code属于有限域编码的一部分,有很广泛的应用。 我们日常生活中使用的二维码,就用到foutain code做数据恢复。你遮住二维码的四分之一,用手机的相机也照样能识别。你遮住的四分之一就相当于丢失的数据包。 为了实现并理解foutain

python 点滴学

1 python 里面tuple是无法改变的 tuple = (1,),计算tuple里面只有一个元素,也要加上逗号 2  1 毕业论文改 2 leetcode第一题做出来