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

image.png

math3.rar

老师一直出这个错误,是怎么回事


Python 全系列/第二阶段:Python 深入与提高/模块 1400楼

老师,运行出现这个错误,该怎么解决呢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 深入与提高/游戏开发-坦克大战 1401楼

#测试grid布局管理器
from tkinter import *

class Application(Frame):

    def __init__(self,master=None):  #master默认是None,实例化时传入参数root替换None
        super().__init__(master)
        self.master=master
        self.pack()
        self.createWidget()

    def createWidget(self):   #定义框内容以及属性

        self.l0=Label(self,text="用户名")
        #grid(row=0,column=0)--在0行0列放置
        self.l0.grid(row=0,column=0)

        #self.v=StringVar()
        #self.e0 = Entry(self, textvariable=self.v)
        #self.e0.grid(row=0, column=1)
        Entry(self).grid(row=0, column=1)

        self.l1 = Label(self, text="密码").grid(row=1, column=0)

        #self.v1 = StringVar()
        #self.e1 = Entry(self, textvariable=self.v1,show='*')
        #self.e1.grid(row=1, column=1)
        Entry(self,show='*').grid(row=1, column=1)

        self.l2 = Label(self, text="用户名为手机号").grid(row=0, column=2)

        Button(self,text="登录").grid(row=2, column=1,sticky=EW)  #EW,沿东西方向都有
        Button(self, text="取消").grid(row=2, column=2, sticky=E)


if __name__=="__main__":
    root=Tk()                        #创建框大小、位置以及标题
    app=Application(master=root)
    root.title("grid")
    root.geometry("400x120+450+200")
    root.mainloop()

老师请问以下红框和绿框实现的功能是一样的,这个两个写法有什么区别呢?那是说明不需要设置变量StringVar()也可以吗?还是说在特定情况下才可以?

image.png

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

#测试Text多行文本
from tkinter import *
import webbrowser

class Application(Frame):

    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.createWidget()

    def createWidget(self):   #定义框内容以及属性

        self.w = Text(root,width=40,height=10,bg="white",font=("宋体",18))
        self.w.pack()
        #self.w.insert(1.0)代表在第1行0列插入内容
        #行:123...;列:012...
        self.w.insert(1.0,"0123456789\n0纵观世界与天下\n奇闻异事")
        self.w.insert(2.3, "xxx")

        Button(self, text="重复插入文本", command=self.insertText).pack(side="left")
        Button(self, text="命令行返回文本", command=self.returnText).pack(side="left")
        Button(self, text="添加图片", command=self.addImage).pack(side="left")
        Button(self, text="添加组件", command=self.addWidget).pack(side="left")
        Button(self, text="通过tag精确控制文本", command=self.TextTag).pack(side="left")  #Tag标记


    def insertText(self):
        #INSERT代表从光标处插入内容
        #END在末尾插入内容
        self.w.insert(INSERT,"HE")
        self.w.insert(END, "ST")
        #在指定位置插入指定文本内容
        self.w.insert(2.8,"acz")   #在第2行第8列的位置插入

    def returnText(self):
        #获取文本的内容,并在命令行打印输出,get(初始位置, 终止位置)--获得该区域内容
        print(self.w.get(2.0, 2.5))
        print("文本所有内容:" + self.w.get(1.0, END))

    def addImage(self):
        #添加图片image_create()
        #定义全局变量globle p 或 对象属性self.p
        #global p
        self.p = PhotoImage(file="imgs/13.gif")
        self.w.image_create(END, image=self.p)

    def addWidget(self):
        #添加组件window_create()
        b=Button(self.w,text="点击")  #master为建好的文本域self.w
        self.w.window_create(INSERT,window=b)

    def TextTag(self):
        self.w.delete(1.0,END)
        self.w.insert(1.0,"good dood study!\n尚学堂\n百度一下,你就知道")
        #Tag--标记
        self.w.tag_add("IM",1.0,1.5)   #在指定区域内添加标记,将标记命名为good
        #标记属性定义,标记backgrond背景色,foreground标记体颜色,underline下划线
        self.w.tag_config("IM",background="yellow",foreground="red",underline=True)
        #标记事件绑定,即点击会出现的情况
        self.w.tag_add("bd", 3.0, 3.2)  # 在指定区域内添加标记
        self.w.tag_config("bd",background="blue",underline=True)
        self.w.tag_bind("bd","<Button-1>",self.webshow)  #<Button-1>点击左键

    #定义参数event,将<Button-1>点击左键作为参数event传入
    def webshow(self,event):
        webbrowser.open("https://www.baidu.com/")


if __name__=="__main__":
    root=Tk()                        #创建框大小、位置以及标题
    app=Application(master=root)
    root.title("Text_test")
    root.geometry("500x300+450+200")
    root.mainloop()

老师,请问这个为什么这个程序中图片部分的不能显示,点了没反应是为什么呢?没有图片出来?


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

#测试Text多行文本
from tkinter import *
import webbrowser

