Python2.7 Tkinter 简单登录界面和弹球游戏

简单的学习了Tkinter模块后,今天突然想使用Tkinter来创建一个登陆注册的界面,同时顺便把前几天写的弹球游戏放上去... ... 嗯! (ˇˍˇ) 怎么感觉有点奇怪喃,不管那么多了!另外关于登录和注册的具体实现过程我就没有去做了,毕竟只是做一个初级的演示和记录,当然你可以结合数据库来做甚至可以用文件读写的方式来实现验证登录和注册。

涉及的组件有:菜单、画布、标签、按钮、单行文本

实现的功能有:菜单中的退出、游戏以及Tkinter官方文档链接。按钮中的注册(切换到注册界面)和取消

环境:
系统:win7 64位(Linux下窗口效果略微不同)
工具:Python2.7(64位) +Pycharm
模块:Tkinter(内置)+PIL(与Python3.x中tkinter有差异)

1.效果

主界面
注册界面
下拉菜单
弹球

2.代码

三个py文件:Main.py(菜单、画布和背景)、Button_label.py(按钮、标签、单行文本框)、Bat_ball.py(附加的游戏)

Main.py

# -*- coding: UTF-8 -*-

from Tkinter import *
from Button_label import *
from PIL import ImageTk
import Bat_ball
import webbrowser

#创建主窗口对象,并定义大小(固定)和位置,添加窗口icon
wind = Tk()
title = "XXX登录XX"
wind.title(title.center(72,' '))
wind.geometry("500x240+400+240")
wind.resizable(0,0)
wind.iconbitmap('login.ico')

#创建菜单容器
menubar = Menu(wind)
wind.config(menu = menubar)

#实例化菜单1,创建下拉菜单,调用add_separate创建分割线
menu1 = Menu(menubar,tearoff = 0)
menubar.add_cascade(label = "编辑",menu = menu1)
menu1.add_command(label = "未使用")
menu1.add_separator()
menu1.add_command(label = "退出",command = wind.quit)

#创建菜单2,分别添加图片(24xp)
# 下拉菜单弹球游戏使用command执行函数调用函数
menu2 = Menu(menubar,tearoff = 0)
menubar.add_cascade(label = "更多",menu = menu2)
imgGame = ImageTk.PhotoImage(file="game.png")
menu2.add_command(label = "弹球游戏",image = imgGame ,compound= "left",command = lambda :Bat_ball.gamerun())

#Tkinter菜单打开网页
imgHelp = ImageTk.PhotoImage(file="help.png")
menu2.add_command(label = "Tkinter",image = imgHelp,compound = "left",command =
                 lambda:webbrowser.open("http://effbot.org/tkinterbook/tkinter-index.htm"))

#创建画布并将背景图添加到画布上,使用place布局格式(绝对坐标,单位像素)
photo = PhotoImage(file = "main_bg.gif")
canvas = Canvas(wind,width = 500,height = 240)
canvas.create_image(250,120,anchor =CENTER,image = photo)
canvas.place(x= 0,y=0)

#调用主界面控件函数
mainBL(canvas,wind)

#主循环
wind.mainloop()

Button_label.py

# -*- coding: UTF-8 -*-
from Tkinter import *

#主界面组件函数
def mainBL(canvas,wind):

    #创建登录标签与单行文本
    label_login = Label(wind, text="Name:", anchor="center", bg="white")
    label_login.place(x=20, y=20, width=50, height=24, anchor="nw")
    text_name = Entry(wind)
    text_name.place(x=70, y=20, width=120)
    #创建密码标签与单行文本
    label_pass = Label(wind, text="Password:", anchor="center", bg="white")
    label_pass.place(x=280, y=20, width=80, height=24, anchor="nw")
    text_pass = Entry(wind,show = "*")
    text_pass.place(x=360, y=20, width=120)

    #创建登录按钮
    button_login = Button(wind,text = "登录",anchor = "center",activebackground="red",bg = "white",
                          relief="flat")
    button_login.place(x = 100,y=80,width = 60)

    #创建注册按钮,点击执行redraw函数
    button_registry = Button(wind,text = "注册",anchor = "center",activebackground="red",bg = "white",
                             relief="flat",command=lambda :redraw())
    button_registry.place(x = 230,y=80,width = 60)

    #取消按钮,清除文本框输入内容
    button_cancel = Button(wind,text = "取消",anchor = "center",activebackground="red" ,bg = "white",
                           relief="flat" ,command = lambda:(text_name.delete(0,END),text_pass.delete(0,END)))
    button_cancel.place(x = 350,y=80,width = 60)

    #销毁主界面控件
    def redraw():
        label_login.destroy()
        text_name.destroy()
        label_pass.destroy()
        text_pass.destroy()
        button_login.destroy()
        button_registry.destroy()
        button_cancel.destroy()

        #销毁过后调用注册界面组件函数
        registryDetop(canvas,wind)


#注册界面组件函数
def registryDetop(canvas,wind):


    reName_name = canvas.create_text(180,30,text="昵称:",font = "叶根友毛笔行书2.0版 15 bold",fill="white")
    reName_text = Entry(wind)
    reName_text.place(x = 210,y = 20,width =150)


    rePass_name = canvas.create_text(180,80,text="密码:",font = "叶根友毛笔行书2.0版 15 bold",fill="orange")
    rePass_text = Entry(wind)
    rePass_text.place(x = 210,y = 70,width =150)


    reMail_name = canvas.create_text(180,130,text="邮箱:",font = "叶根友毛笔行书2.0版 15 bold",fill="green")
    reMail_text = Entry(wind)
    reMail_text.place(x = 210,y = 120,width =150)

    reButton = Button(wind,text = "确定",bg ="white")
    reButton.place(x = 170,y = 170)

    canButton = Button(wind,text = "取消",bg ="white",command =lambda:
    (reName_text.delete(0,END),rePass_text.delete(0,END),reMail_text.delete(0,END)))
    canButton.place(x = 290,y = 170)

