会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 133326个问题

老师您好,请问一下

#coding=utf-8
from tkinter import *
from tkinter.filedialog import *
from tkinter.colorchooser import *

#构造方法

class Application(Frame):

    def __init__(self, master):
        super().__init__(master)
       

        self.create_widget()


    def create_widget(self):
        # 设置主菜单
        menu_import = Menu(root)

        # 设置子菜单
        self.menu_file = Menu(menu_import)
        menu_edit = Menu(menu_import)
        menu_help = Menu(menu_import)
        menu_import.add_cascade(label="文件(F)", menu=self.menu_file)
        menu_import.add_cascade(label="编辑(E)", menu=menu_edit)
        menu_import.add_cascade(label="帮助(H)", menu=menu_help)

        # 设置可用功能
        self.menu_file.add_command(label="新建", accelerator="ctrl+n", command=self.method_new_file)
        self.menu_file.add_command(label="打开", accelerator="ctrl+t", command=self.method_open_file)
        self.menu_file.add_command(label="保存", accelerator="ctrl+r", command=self.save_file)
        self.menu_file.add_separator()       # 添加分割线
        self.menu_file.add_command(label="退出", accelerator="ctrl+o", command=self.method_quit)


        # 创建上下菜单
        self.contexMenu = Menu(root)
        self.contexMenu.add_command(label="背景颜色", command=self.method_colo)

        # 设置文本框
        self.textpad = Text(root, width=40, height=30, bg="gray")
        self.textpad.pack()

        # 添加快捷方式
        root.bind("<Control-n>", lambda event: self.method_new_file())
        root.bind("<Control-t>", lambda event: self.method_open_file())
        root.bind("<Control-r>", lambda event: self.save_file())
        root.bind("<Control-o>", lambda event: self.method_quit())
        root.bind("<Button-3>", lambda event: self.method_colo())


        # 将主菜单放入根窗口
        root["menu"] = menu_import


        # 建设可用功能的方法

    def method_new_file(self):


        self.file_name = asksaveasfilename(title="另存为", initialfile="未命名.txt",
                                        filetypes =[("文本文档", "*.txt")], defaultextension=".txt")
        print(self.file_name)
        self.save_file()

    def method_open_file(self):
        self.textpad.delete("1.0", "end")
        with askopenfile(title="打开文件")as f:
            self.textpad.insert(INSERT, f.read())
            self.file_name = f.name
            print(f.name)

    def save_file(self):
        with open(self.file_name, "w", encoding="utf_8")as f:
            c = self.textpad.get(1.0, END)
            f.write(c)

    def method_quit(self):
        root.quit()

    def method_colo(self):
        colo_1 = askcolor(title="请选择颜色", color="gray")
        self.textpad.config(bg=colo_1[1])
if __name__ == "__main__":
    root = Tk()
    root.geometry("400x400+500+200")
    root.title("记事本的应用")
    app = Application(master=root)
    root.mainloop()

1,这里所说的创建上下菜单感觉可有可无啊,都可以正常运行而且运行过程和结果看起来都一样,那么还有写这个的必要吗?

2,self是调用类里面的类属性,可是就按我这个写的话似乎也没有影响,那么在__int__中写self的作业是什么?为了以后查看方便吗?

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

# 坦克大战游戏,pygame游戏引擎的安装
# 流程:(1)确定程序所需要的类;(2)框架搭建;(3)加载主窗口(参考pygame的网址)--在主类中实现

"""
(1)程序的所有类:
1.主类:
    开始游戏
    结束游戏
2.坦克类(我方坦克、敌方坦克--继承):
    显示坦克的方法
    射击
    移动类
3.子弹类
    显示子弹的方法
    移动
4.墙体类
    属性:是否能够通过
5.爆炸效果类
    展示爆炸效果
6.音效类
    播放音乐
"""

#导入pygame模块
import pygame
#导入时间模块,可用于调整循环的快慢
#导入随机数生成模块
import time,random

width = 700
height = 600
bg=pygame.Color(0,0,0)   #RGB(0,0,0)颜色为黑色,赋予bg
#另一种写法 bg=pygame.Color("black")
tc=pygame.Color("red")

