会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132368个问题
Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 1216楼
Python 全系列/第二阶段:Python 深入与提高/模块 1218楼
Python 全系列/第二阶段:Python 深入与提高/坦克大战 1219楼
Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 1220楼
Python 全系列/第二阶段:Python 深入与提高/坦克大战 1221楼

"""
测试一个经典的GUI程序的写法,使用面向对象的放式
"""
from tkinter import *              #定义了图形用户界面(GUI)模块
from tkinter import messagebox     


class Application(Frame):          #定义一个应用类(Application)它的父类是一个容器(Frame)
    """一个经典的GUI程序的类的写法"""

    def __init__(self,master=None): # 构造器用来构造属性
        super().__init__(master)    # Frame不会自动调用父类所以需要super(),super代表的是父类的定义,而不是父类的对象
        self.master=master
        self.pack()
        self.createWidget()

    def createWidget(self):
        """创建组件"""
        self.bth01=Button(self)
        self.bth01["text"]="点击送花"
        self.bth01.pack()
        self.bth01["command"]=self.songhua
        # 创建一个退出按钮


        self.bth01Quit=Button(self, text="退出", command=root.destroy)#  destroy它是指销毁所用的子类、派生类以及销毁此小部件和所有子部件
        self.bth01Quit.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()                            #root.mainloop()的作用是让窗口一直循环展示,死循环
    
    
#app=Application(master=root)老师这个master是什么了老师讲半天一直没理解,他的过程应该是怎么样的
#self.bth01Quit=Button(self, text="退出", command=root.destroy)#  destroy它是指销毁所用的子类、派生类以及销毁此小部件和所有子部件。这个我应该调用songhua的这个self吧
#还有整个程序的调用过程是怎么样的,看了几遍一直没懂


Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 1223楼

老师,运行出现这个错误,该怎么解决呢error.PNG

#coding=utf-8
import pygame,time,random
SCREEN_WIDTH=600
SCREEN_HEIGHT=500
BG_COLOR=pygame.Color(0,0,0)
TEXT_COLOR=pygame.Color(255,0,0)
class MainGame():
    window = None
    my_tank = None
    enemyTankList = []
    enemyTankCount = 5
    def __init__(self):
        pass


    def startGame(self):
        pygame.display.init()
        MainGame.my_tank=Tank(300,250)
        self.creatEnemyTank()
        MainGame.window=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT),0,32)
        pygame.display.set_caption("坦克大战")
        while True:
            time.sleep(0.02)
            MainGame.window.fill(BG_COLOR)
            self.getEvent()
            MainGame.window.blit(self.getTextSurface("敌方坦克剩余数量%d"%6),(10,10))
            MainGame.my_tank.displayTank()
            self.blitEnemyTank()
            if not MainGame.my_tank.stop:
                MainGame.my_tank.move()
            pygame.display.update()

    def creatEnemyTank(self):
        top=100
        for i in range(MainGame.enemyTankCount):
            left=random.randint(0,600)
            speed=random.randint(1,4)
            enemy=EnemyTank(left,top,speed)
            MainGame.enemyTankList.append(enemy)
    def blitEnemyTank(self):
        for enemyTank in MainGame.enemyTankList:
            enemyTank.displayTank()



    def getEvent(self):
        eventlist=pygame.event.get()
        for event in eventlist:
            if event.type==pygame.QUIT:
                self.endGame()
            if event.type==pygame.KEYDOWN:
                if event.key==pygame.K_LEFT:
                    MainGame.my_tank.direction="L"
                    MainGame.my_tank.stop=False
                    #print("按下左键,坦克向左移动")
                elif event.key==pygame.K_RIGHT:
                    MainGame.my_tank.direction = "R"
                    MainGame.my_tank.stop = False
                    #print("按下右键,坦克向右移动")
                elif event.key==pygame.K_UP:
                    MainGame.my_tank.direction = "U"
                    MainGame.my_tank.stop = False
                    #print("按下上键,坦克向上移动")
                elif event.key==pygame.K_DOWN:
                    MainGame.my_tank.direction = "D"
                    MainGame.my_tank.stop = False
                    #print("按下下键,坦克向下移动")
                elif event.key == pygame.K_SPACE:
                    pass
                    #print("发射子弹")
            if event.type == pygame.KEYUP:
                if event.key==pygame.K_DOWN or event.key==pygame.K_UP or event.key==pygame.K_RIGHT or event.key==pygame.K_RIGHT:
                    MainGame.my_tank.stop=True


    def endGame(self):
        print("谢谢使用,欢迎再次使用")
        exit()

    def getTextSurface(self,text):
        pygame.font.init()
        font=pygame.font.SysFont("kaiti",18)
        textSurface=font.render(text,True,TEXT_COLOR)
        return textSurface

