我们前面实现的都是基于控制台的程序,程序和用户的交互通过控制台来完成。而GUI图形界面化编程则是我们快速的实现图形界面和用户的交互。GUI编程类似于“搭积木”,将一个个组建(Widget)放在窗口中。
上面的各种按钮、菜单、编辑区等都是一个个组建,他们都放置到窗口中,并通过增加“对事件的处理”成为一个完整的程序。
from tkinter import *
root = Tk()
2、在主窗口中,添加各种可视化组件,比如:按钮(Button)、文本框(Label)等。
btn01 = Button(root)
btn01["text"] = "点我就送花"
btn01.pack()
3、通过几何布局管理器,管理组件的大小和位置
btn01.pack()
4、事件处理
(1) 通过绑定事件处理程序,响应用户操作所触发的事件(比如:单击、双击等)
def songhua(e):
messagebox.showinfo("Message","送你一朵玫瑰花,请你爱上我")
print("送你 99 朵玫瑰花")
btn01.bind("" ,songhua)
from tkinter import *
from tkinter import messagebox
# 1、创建窗口对象---创建一个窗口(主窗口)
root = Tk()
# 定义一个事件---Button按钮的意思
# 传入root的意思是绑定主窗口
btn01 = Button(root)
btn01['text'] = '点我就送一朵鲜花'
# 排列按钮(就是将btn01挂在主窗口root上)
btn01.pack()
def resign(event):
messagebox.showinfo('message', '送你一朵玫瑰花,今晚你就属于我吧!')
print('送了一朵花!')
# 绑定一个事件,调用方法
btn01.bind('' , resign)
# 设置一个主窗口标题
root.title('第一个GUI')
# 设定长宽高
root.geometry('300x300+200+300')
# 运行组件---显示出一个窗口(类似与一个死循环)
# 调用组件---root.mainloop()
root.mainloop()
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self, master=None):
# 调用父类(Frame)中的init方法
super().__init__(master)
# 继承了Frame类之后,在现有类中重写了init方法,就需要重新调用原有父类的init方法。使用super方法。
self.master = master
self.pack()
# 将生成的效果排布在框架(窗口对象)---挂在主窗口上。
self.pack()
# 调用createWidet方法
self.createWidet()
# 创建(添加)组件
def createWidet(self):
self.btn01 = Button(self)
self.btn01['text'] = '点击送花'
# pack就是布局的作用,将配件布局到窗口中
self.btn01.pack()
# 做出声明,调用resign方法
self.btn01['command'] = self.resign
# 加上退出按钮
self.btn02 = Button(self, text='推出', command=root.destroy)
self.btn02.pack()
def resign(self):
messagebox.showinfo('message', '送你一朵玫瑰花,今晚你就属于我吧!')
if __name__ == '__main__':
# 创建一个主窗口
root = Tk()
# 设定主窗口的参数(长宽高)
root.geometry('300x300+400+300')
# 创建主窗口的标题
root.title('GUI的经典类的写法!')
# 绑定(root)框架
app = Application(master=root)
# 调用组件---root.mainloop()
root.mainloop()
注:创建(添加)组建是可以更改的,其他的基本上不需要更改。
from tkinter import *
root = Tk()
root.title("测试主窗口的位置和大小")
root.geometry("500x400+100+200") #宽度 500,高度 400;距 屏幕左边 100,距屏幕上边 200
root.mainloop()
打印输出结果:
"""测试一个经典的 GUI 程序的写法,使用面向对象的方式"""
from tkinter import *
from tkinter import messagebox
class Application(Frame):
"""一个经典的 GUI 程序的类的写法"""
def __init__(self, master=None):
super().__init__(master) # super()代表的是父类的定义,而不是父类对象
self.master = master
self.pack()
self.createWidget()
def createWidget(self):
"""创建组件"""
self.btn01 = Button(self)
self.btn01["text"] = "点击送花"
self.btn01.pack()
self.btn01["command"] = self.songhua
# 创建一个退出按钮
self.btnQuit = Button(self, text="退出",command=root.destroy)
self.btnQuit.pack()
def songhua(self):
messagebox.showinfo("送花","送你 99 朵玫瑰花")
if __name__ == '__main__':
root = Tk()
root.geometry("400x100+200+300")
root.title("一个经典的 GUI 程序类的测试")
app = Application(master=root)
root.mainloop()
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self, master=None):
# 调用父类(Frame)中的init方法
super().__init__(master)
# 继承了Frame类之后,在现有类中重写了init方法,就需要重新调用原有父类的init方法。使用super方法。
self.master = master
self.pack()
# 将生成的效果排布在框架(窗口对象)---挂在主窗口上。
self.pack()
# 调用createWidet方法
self.createWidet()
# 创建(添加)组件
def createWidet(self):
"""创建组件"""
# width=10, height=2---文本框的长宽
self.lable01 = Label(self, text='逻辑教育', width=10, height=2, bg='black', fg='white')
# self.lable01['text'] = 'logic'
# self.lable01.config(bg='black',fg='white')
# pack()布局排布
self.lable01.pack()
# bg='black', fg='white'---文本的前景颜色与背景颜色
# font=('宋体', 20)--- 设定文本标签的字体和字号大小
self.lable02 = Label(self, text='王佳欣', width=10, height=2,bg='black', fg='white', font=('宋体', 20))
self.lable02.pack()
# 添加图片
# 声明全局变量
global image
image = PhotoImage(file='imges/logic.gif')
# 将图片作为标签,排布在主窗口
self.lable03 = Label(self, image=image)
self.lable03.pack()
# borderwidth---边框的意思
# relief---边框属于实现
self.lable04 = Label(self, text='王佳欣\n干饭王\n帅哥一枚', borderwidth=1, relief='solid', justify='right')
self.lable04.pack()
if __name__ == '__main__':
# 创建一个主窗口
root = Tk()
# 设定主窗口的参数(长宽高)
root.geometry('300x300+400+300')
# 创建主窗口的标题
root.title('GUI的经典类的写法!')
# 绑定(root)框架
app = Application(master=root)
# 调用组件---root.mainloop()
root.mainloop()
fred = Button(self, fg="red", bg="blue")
2、创建对象后,使用字典索引方式
fred["fg"] = "red"
fred["bg"] = "blue"
3、创建对象后,使用config()方法
red.config(fg="red", bg="blue")
print(fred.config())
2、通过在IDE中,点击组件对象的构造方法,进入到方法内观察:
我们可以看到如下的代码:
class Button(Widget):
"""Button widget."""
def __init__(self, master=None, cnf={
}, **kw):
"""Construct a button widget with the parent MASTER.
STAND