#主类
class MainGame():
    #类对象
    window=None  #窗口对象
    mt = None    #坦克在多个地方需要调用,所以定义为类变量
    ememylist=[]    #创建存储敌方坦克的列表(多个)
    ememynum=5      #敌方坦克数量
    Bullet_list=[]   #存储我方子弹列表
    Bullet_enemylist=[]  #存储敌方子弹列表

    # 初始化方法
    def __init__(self):
        pass
    #开始游戏的方法
    def start(self):
        #加载主窗口
        pygame.display.init()  # 窗口初始化
        # set_mode((width,height),a,色深)--a(不用什么特性可指定0),set_mode()返回一个surface对象,表示窗口
        MainGame.window=pygame.display.set_mode([width,height])  #设置窗口大小,通过列表导入
        pygame.display.set_caption("Tank_fight!")  #设置窗口标题
        #初始化我方坦克--不需要一直创建,初始化时创建一次即可
        MainGame.mt=Tank(350,200)
        #创建初始化敌方坦克的方法,并添加到列表中
        self.createt()

        while True:
            #让坦克运动速度减慢
            time.sleep(0.02)
            # pygame.surface.fill()--代表对返回surface对象填充颜色
            MainGame.window.fill(bg)
            # 保持窗口一直处于刷新显示的状态,才能反映窗口内部的变化,背景不断刷新
            # 添加事件
            self.getevent()
            # 绘制文字,将图像绘制到另一个blit("文本内容",相对于左上角坐标(0,0)的文本放置坐标位置)
            #getTest('文本内容%d'%整数)
            MainGame.window.blit(self.getTest('敌方坦克剩余数量%d'%len(MainGame.ememylist)),(10,20))
            #调用显示坦克的方法--调用Tank中的tank_display()
            MainGame.mt.tank_display()
            #调用坦克移动方法--坦克按键后因为循环执行一直处于移动状态
            # 展示敌方坦克
            self.displayenemy()
            #如果坦克开关开启,开始移动
            if not MainGame.mt.stop:   #初始设置为True,一开始进入循环就会发生移动,所以应先设置移动的开关
                MainGame.mt.move()     #如果为False则进入移动函数move()
            # 将子弹展示到窗口中
            self.blitbullet()
            #调用敌方子弹列表的方法
            self.enemybullet()
            #刷新窗口,保持不消失
            pygame.display.update()

    def createt(self):
        #循环生成敌方坦克
        for i in range(MainGame.ememynum):
            left=random.randint(0,600)
            top=random.randint(0,500)
            speed = random.randint(1, 4)
            enemy=Enemytank(left,top,speed)   #随机生成一个敌方坦克
            MainGame.ememylist.append(enemy)  #将敌方坦克加入坦克生成列表

    def displayenemy(self):  #通过循环实现敌方坦克列表的坦克显示
        for enemy in MainGame.ememylist:
            enemy.tank_display()
            #敌方坦克移动--由于到边界会停止,所以考虑修改敌方坦克方向
            enemy.ranmove()
            #调用敌方坦克的射击
            eb=enemy.shot()   #敌方坦克调用shot(),可能为空
            # 判断敌方子弹是否是None,如果不为None则添加到敌方子弹列表中
            if eb:
                # 将敌方子弹存储到敌方子弹列表中
                MainGame.Bullet_enemylist.append(eb)

    # 遍历子弹列表,将敌方子弹加入窗口
    def enemybullet(self):
        for eb in MainGame.Bullet_enemylist:
            if eb.live:   #判断敌方列表是否存活
                eb.Bullet_display()
                # 让子弹移动
                eb.move()
            else:
                MainGame.Bullet_enemylist.remove(eb)

    #遍历子弹列表,将我方子弹加入窗口
    def blitbullet(self):
        for Bullet in MainGame.Bullet_list:
            if Bullet.live:
                Bullet.Bullet_display()
                # 让子弹移动
                Bullet.move()
            else:
                MainGame.Bullet_list.remove(Bullet)


    #结束游戏的方法
    def end(self):
        print("游戏结束!")
        quit()   #退出窗口

    #获取事件--关闭退出、按键是在整个程序都要实现的写在主类中,pygame.event.get()返回所有事件
    def getevent(self):
        eventlist=pygame.event.get()
        for event in eventlist:  #对eventlist遍历,如果满足一下条件,执行相关命令
            if event.type==pygame.QUIT:     #事件类型为退出--pygame.QUIT
                self.end()
            if event.type==pygame.KEYDOWN:  #事件类型为按键--pygame.KEYDOWN
                if event.key==pygame.K_LEFT:  #事件按键event.key,对应左键K_LEFT:
                    MainGame.mt.direction = 'L'  #调用Tank()的direction属性
                   #MainGame.mt.move()
                    #修改坦克的开关状态
                    MainGame.mt.stop=False
                    print("向左移动")
                elif event.key==pygame.K_RIGHT:
                    MainGame.mt.direction = 'R'
                    #MainGame.mt.move()
                    #修改坦克的开关状态
                    MainGame.mt.stop=False
                    print("向右移动")
                elif event.key == pygame.K_UP:
                    MainGame.mt.direction = 'U'
                    #MainGame.mt.move()
                    #修改坦克的开关状态
                    MainGame.mt.stop=False
                    print("向上移动")
                elif event.key == pygame.K_DOWN:
                    MainGame.mt.direction = 'D'
                    #MainGame.mt.move()
                    #修改坦克的开关状态
                    MainGame.mt.stop=False
                    print("向下移动")
                elif event.key == pygame.K_SPACE:
                    print("发射子弹")
                    #产生一颗子弹,将子弹加入子弹列表
                    #控制发射子弹数量--即控制子弹加入子弹列表的列表数
                    if len (MainGame.Bullet_list)<3:  #最多发射3个
                        m=Bullet(MainGame.mt)
                        MainGame.Bullet_list.append(m)
                    else:
                        print("子弹已用完!")
                    print("当前一次性发射子弹数量为%d"%len(MainGame.Bullet_list))
            if event.type==pygame.KEYUP:  #键盘松开
                #但实际上松开方向键的时候,才会停止,对于其余键不会有这个影响会照常前进执行
                if event.key == pygame.K_LEFT\
                        or event.key ==pygame.K_RIGHT \
                        or event.key ==pygame.K_UP \
                        or event.key ==pygame.K_DOWN:
                    MainGame.mt.stop=True

    #左上角文字绘制,输出坦克量,作为文本内容text为变量反映坦克量的变化
    def getTest(self,text):
        #初始化字体模块
        pygame.font.init()
        #获取所有字体pygame.font.get_fonts()--可以从中任选一个
        #print(pygame.font.get_fonts())
        #获取字体对象设置字体与大小pygame.font.SysFont('字体',大小)
        font=pygame.font.SysFont('kaiti',18)
        #绘制文字信息 font.render(文本信息,抗锯齿True or False,字体颜色)返回surface
        textSurface=font.render(text,True,tc)
        return textSurface  #返回绘制结果
        # 要将文本添加到窗口,且一直显示变化,需要保持循环,所以在循环内部写入