class Tank():
    def __init__(self,left,top):
        self.images={
            "U":pygame.image.load("img/p1tankU.gif"),
            "D": pygame.image.load("img/p1tankD.gif"),
            "L": pygame.image.load("img/p1tankL.gif"),
            "R": pygame.image.load("img/p1tankR.gif")}
        self.direction="U"
        self.image=self.images[self.direction]
        self.rect=self.image.get_rect()
        self.rect.left=left
        self.rect.top=top
        self.speed=5
        self.flag=True



    def randDirection(self):
        num=random.randint(1,4)
        if num==1:
            return "U"
        elif num==2:
            return "D"
        elif num==3:
            return "L"
        elif num==4:
            return "R"
    def move(self):
        if   self.direction=="L":
            if self.rect.left>0:
                self.rect.left-=self.speed
        elif self.direction=="R":
            if self.rect.left+self.rect.height <SCREEN_WIDTH:
                self.rect.left+=self.speed
        elif self.direction == "U":
            if self.rect.top > 0:
                self.rect.top -= self.speed
        elif self.direction == "D":
            if self.rect.top + self.rect.height < SCREEN_HEIGHT:
                self.rect.top += self.speed
    def displayTank(self):
        self.image = self.images[self.direction]
        MainGame.window.blit(self.image,self.rect)
class EnemyTank(Tank):
    def __init__(self,left,top,speed):
        self.images={
            'U':pygame.image.load('img/enemy1U.gif'),
            'D':pygame.image.load('img/enemy1D.gif'),
            'L':pygame.image.load('img/enemy1L.gif'),
            'R':pygame.image.load('img/enemy1R.gif')
        }

        self.direction=self.randDirection()
        self.image=self.images[self.direction]
        self.rect=self.image.get_rect()
        self.rect.left=left
        self.rect.top=top
        self.speed=speed
        self.flag=True

if __name__=="__main__":
    MainGame().startGame()


Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 1224楼
Python 全系列/第二阶段:Python 深入与提高/坦克大战 1227楼
Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 1228楼

"""测试一个经典的gui程序写法"""
from tkinter.filedialog import *
from tkinter.colorchooser import *

# 窗口的高度和宽度
win_width = 900
win_height = 450

