Tkinter is Python's de-facto standard GUI (Graphical User Interface) package.

目的

Python选课作业是设计一个由Tkinter开发的GUI小程序,开始游戏,绘制小人并从字库中随机获取一个单词,再随机挖空,如果在小人绘制时间内填空正确,则游戏成功。界面大致如下:

需要了解的基本组件

  • Button  按钮控件;在程序中显示按钮。
  • Canvas  画布控件;显示图形元素如线条或文本。
  • Entry  输入控件;用于显示简单的文本内容。
  • LabelFrame 一个简单的容器控件。常用与复杂的窗口布局。
  • tkMessageBox  用于显示你应用程序的消息框。

示例:

Button(LF,text="开始游戏",command=p.head)
Canvas(root,width=110,height=100)
Entry(root,state = self.ifShow(), textvariable = self.e[i], width=2, validate='key', validatecommand=(goNextCommand, i,'%S'))
LabelFrame(height = 50,width = 250,text = "选择游戏")
Messagebox.showinfo(title='提示', message = "请等待绘制完成!")

需要了解的基本布局

  • pack() 通过相对位置控制控件在容器中的位置
    • side:TOP | BOTTOM | LEFT | RIGHT
    • anchor:N | S | W | E | NW | SW | NE | SE | CENTER
    • expand(忽略side):YES | NO
    • fill(expand = YES):X | Y | BOTH
    • ipadx, ipady
    • padx, pady
  • grid() 网格布局
    • row, column
    • rowspan, columnspan
    • sticky:N | S | W | E | NW | SW | NE | SE | CENTER
    • ipadx, ipady
    • padx, pady
  • place() 精确控制控件在容器中的位置
    • anchor:N | S | W | E | NW | SW | NE | SE | CENTER
    • bordermode: INSIDE | OUTSIDE
    • height, width
    • relheight, relwidth
    • x, y
    • relx, rely

中文文档很少,以上给出了参数,不懂的自己试一试就知道了。

开始

引入Tkinter库

from tkinter import * #linux下T是大写的

根视图

root = Tk()
root.title("一个小游戏")
root.geometry('310x350+200+100') #窗口大小310*350和打开后在屏幕的坐标(200,100)

按钮区域的小框和新建Canvas组件

LF = LabelFrame(height = 50,width = 250,text = "选择游戏")
cv = Canvas(root,width=110,height=100)

绘制小人的类

class People:
    def __init__(self):
        self.data=cv
        self.start=1 #用于判断是否在绘制小人的过程中
        self.frit=1  #判断是否是第一次绘制小人
    def head(self):
        if self.frit==0 or self.start==0:
            showinfo(title='提示', message = "请点击在玩一次!")
            return
        self.start=0
        t.val=[]  #t是文本框类的成员,用于初始化文本框内容
        t.real=0
        t.line()
        self.data.create_oval(25, 30, 35, 40, tags = "two")
        self.data.after(2000,self.body)
    def body(self):
        self.data.create_line(30, 40, 30, 57, tags = "two")
        self.data.after(2000,self.hand)
    def hand(self):
        self.data.create_line(30, 45, 20, 40, tags = "two")
        self.data.create_line(30, 45, 40, 40, tags = "two")
        self.data.after(1000,self.foot)
    def foot(self):
        self.data.create_line(30, 57, 20, 62, tags = "two")
        self.data.create_line(30, 57, 40, 62, tags = "two")
        self.start=1
        self.frit=0
        if t.val !=1:
            t.capche(1) #在绘制小人完后进行一次文本框验证
    def dell(self):
        self.frit=1
        if(self.start==1):
            for i in self.data.find_withtag('two'):
                self.data.delete(i)
            self.data.after(500,self.head)
        else:
            showinfo(title='提示', message = "请等待绘制完成!")

文本框的类


class Text:
    def __init__(self):
        self.data = ''
        f = open(".\word.txt","r") #word.txt是几个6字单词
        lines = f.readlines()
        self.linw = lines[rand()] #随机获取那个单词
        self.text = {}        #用来存储6个文本类型的控件
        self.e = {}         #6个StringVar()类型数据
        self.mun = [0,1,2,3,4,5]
        for i in self.mun:
            self.e[i] = StringVar()  #初始化为StringVar()类型,用于动态修改文本框属性
        self.val = []
        self.real = 0
    def showText(self,a):   #用来返回要显示的字母并将所有字母添加到self.val变量中
        if self.data == 'disabled':
            print(self.linw[a])
            self.val.append(self.linw[a])
            return self.linw[a]
        else:
            self.val.append(self.linw[a])
            return ''
    def ifShow(self):  #用来随机是否挖空
        if(random.random()>0.4):
            self.data ='normal'
        else:
            self.data ='disabled'
        return self.data
    def goNext(self,i,a):  #实现自动化跳到下一个文本框
        ii = i = int(i)
        if self.real==1 and i<5:
            while(i<5):
                if self.text[i+1]['state'] == 'normal':
                    self.text[i+1].focus_set()
                    break
                i=i+1
                if i==5 and a!='':
                    self.e[ii].set(a)
                    self.capche(1)
        elif i==5 and a!='':
            self.e[i].set(a)
            self.capche(1)
        return True
    def line(self):   #初始化6个文本框并绑定验证函数
        goNextCommand = root.register(self.goNext)
        for i in self.mun:
            self.text[i] = Entry(root,state = self.ifShow(), textvariable = self.e[i], width=2, validate='key', validatecommand=(goNextCommand, i,'%S'))
            self.e[i].set(self.showText(i))
            self.text[i].place(relx=0.4+0.05*i,rely=0.5)
        for i in self.mun:
            cc = self.text[i]
            if cc['state'] == 'normal':
                self.text[i].focus_set()
                break
        self.real=1
        print(self.val)
    def capche(self,e):  #验证输入是否正确
        if p.start == 1:
            showerror(title='提示', message = "超时!")
            return
        e=[]
        for i in self.mun:
            e.append(self.text[i].get())
        if e == self.val:
            self.val=1
            showinfo(title='提示', message = "猜词正确!")
        else:
            showerror(title='提示', message = "猜词错误!")

针对按钮的初始化


def start():  #启动初始化
    cv.create_line(0, 100, 120, 100, fill="black",width=3)
    cv.create_line(60, 100, 60, 10, width=2)
    cv.create_line(60, 10, 30, 10, width=2)
    cv.create_line(30, 10, 30, 30, width=2)

    
def stop():  #退出按钮事件
    quit()

#按钮初始化
b1 = Button(LF,text="开始游戏",command=p.head)
b2 = Button(LF,text="再玩一次",command=p.dell)
b3 = Button(LF,text="结束游戏",command=stop)

#按钮布局初始化
b1.grid(row=1,column=1,padx=10,pady=10)
b2.grid(row=1,column=2,padx=10,pady=10)
b3.grid(row=1,column=3,padx=10,pady=10)

LF.pack(pady=15)#按钮框架初始化

start()

p.data.place(relx=0.1,rely=0.4)#小人Canvas组件布局

root.bind("", t.capche)#绑定回车事件

root.mainloop()#进入消息主循环

推荐的参考文档

  1. 官方给出的文档列表https://wiki.python.org/moin/TkInter
  2. 最值得一看的文档http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html
  3. 针对Entry的简单中文文档https://www.cnblogs.com/monsteryang/p/6575877.html
  4. 特别全的一个英文文档http://effbot.org/tkinterbook/(我眼花缭乱~)

完整代码https://github.com/XinRoom/task/blob/master/python/Python_tk_V3.py

更新于:2018-02-01