#坦克类
class Tank():  #存在direction属性
    #添加距离左边,距离上边
    def __init__(self,left,top):
        #保存加载图片 self.image.load("文件路径")返回surface
        self.images={
            'U':pygame.image.load('imgs/p1tankU.gif'),
            'R': pygame.image.load('imgs/p1tankR.gif'),
            'L': pygame.image.load('imgs/p1tankL.gif'),
            'D': pygame.image.load('imgs/p1tankD.gif')
        }
        #方向
        self.direction='U'  #默认方向朝上
        #根据当前图片方向获取图片
        self.image=self.images[self.direction]
        #根据图片获取区域--默认左上角,通过离左边、上边的距离确定区域位置
        #self.rect--图片区域;self.rect.left--图片左上角离左侧的距离;self.rect.top--图片左上角离上侧的距离
        self.rect=self.image.get_rect()
        self.rect.left=left
        self.rect.top =top
        #坦克移动的速度--即坐标位置增量的代销
        self.speed=5
        #坦克移动停止开关(属性)
        self.stop=True

    #坦克展示的方法
    def tank_display(self):
        #获取展示的对象
        self.image=self.images[self.direction]
        #调用blit方法展示
        MainGame.window.blit(self.image,self.rect)
    #射击方法
    def shot(self):
        #返回发射子弹
        return Bullet(self)
    #移动方法
    def move(self):
        #判断坦克方向并进行移动
        if self.direction=='U':
            if self.rect.top>0:
                self.rect.top -= self.speed
        # self.rect.height--图片的高度;self.rect.width--图片的宽度
        elif self.direction=='D':
            if self.rect.top+self.rect.height < height:
                self.rect.top += self.speed
        elif self.direction=='L':
            if self.rect.left > 0:
                self.rect.left -= self.speed
        elif self.direction=='R':
            if self.rect.left+self.rect.width < width:
                self.rect.left += self.speed


#我方坦克
#坦克运动四个方向有四张图
class Mytank(Tank):
    def __init__(self):
        pass