class Application(Frame):
    """一个经典gui程序的写法"""
    def __init__(self,master=None,bgcolor="#000000"):
        super().__init__(master)  # super()代表父类定义
        self.master = master
        self.bgcolor = bgcolor
        self.x = 0
        self.y = 0
        self.fgcolor = "#ff0000"
        self.lastDraw = 0
        self.startDrawFlag = False
        self.pack()
        self.creatWidget()

    def creatWidget(self):
        """用画布创建绘图区"""
        self.drawpad = Canvas(self, width=win_width,height=win_height*0.9,bg = self.bgcolor)
        self.drawpad.pack()

        # 创建按钮
        self.btn_start = Button(self, text = "开始",name = "start") # 此处的name是为了后面进行事件的判断
        self.btn_start.pack(side = "left",padx = "10")
        self.btn_pen = Button(self, text="画笔", name="pen")
        self.btn_pen.pack(side="left", padx="10")
        self.btn_rect = Button(self, text="矩形", name="rect")
        self.btn_rect.pack(side="left", padx="10")
        self.btn_clear = Button(self, text="清屏", name="clear")
        self.btn_clear.pack(side="left", padx="10")
        self.btn_erasor = Button(self, text="橡皮擦", name="erasor")
        self.btn_erasor.pack(side="left", padx="10")
        self.btn_line = Button(self, text="直线", name="line")
        self.btn_line.pack(side="left", padx="10")
        self.btn_lineArrow = Button(self, text="箭头直线", name="lineArrow")
        self.btn_lineArrow.pack(side="left", padx="10")
        self.btn_color = Button(self, text="颜色", name="color")
        self.btn_color.pack(side="left", padx="10")


        # 事件处理
        self.btn_pen.bind_class("Button", "<1>", self.eventManager)
        self.drawpad.bind("<ButtonRelease-1>",self.stopDraw)

        #增加颜色快捷键
        root.bind("<KeyPress-r>",self.kuaijiejian)
        root.bind("<KeyPress-g>", self.kuaijiejian)
        root.bind("<KeyPress-y>", self.kuaijiejian)



        def eventManager(self,event):
            name = event.widget.winfo_name()
            print(name)
            if name == "line":
                self.drawpad.bind("B1-Motion",self.myline)
            elif name== "lineArrow":
                self.drawpad.bind("B1-Motion", self.mylineArrow)
            elif name == "rect":
                self.drawpad.bind("B1-Motion", self.myRect)
            elif name == "pen":
                self.drawpad.bind("B1-Motion", self.myPen)
            elif name == "erasor":
                self.drawpad.bind("B1-Motion", self.myErasor)
            elif name == "clear":
                self.drawpad.delete("all")
            elif name == "color":
                c=askcolor(color=self.fgcolor,title="选择画笔颜色")
                self.fgcolor = c[1]

        def stopDraw(self,event):
            self.startDrawFlag = False
            self.lastDraw = 0

        def startDraw(self,event):
            self.drawpad.delete(self.lastDraw)

            if not self.startDrawFlag:
                self.startDrawFlag = True
                self.x = event.x
                self.y = event.y  # x,y为鼠标当前位置

        def myline(self,event):
            self.startDraw(event)
            self.lastDraw =self.drawpad.create_line(self.x,self.y,event.x,event.y,fill=self.fgcolor)

        def mylineArrow(self,event):
            self.startDraw(event)
            self.lastDraw =\
                self.drawpad.create_line(self.x,self.y,event.x,event.y,arrow=LAST,fill=self.fgcolor)

        def myRect(self,event):
            self.startDraw(event)
            self.lastDraw =\
                self.drawpad.create_rectangle(self.x,self.y,event.x,event.y,outline=self.fgcolor)

        def myPen(self,event):
            self.startDraw(event)
            self.drawpad.create_line(self.x,self.y,event.x,event.y,fill=self.fgcolor)
            self.x=event.x
            self.y=event.y

        def myErasor(self,event):
            self.startDraw(event)
            self.drawpad.create_rectangle(self.x-4,self.y-4,event.x+4,event.y+4,fill=self.fgcolor)
            self.x = event.x
            self.y = event.y

        def kuaijiejian(self,event):
            if event.char == "r":
                self.fgcolor == "#ff0000"
            if event.char == "g":
                self.fgcolor == "#00ff00"
            if event.char == "y":
                self.fgcolor == "#ffff00"


if __name__ == "__main__":
    root=Tk()
    root.geometry(str(win_width)+"x"+str(win_height)+"+200+300")
    root.title("百战程序员的画图软件")
    app = Application( master = root)
    root.mainloop()

image.png


一直显示eventManager 没定义方法,但这个不是事件的方法吗,头大,希望老师尽快解答,非常感谢

Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 1230楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637