八年级上册¶

第一单元 用计算机程序解决问题¶

第6节 开发图形界面程序¶

一、图形界面程序¶

In [2]:
# 2.tkinter-建立窗口
import tkinter as tk # 导入tkinter并简化命名为tk
win = tk.Tk() # 建立变量名为win的图形化界面窗口
win.mainloop() # 接受各类响应事件
In [5]:
import tkinter as tk
win = tk.Tk()
win.geometry('320x240+104+70') # 以”宽x高+x+y”格式
win.title('受邀人员管理程序') # 设置窗口标题
win.mainloop()

体验活动: 课堂抽签程序¶

In [6]:
#### 体验活动: 课堂抽签程序
# 摇奖抽奖

import tkinter as tk
import random


flag = False  # 若flag=True则姓名变化中,否则不变。
# 抽奖姓名
names = ['林黛玉', '薛宝钗', '贾元春', '贾迎春', '贾探春', '贾惜春', '李纨', '妙玉',
     '史湘云', '王熙凤', '贾巧姐', '秦可卿', '晴雯', '麝月', '袭人', '鸳鸯',
     '雪雁', '紫鹃', '碧痕', '平儿', '香菱', '金钏', '司棋', '抱琴', '赖大',
     '焦大', '王善保', '周瑞', '林之孝', '乌进孝', '包勇', '吴贵', '吴新登',
     '邓好时', '王柱儿', '余信', '庆儿', '昭儿', '兴儿', '隆儿', '坠儿', '喜儿',
     '寿儿', '丰儿', '住儿', '小舍儿', '李十儿', '玉柱儿']
def myfun():
    global flag
    btn['text'] = '停止' if not flag else '开始'
    flag = not flag
    if flag:
        myfun1()

def myfun1():
    if flag:
        lbl['text'] = random.choice(names)
        print(lbl['text'])
        win.after(100, myfun1)
    

win = tk.Tk()
win.title('课堂抽签程序')

lbl = tk.Label(win, text='****', width=6, font="-family {Times New Roman} -size 72 -weight bold")
btn = tk.Button(win, text='开始', command=myfun, font='-size 36')
lbl.grid(row=0, column=0)
btn.grid(row=0, column=1, padx=10)

win.mainloop()
寿儿
住儿
雪雁
王熙凤
住儿
吴新登
袭人
王熙凤
紫鹃
王善保

二、开发图形界面程序¶

In [ ]:
import tkinter as tk
def mySelect(event):
    '''响应列表选择事件'''
    index = lbx.curselection()  # 获取所选项的索引放入index序列变量中
    if index:
        index = index[0]  # 取首项(单选只需取一项)
        txt.delete(0,'end')  # 输入框清空
        txt.insert(0,lbx.get(index))  # 把所选项的姓名插入输入框中


def myDelete():
    '''响应删除按钮'''
    index = lbx.curselection()
    if index:
        index = index[0]
        lbx.delete(index)  # 删除列表框中的所选项


def myUpdate():
    '''响应修改按钮'''
    index = lbx.curselection()
    if index:
        index = index[0]
        lbx.delete(index)  # 删除列表框中的所选项
        lbx.insert(index, txt.get())  # 把更新后内容插入到列表框所选位置


def myAdd():
    '''响应增加按钮'''
    item = txt.get()  # 获取输入框的内容
    if item:
        lbx.insert('end', item)  # 在列表框末位增加内容

# 建立窗口
win = tk.Tk()
win.title('受邀人员管理程序')
win.geometry('420x320')
# 定义组件
lbl = tk.Label(win, text='选择一行【删除】或在文本框中修改后按【修改】或【增加】')
lbx = tk.Listbox(win)
lbx.insert(0,*['张三', '李四'])
txt = tk.Entry(win)
btn1 = tk.Button(win, text='删除')
btn2 = tk.Button(win, text='修改')
btn3 = tk.Button(win, text='增加')
# 组件布局
lbl.grid(row=0, column=0, columnspan=2,padx=10, pady=10)
lbx.grid(row=1, column=0, rowspan=4)
txt.grid(row=1, column=1)
btn1.grid(row=2, column=1)
btn2.grid(row=3, column=1)
btn3.grid(row=4, column=1)
# 事件
lbx.bind('<<ListboxSelect>>',mySelect)
btn1.config(command=myDelete)
btn2.config(command=myUpdate)
btn3.config(command=myAdd)
# 接受各类事件响应
win.mainloop()