#敌方坦克
class Enemytank(Tank):
    def __init__(self,left,top,speed):
        #加载地方坦克图片
        self.images={
            'U':pygame.image.load('imgs/enemy1U.gif'),
            'R': pygame.image.load('imgs/enemy1R.gif'),
            'L': pygame.image.load('imgs/enemy1L.gif'),
            'D': pygame.image.load('imgs/enemy1D.gif')
        }

        #随机生成敌方他坦克方向
        self.direction=self.randdirection()
        #根据方向获取图片
        self.image = self.images[self.direction]
        #获取区域
        self.rect=self.image.get_rect()
        #对left和top赋值,不赋值则默认左上角
        self.rect.left=left
        self.rect.top=top
        #速度
        self.speed=speed
        #移动开关键
        self.stopf=True  #默认停止
        #设定初次移动步数参数
        self.step=40


    def randdirection(self):
        num=random.randint(1,4)  #随机生成1-4范围的数
        if num==1:
            return 'U'
        if num==2:
            return 'D'
        if num==3:
            return 'L'
        if num==4:
            return 'R'

    # 敌方坦克随机移动的方法:
    def ranmove(self):
        if self.step <= 0:  # 满足条件后修改方向
            self.direction = self.randdirection()
            #让步数复位,否则将会一直执行改变方向的命令
            self.step=60
        else:
            self.move()
            self.step-=1

#子弹类
class Bullet():
    def __init__(self,tank):
        #加载子弹图片,由于坦克方向与子弹发生位置相关,所以需要再传一个变量tank
        self.image=pygame.image.load('imgs/enemymissile.gif')
        self.direction=tank.direction
        #获取区域
        self.rect=self.image.get_rect()
        #子弹发射位置与坦克朝向相关
        if self.direction=='U':
            self.rect.left= tank.rect.left+tank.rect.width/2-self.rect.width/2
            self.rect.top = tank.rect.top-self.rect.height
        if self.direction=='D':
            self.rect.left= tank.rect.left+tank.rect.width/2-self.rect.width/2
            self.rect.top = tank.rect.top+tank.rect.height
        if self.direction=='L':
            self.rect.left= tank.rect.left-self.rect.width/2
            self.rect.top = tank.rect.top+tank.rect.height/2-self.rect.width/2
        if self.direction=='R':
            self.rect.left= tank.rect.left+tank.rect.width+self.rect.width/2
            self.rect.top = tank.rect.top+tank.rect.height/2-self.rect.width/2
        self.speed=6
        self.live = True
        #记录子弹是否存在(碰到墙壁视作消失)

    #子弹展示的方法
    def Bullet_display(self):
        #将图片加载到窗口
        MainGame.window.blit(self.image,self.rect)
    #子弹移动的方法
    def move(self):
        #子弹移动,左右侧left大小改变,上下侧top大小改变
        if self.direction=='U':
            if self.rect.top>0:  #未碰到墙壁
                #以移动速度于东,上部距离减小
                self.rect.top-=self.speed
            else:  #碰到墙壁
                self.live = False
        elif self.direction=='D':
            if self.rect.top <height-self.rect.height:
                # 以移动速度于东,上部距离减小
                self.rect.top += self.speed
            else:
                self.live = False
        elif self.direction == 'L':
            if self.rect.left>0:
                # 以移动速度于东,上部距离减小
                self.rect.left -= self.speed
            else:
                self.live = False
        elif self.direction == 'R':
            if self.rect.left <width-self.rect.width:
                # 以移动速度于东,上部距离减小
                self.rect.left += self.speed
            else:
                self.live = False
    #由于父类shot()的频率太高,所以在子类重写shot(),降低射击频率
    def shot(self):
        num=random.randint(1,100)   #在一定范围随机产生一个数
        if num==1:                   #在这些范围内只有一种可能满足进入Bullet(self)的方法
            return Bullet(self)     #不为1,则会返回空

#墙壁类
class Wall():
    def __init__(self,across):
        pass
    #展示墙壁类的方法
    def Wall_display(self):
        pass

#爆炸类
class Explode():
    def __init__(self):
        pass
    # 展示爆炸效果的方法
    def Explode_display(self):
        pass

#音效类
class Music():
    def __init__(self):
        pass
    #播放音乐的方法
    def diaplay(self):
        pass

if __name__=='__main__':
    MainGame().start()