Bat_ball.py

# -*- coding: UTF-8 -*-

from Tkinter import *
import random
import time

def gamerun():

    #定义主窗口
    windgame = Tk()
    windgame.geometry("700x600+100+00")
    windgame.title("弹球游戏")
    windgame.resizable(0,0)

    #创建画布和记分牌(并刷新显示)
    canvasgame = Canvas(windgame, width = 700,height = 600,bg= "aliceblue")
    coreid=canvasgame.create_text(600,0,text = "记分牌\n分数:0",font = ('Cambria',10),anchor = "n",justify = "center")
    canvasgame.pack()
    windgame.update()

    #随机取小球初始化位置
    positions = (20,50,80,130,180,200,230,280,300,350)
    positionx = random.choice (positions)
    positiony = random.choice (positions)

    #随机颜色列表
    color_pool = ("red","green","orange","grey","white","blue",
                 "Pink","Orchid","Purple","SkyBlue","YellowGreen")

    #定义球类(碰撞时球运动改变,内设碰撞处理函数)
    class Ball:
        def __init__(self,coords,colors):

            self.coords = coords
            self.color = colors
            self.id = canvasgame.create_oval(coords,fill= colors)
            self.wid= canvasgame.winfo_width()
            self.height = canvasgame.winfo_height()
            self.speedx = random.choice((-3,3))
            self.speedy = random.choice((-3,3))
            self.move = canvasgame.move(self.id,positionx,positiony)
            self.turn = 0
            self.core = 0

        #碰撞处理函数(通过传入全局球拍坐标),主要用来做控制
        def draw(self,batpos):
            canvasgame.move(self.id,self.speedx,self.speedy)
            ballpos = canvasgame.coords(self.id)

            #小球碰壁换向(碰下板计分为-200)
            if ballpos[0] < 0:
                self.speedx = 3
            elif ballpos[1] < 0:
                self.speedy = 3
                self.turn = 0
            elif ballpos[2] > self.wid:
                self.speedx = -3
            elif ballpos[3] > self.height:
                self.speedy = -3
                self.turn =1
                self.core = self.core - 200
                canvasgame.itemconfig(coreid, text=("记分牌\n分数:%d" %self.core))

            #小球碰板换向并计分(碰上板为正计400并随机换色,碰下板为-400不换色)
            if ballpos[2] > batpos[0] and ballpos[0] < batpos[2] and ballpos[3] > batpos[1]:
                #碰上板
                if  ballpos[3] >= batpos[1] and self.turn ==0:
                    if ballpos[3] <= (batpos[1] + 3):
                        self.speedy = -3
                        self.core=self.core + 400
                        canvasgame.itemconfig(coreid, text=("记分牌\n分数:%d" %self.core))
                        canvasgame.itemconfig(self.id, fill=random.choice(color_pool))
                #碰下板
                if  ballpos[1] <= batpos[3] and self.turn ==1:
                    if ballpos[1] >= (batpos[3] - 3):
                        self.speedy = 3
                        self.core = self.core - 400
                        canvasgame.itemconfig(coreid, text=("记分牌\n分数:%d" %self.core))

            return self.core

    #定义球拍类
    class Bat:
        def __init__(self,coords,colors):
            self.coords = coords
            self.colors = colors
            self.id = canvasgame.create_rectangle(coords,fill = self.colors)
            self.width = canvasgame.winfo_width()
            canvasgame.move(self.id,(700-self.coords[2])/2,400)

        #键盘监听处理函数
        def batbind(self,event):
            if event.keysym == "Left":
                canvasgame.move(self.id,self.Lspeed,0)

            if event.keysym == "Right":
                canvasgame.move(self.id,self.Rspeed,0)

        #板的移动函数(并监听键盘控制键)
        def draw(self):
            self.Rspeed = 10
            self.Lspeed = -10
            global pos
            pos = canvasgame.coords(self.id)
            if pos[0] <= 0:
                self.Lspeed = 0
            elif pos[2] >= self.width:
                self.Rspeed = 0
            canvasgame.bind_all("<KeyPress-Left>",self.batbind)
            canvasgame.bind_all("<KeyPress-Right>",self.batbind)

    #定义球和板大小并为球和球拍创建实例
    ballcoord = 20,20,46,46
    batcoord = 0,0,150,4
    bat = Bat(batcoord,"blue")
    ball = Ball(ballcoord,"red")

    #结束游戏界面
    def endWindow():
        canvasgame.delete(ball.id, bat.id)

        canvasover = canvasgame.create_text(350,300,text="o(╥﹏╥)o\n爱的太早,结束的太快!",
                                        font=('Cambria', 20), justify="center")

    #主循环,调用球和球拍,间断刷新(小于-1000分结束)
    while True:
        bat.draw()
        endCore=ball.draw(pos)
        if endCore <= -1000:
            endWindow()
            break
        windgame.update()
        time.sleep(0.01)
    windgame.mainloop()

3.文件

除了三个.py文件,还有窗口图标、菜单和背景图片,如有需要下面有打包

Py文件及图片.rar_免费高速下载|百度网盘-分享无限制

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容