实践活动:完善受邀人员管理程序¶

In [2]:
# 技术支持 - 提供了 photo1.png和photo2.png这2张图片素材
import tkinter as tk
win = tk.Tk()
img = tk.PhotoImage(file='photo1.png') # 读取图片
lbl = tk.Label(win, image=img) # 标签显示图片
lbl.pack()
win.mainloop()
In [1]:
# 提供给学生源程序供学生修改
import tkinter as tk
def mySelect(event):
    '''响应列表选择事件'''
    index = lbx.curselection()  # 获取所选项的索引放入index序列变量中
    if index:
        index = index[0]  # 取首项(单选只需取一项)
        txt.delete(0,'end')  # 输入框清空
        txt.insert(0,lbx.get(index))  # 把所选项的姓名插入输入框中


def myDelete():
    '''响应删除按钮'''
    index = lbx.curselection()
    if index:
        index = index[0]
        lbx.delete(index)  # 删除列表框中的所选项


def myUpdate():
    '''响应修改按钮'''
    index = lbx.curselection()
    if index:
        index = index[0]
        lbx.delete(index)  # 删除列表框中的所选项
        lbx.insert(index, txt.get())  # 把更新后内容插入到列表框所选位置


def myAdd():
    '''响应增加按钮'''
    item = txt.get()  # 获取输入框的内容
    if item:
        lbx.insert('end', item)  # 在列表框末位增加内容

# 建立窗口
win = tk.Tk()
win.title('受邀人员管理程序')
win.geometry('420x320')
# 定义组件
lbl = tk.Label(win, text='选择一行【删除】或在文本框中修改后按【修改】或【增加】')
lbx = tk.Listbox(win)
lbx.insert(0,*['张三', '李四'])
txt = tk.Entry(win)
btn1 = tk.Button(win, text='删除')
btn2 = tk.Button(win, text='修改')
btn3 = tk.Button(win, text='增加')
# 组件布局
lbl.grid(row=0, column=0, columnspan=2,padx=10, pady=10)
lbx.grid(row=1, column=0, rowspan=4)
txt.grid(row=1, column=1)
btn1.grid(row=2, column=1)
btn2.grid(row=3, column=1)
btn3.grid(row=4, column=1)
# 事件
lbx.bind('<<ListboxSelect>>',mySelect)
btn1.config(command=myDelete)
btn2.config(command=myUpdate)
btn3.config(command=myAdd)
# 接受各类事件响应
win.mainloop()
In [9]:
# 参考程序 - 实现了用文件保存
import tkinter as tk
import os
def mySelect(event):
    '''响应列表选择事件'''
    index = lbx.curselection()  # 获取所选项的索引放入index序列变量中
    if index:
        index = index[0]  # 取首项(单选只需取一项)
        txt.delete(0,'end')  # 输入框清空
        txt.insert(0,lbx.get(index))  # 把所选项的姓名插入输入框中


def myDelete():
    '''响应删除按钮'''
    index = lbx.curselection()
    if index:
        index = index[0]
        lbx.delete(index)  # 删除列表框中的所选项
        updateFile('删除')


def myUpdate():
    '''响应修改按钮'''
    index = lbx.curselection()
    if index:
        index = index[0]
        lbx.delete(index)  # 删除列表框中的所选项
        lbx.insert(index, txt.get())  # 把更新后内容插入到列表框所选位置
        updateFile('修改')


def myAdd():
    '''响应增加按钮'''
    item = txt.get()  # 获取输入框的内容
    if item:
        lbx.insert('end', item)  # 在列表框末位增加内容
        updateFile('新增')

def updateFile(event):
    with open('people.txt', 'w', encoding='UTF-8') as f:
        names = lbx.get(0, 'end')
        for name in names:
            print(name,file=f)
    win.title('受邀人员管理程序-{}已保存'.format(event))

    
# 建立窗口
win = tk.Tk()
win.title('受邀人员管理程序')
win.geometry('420x320')
# 定义组件
lbl = tk.Label(win, text='选择一行【删除】或在文本框中修改后按【修改】或【增加】')
lbx = tk.Listbox(win)
# 验证本地文件
if not os.path.exists('people.txt'):
    with open('people.txt', 'w', encoding='UTF-8') as f:
        f.write('张三\n李四')