class Application(Frame):

    def __init__(self,master=None):
        super().__init__(master)
        self.master=master
        self.pack()
        self.createWidget()

    def createWidget(self):   #定义框内容以及属性

        self.w = Text(root,width=40,height=10,bg="white",font=("宋体",18))
        self.w.pack()
        #self.w.insert(1.0)代表在第1行0列插入内容
        #行:123...;列:012...
        self.w.insert(1.0,"0123456789\n0纵观世界与天下\n奇闻异事")
        self.w.insert(2.3, "xxx")

        Button(self, text="重复插入文本", command=self.insertText).pack(side="left")
        Button(self, text="命令行返回文本", command=self.returnText).pack(side="left")
        Button(self, text="添加图片", command=self.addImage).pack(side="left")
        Button(self, text="添加组件", command=self.addWidget).pack(side="left")
        Button(self, text="通过tag精确控制文本", command=self.TextTag).pack(side="left")  #Tag标记


    def insertText(self):
        #INSERT代表从光标处插入内容
        #END在末尾插入内容
        self.w.insert(INSERT,"HE")
        self.w.insert(END, "ST")
        #在指定位置插入指定文本内容
        self.w.insert(2.8,"acz")   #在第2行第8列的位置插入

    def returnText(self):
        #获取文本的内容,并在命令行打印输出,get(初始位置, 终止位置)--获得该区域内容
        print(self.w.get(2.0, 2.5))
        print("文本所有内容:" + self.w.get(1.0, END))

    def addImage(self):
        #添加图片image_create()
        #定义全局变量globle p 或 对象属性self.p
        #global p
        self.p = PhotoImage(file="imgs/13.gif")
        self.w.image_create(END, image=self.p)

    def addWidget(self):
        #添加组件window_create()
        b=Button(self.w,text="点击")  #master为建好的文本域self.w
        self.w.window_create(INSERT,window=b)

    def TextTag(self):
        self.w.delete(1.0,END)
        self.w.insert(1.0,"good dood study!\n尚学堂\n百度一下,你就知道")
        #Tag--标记
        self.w.tag_add("IM",1.0,1.5)   #在指定区域内添加标记,将标记命名为good
        #标记属性定义,标记backgrond背景色,foreground标记体颜色,underline下划线
        self.w.tag_config("IM",background="yellow",foreground="red",underline=True)
        #标记事件绑定,即点击会出现的情况
        self.w.tag_add("bd", 3.0, 3.2)  # 在指定区域内添加标记
        self.w.tag_config("bd",background="blue",underline=True)
        self.w.tag_bind("bd","<Button-1>",self.webshow)  #<Button-1>点击左键

    #定义参数event,将<Button-1>点击左键作为参数event传入
    def webshow(self,event):
        webbrowser.open("https://www.baidu.com/")


if __name__=="__main__":
    root=Tk()                        #创建框大小、位置以及标题
    app=Application(master=root)
    root.title("Text_test")
    root.geometry("500x300+450+200")
    root.mainloop()

老师,请问这个为什么这个程序中图片部分的不能显示,点了没反应是为什么呢?没有图片出来?


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

#测试Lable
from tkinter import *

# 表示GUI运行程序,继承父类Frame(放置其余组件的容器)
class Application(Frame):

    def __init__(self,master=None):  # 定义构造函数,构造器定义组件对象,实现组件调用。master=None初始化为空传入
        super().__init__(master)  # super()代表父类的定义,非对象,通过super()调用父类的构造方法并传入master
        self.master = master
        self.pack()               # self是组件,需要调用布局管理器,排布和显示
        self.createWidget()  # 在构造器中调用另外创建的组件

    def createWidget(self):  # 组件还需要另外创建,在createWidget单独定义,之后在构造器中调用
        self.l0 = Label(self,text="hello!百战",width=10,height=2,font=("楷体",30),fg="black",bg="white")
        self.l0.pack()

        #显示图像
        global p   #局部变量执行后会被销毁,无法显示图像,所以需要声明为全局变量
        p=PhotoImage(file='imgs/13.gif')     #在tkinter中默认gif图片
        self.l1 = Label(self,image=p)
        self.l1.pack()

if __name__=='__main__':
    root = Tk()  # 创建根窗口对象
    root.geometry("400x200+100+200")  # 设置窗口大小,位置
    root.title("一个经典的GUI对象")  # 设置窗口标题名
    # master就是一个固定参数,在这个位置表示的就是你的这个根窗口对象。换句话说master表示的是root这个对象
    app = Application(master=root)  # 定义好master,会自动传入Application类的构造器进行初始化

    root.mainloop()  # 调用事件循环

image.png

老师,请问这个显示图像的路径哪里有问题,为什么会报错呢?

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

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()

请问老师:

                1.面向对象的写法不用bind方法吗?它不用绑定吗

                2.为什么还要再加一个实例属性 self.master 呢

                3.定义方法后边的self 是不是也能写成Application呢

                

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

课程分类

百战程序员微信公众号

百战程序员微信小程序

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