老师,请问我这个代码为什么在Bullet类中重写的shot()函数中概率改变对产生结果并没有影响,好像这个传的仍旧是一个固定的概率,这个是为什么呢?



Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 2747楼
Python 全系列/第二阶段:Python 深入与提高/坦克大战 2749楼

1638271858(1).png

Python 全系列/第二阶段:Python 深入与提高/异常机制 2750楼

image.png

有这个报错,找了半天,不知道什么原因,下边是代码



import pygame
import time
import random

SCREEN_WIDTH=700
SCREEN_HEIGHT=500
BG_COLOR=pygame.Color(0,0,0)
FG_COLOR = pygame.Color(255,255,255)
x,y = 0,0 #初始位置
# 主类
#pygame.init()# 下边都不用初始化了
class MainGame():

    my_Tank = None
    window = None
    #存储敌方坦克的列表
    enemyTanklist = []
    #定义敌方坦克的数量
    enemyTankCount = 5
    def __init__(self):
        pass

    #开始游戏方法
    def startGame(self):
        #窗口初始化
        pygame.display.init()
        #窗口大小设置
        MainGame.window = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
        #设置窗口的标题
        pygame.display.set_caption(":坦克大战")
        #TANK初始化
        MainGame.my_Tank = Tank(350,500)
        #初始化敌方坦克
        self.createEnemyTank()


        #无限循环
        while True :
            time.sleep(0.1)
            MainGame.window.fill(BG_COLOR)
            self.event()
            #在面板上绘制文字
            MainGame.window.blit(self.textSurface(), (x+50,y+50))
            MainGame.my_Tank.displayTank()
            #循环遍历敌方坦克,并展示
            self.blitEnemyTank()

            #如果坦克的开关开启才可以移动
            if not MainGame.my_Tank.stop:
                MainGame.my_Tank.move()
            pygame.display.update()



    #初始化敌方坦克,并将坦克加入到列表中去
    def createEnemyTank(self):
        top = 100
        for i in range(MainGame.enemyTankCount):
            left = random.randint(0,600)
            speed = random.randint(1,4)
            enemy = enmyTank(left, top, speed)
            MainGame.enemyTanklist.append(enemy)

    # 循环遍历敌方坦克,并展示
    def blitEnemyTank(self):
        for tank in MainGame.enemyTanklist:
            tank.displayTank()

    # 结束游戏方法
    def endGame(self):
        print("Game Over")
        exit()

    #文本
    def textSurface(self):
        # 所有字体类型
        #print(pygame.font.get_fonts())
        # 创建文字对象
        font = pygame.font.SysFont("kaiti", 20)
        # 输入文字
        textSurface = font.render("敌方坦克数量为%d" % 6, True, FG_COLOR)
        return textSurface

    #获取事件
    def event(self):
        """事件退出,若不退出点哪个就是哪个输出"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    MainGame.my_Tank.direction = 'U'
                    MainGame.my_Tank.stop = False
                    #MainGame.my_Tank.move()
                    print("按上键,向上方移动")
                elif event.key == pygame.K_DOWN:
                    MainGame.my_Tank.direction = 'D'
                    MainGame.my_Tank.stop = False
                    #MainGame.my_Tank.move()
                    print("按下键,向下方移动")
                elif event.key == pygame.K_LEFT:
                    MainGame.my_Tank.direction = 'L'
                    MainGame.my_Tank.stop = False
                    #MainGame.my_Tank.move()
                    print("按左键,向左移动")
                elif event.key == pygame.K_RIGHT:
                    MainGame.my_Tank.direction = 'R'
                    MainGame.my_Tank.stop = False
                    #MainGame.my_Tank.move()
                    print("按右键,向右移动")
                elif event.key == pygame.K_SPACE:
                    print("发射子弹")

            #松开方向键,坦克停止移动
            elif event.type == pygame.KEYUP:
                # 判断松开的是上下左右才不动
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    MainGame.my_Tank.stop = True




class Tank():
    #添加距离左边left,上边top
    def __init__(self, left, right):
        #保存加载的图片
        self.images={
            'U': pygame.image.load(r'F:\Google下载\新建文件夹\tank\img\p1tankU.gif'),
            'D': pygame.image.load(r'F:\Google下载\新建文件夹\tank\img\p1tankD.gif'),
            'L': pygame.image.load(r'F:\Google下载\新建文件夹\tank\img\p1tankL.gif'),
            'R': pygame.image.load(r'F:\Google下载\新建文件夹\tank\img\p1tankR.gif')
        }
        #方向
        self.direction = 'D'
        #根据当前的图片的方向获取图片surface
        self.image = self.images[self.direction]
        #获取图片区域
        self.rect = self.image.get_rect()
        #设置区域的left和top
        self.rect.left = left
        self.rect.right = right
        self.speed = 10
        #连续移动
        self.stop = True

    def shot(self):
        pass

    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]
        #把这个对象blit
        MainGame.window.blit(self.image, self.rect)


class myTank(Tank):
    def __init__(self):
        pass


class enmyTank(Tank):
    def __init__(self, left ,top, speed):
        #加载图片集
        self.images = {
            'U': pygame.image.load(r'F:\Google下载\新建文件夹\tank\img\enemy1U.gif'),
            'D': pygame.image.load(r'F:\Google下载\新建文件夹\tank\img\enemy1D.gif'),
            'L': pygame.image.load(r'F:\Google下载\新建文件夹\tank\img\enemy1L.gif'),
            'R': pygame.image.load(r'F:\Google下载\新建文件夹\tank\img\enemy1R.gif')
         }
        #方向,随机方向生成坦克
        self.direction = self.randDirect()
        # 根据方向获取图片信息
        self.image = self.images[self.direction]
        #坦克区域
        self.rect = self.images[self.direction]
        #对left和top进行赋值
        self.rect.left = left
        self.rect.top = top
        #速度
        self.speed = speed
        #移动开关键
        self.flag = True

    def randDirect(self):
        self.random = random.randint(1,4)
        if self.random == 1:
            return 'U'
        elif self.random == 2:
            return 'D'
        elif self.random == 3 :
            return 'L'
        elif self.random == 4:
            return 'R'


class Bullet():
    def __init__(self):
        pass

    def bulletMove(self):
        pass

    def displayBullet(self):
        pass


class Wall():
    def __init__(self):
        pass
    def through(self):
        pass


class Sound():
    def __init__(self):
        pass
    def music(self):
        pass


class Boom():
    def __init__(self):
        pass
    def boomSound(self):
        pass


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


Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 2753楼

2c5ad9aa38070cc7f732e16d327904a.png

老师这个报错是怎么回事

Python 全系列/第二阶段:Python 深入与提高/文件处理 2754楼

"""开发画图软件的菜单"""

from tkinter.colorchooser import *
from tkinter import *

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


class Application(Frame):

    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.bgcolor = "#000000"
        self.x = 0
        self.y = 0
        self.fgcolor = "#ff0000"
        self.lastDraw = 0  # 表示最后绘制的图形的id
        self.startDrawFlag = False
        self.pack()
        self.createWidget()

    def createWidget(self):
        # 创建绘图区
        self.drawpad = Canvas(root, width=win_width, height=win_height * 0.9, bg=self.bgcolor)
        self.drawpad.pack()

        # 创建按钮
        btn_start = Button(root, text="开始", name="start")
        btn_start.pack(side="left", padx="10")
        btn_pen = Button(root, text="笔画", name="pen")
        btn_pen.pack(side="left", padx="10")
        btn_rect = Button(root, text="矩形", name="rect")
        btn_rect.pack(side="left", padx="10")
        btn_clear = Button(root, text="清屏", name="clear")
        btn_clear.pack(side="left", padx="10")
        btn_erasor = Button(root, text="橡皮擦", name="erasor")
        btn_erasor.pack(side="left", padx="10")
        btn_line = Button(root, text="直线", name="line")
        btn_line.pack(side="left", padx="10")
        btn_lineArrow = Button(root, text="箭头直线", name="lineArrow")
        btn_lineArrow.pack(side="left", padx="10")
        btn_color = Button(root, text="颜色", name="color")
        btn_color.pack(side="left", padx="10")

        # 事件处理
        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):
        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

    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(event.x-4, event.y-4, event.x+4, event.y+4, fill=self.bgcolor)
        self.x = event.x
        self.y = event.y

    def kuaijiejian(self, event):
        if event.char == "r":
            self.fgcolor = "#ff0000"
        elif event.char == "g":
            self.fgcolor = "#00ff00"
        elif 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()

老师,这代码总是有些问题,代码照着敲的,总是报这样的错误

也不知道哪里说啥,startDraw(),一个位置参数被给于了两个!屏幕截图 2021-03-22 221317.png

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

屏幕截图 2022-02-02 042401.png

老师你看我这样算安装成功了吗?

Python 全系列/第二阶段:Python 深入与提高/模块 2759楼
Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 2760楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

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