with open('people.txt', 'r', encoding='UTF-8') as f:
    names = f.readlines()
    for name in names:
        lbx.insert('end', name.strip())
txt = tk.Entry(win)
btn1 = tk.Button(win, text='删除')
btn2 = tk.Button(win, text='修改')
btn3 = tk.Button(win, text='增加')
# 组件布局
lbl.grid(row=0, column=0, columnspan=2,padx=10, pady=10)
lbx.grid(row=1, column=0, rowspan=4)
txt.grid(row=1, column=1)
btn1.grid(row=2, column=1)
btn2.grid(row=3, column=1)
btn3.grid(row=4, column=1)
# 事件
lbx.bind('<<ListboxSelect>>',mySelect)
btn1.config(command=myDelete)
btn2.config(command=myUpdate)
btn3.config(command=myAdd)
# 接受各类事件响应
win.mainloop()
In [1]:
# 参考程序 - 实现了用文件保存与图片显示,照片文件名为:姓名.png,否则随机显示给定的2张图片
import tkinter as tk
import os
import random
from PIL import Image,ImageTk
def mySelect(event):
    '''响应列表选择事件'''
    index = lbx.curselection()  # 获取所选项的索引放入index序列变量中
    if index:
        index = index[0]  # 取首项(单选只需取一项)
        txt.delete(0,'end')  # 输入框清空
        txt.insert(0,lbx.get(index))  # 把所选项的姓名插入输入框中
        # 照片显示,需要PIL库支持,可用 pip install pillow 安装
        imgFile = '{}.png'.format(lbx.get(index))
        if not os.path.exists(imgFile):
            imgFile = random.choice(['photo1.png','photo2.png'])
        Img = Image.open(imgFile).resize((144,172))
        img = ImageTk.PhotoImage(Img)
        lblImg.img = img
        lblImg['image'] = img


def myDelete():
    '''响应删除按钮'''
    index = lbx.curselection()
    if index:
        index = index[0]
        lbx.delete(index)  # 删除列表框中的所选项
        updateFile()


def myUpdate():
    '''响应修改按钮'''
    index = lbx.curselection()
    if index:
        index = index[0]
        lbx.delete(index)  # 删除列表框中的所选项
        lbx.insert(index, txt.get())  # 把更新后内容插入到列表框所选位置
        updateFile()


def myAdd():
    '''响应增加按钮'''
    item = txt.get()  # 获取输入框的内容
    if item:
        lbx.insert('end', item)  # 在列表框末位增加内容
        updateFile()

def updateFile():
    with open('people.txt', 'w', encoding='UTF-8') as f:
        names = lbx.get(0, 'end')
        for name in names:
            print(name,file=f)
    win.title('受邀人员管理程序-已保存')

    
# 建立窗口
win = tk.Tk()
win.title('受邀人员管理程序')
win.geometry('420x320')
# 定义组件
lbl = tk.Label(win, text='选择一行【删除】或在文本框中修改后按【修改】或【增加】')
lbx = tk.Listbox(win)
# 验证本地文件
if not os.path.exists('people.txt'):
    with open('people.txt', 'w', encoding='UTF-8') as f:
        f.write('张三\n李四')
with open('people.txt', 'r', encoding='UTF-8') as f:
    names = f.readlines()
    for name in names:
        lbx.insert('end', name.strip())
txt = tk.Entry(win)
btn1 = tk.Button(win, text='删除')
btn2 = tk.Button(win, text='修改')
btn3 = tk.Button(win, text='增加')
lblImg = tk.Label(win)
# 组件布局
lbl.grid(row=0, column=0, columnspan=3,padx=10, pady=10)
lbx.grid(row=1, column=0, rowspan=4)
txt.grid(row=1, column=1)
lblImg.grid(row=2,column=1, rowspan=3)
btn1.grid(row=2, column=2)
btn2.grid(row=3, column=2)
btn3.grid(row=4, column=2)

# 事件
lbx.bind('<<ListboxSelect>>',mySelect)
btn1.config(command=myDelete)
btn2.config(command=myUpdate)
btn3.config(command=myAdd)
# 接受各类事件响应
win.mainloop()
In [ ]: