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

"""开发画图软件"""
import tkinter as tk


# 窗口的宽度和高度
win_width=900
win_height=450
class Application(tk.Frame):
    def __init__(self, master = None):
        super().__init__(master)
        self.master = master
        self.bgcolor = '#000000'
        self.x = 0
        self.y = 0
        self.fgcolor = 'red'
        self.startDrawFlag = False
        self.lastDraw = 0
        self.pack()
        self.createWidget()

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

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

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

    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)


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

    def myline(self, event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.startDrawFlag = True
            self.x = event.x
            self.y = event.y
        self.lastDraw = self.drawpad.create_line(self.x, self.y, event.x, event.y, fill=self.fgcolor)


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

    def mylineArrow(self, event):
        self.drawpad.delete(self.lastDraw)
        if not self.startDrawFlag:
            self.startDrawFlag = True
            self.x = event.x
            self.y = event.y
        self.lastDraw = self.drawpad.create_line(self.x, self.y, event.x, event.y, arrow=LAST, fill=self.fgcolor)

if __name__ == "__main__":
    root = tk.Tk()
    root.title('画画本')
    root.geometry(str(win_width)+'x'+str(win_height))
    app = Application(master = root)
    root.mainloop()

image.png,这里每一步我都是跟着视频照着打,运行错误


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

"""
新增功能
     左上角文字绘制;
     左上角输出敌方坦克数量6

"""
import pygame

SCREEN_WIDTH = 700
SCREEN_HEIGHT = 500
BG_COLOR = pygame.Color(0, 0, 0)
TEXT_COLOR=pygame.Color(255,0,0)



class MainGame():
    window = None

    def __init__(self):
        pass

    # 开始游戏
    def startGame(self):
        # 加载主窗口
        pygame.display.init()
        # 设置窗口的大小及显示
        MainGame.window = pygame.display.set_mode([SCREEN_HEIGHT, SCREEN_HEIGHT])
        # 设置窗口的标题
        pygame.display.set_caption("坦克大战1.03")
        while True:
            # 给窗口设置填充色
            MainGame.window.fill(BG_COLOR)
            # 获取事件
            self.getEvent()
            #绘制文字的方法
            MainGame.window.blit(self.getTextSuface('敌方坦克剩余数量%d'%6))
            pygame.display.update()

    # 结束游戏
    def endGame(self):
        print("谢谢使用,欢迎再来")
        exit()
    #左上角文字绘制
    def getTextSuface(self):
        #初始化字体模块
        pygame.font.init()
        #查看所有字体名称
        print(pygame.font.get_fonts())
        #获取字体font对象
        font=pygame.font.SysFont("georgia",18)
        #绘制文字信息
        textSurface=font.render(text,True,TEXT_COLOR)
        return textSurface



    # 获取事件
    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:
                        print("按下左键,坦克向左移动")
                    elif event.key == pygame.K_RIGHT:
                        print("按下右键,坦克向右移动")
                    elif event.key == pygame.K_UP:
                        print("按上键,坦克向上动")
                    elif event.key == pygame.K_DOWN:
                        print("按下键,坦克向右下动")


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

    # 移动
    def move(self):
        pass

    # 射击
    def shot(self):
        pass

    # 展示坦克的方法
    def display(self):
        pass


# 我方坦克
class MyTank(Tank):
    def __init__(self):
        pass


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


# 子弹类
class Bullet():
    def __init__(self):
        pass

    # 移动
    def move(self):
        pass

    # 展示子弹的方法
    def displayBullet(self):
        pass


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

    # 展示墙壁的方法
    def displayWall(self):
        pass


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

    # 展示爆炸效果的方法
    def displayExplode(self):
        pass


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

    # 播放音乐
    def play(self):
        pass


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


Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 2462楼
Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 2464楼
Python 全系列/第二阶段:Python 深入与提高/异常机制 2467楼
Python 全系列/第二阶段:Python 深入与提高/GUI编程(隐藏) 2468楼
Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 2470楼

"""测试一个经典的GUI程序的写法,使用面向对象的方式"""

from tkinter import *
from tkinter import messagebox
class Application(Frame):
    """一个经典的GUI程序"写法"""
    def __init__(self,master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.createWidget()
    def createWidget(self):
        """创建组件"""
        self.btn01 = Button(self)
        self.btn01["text"] = "点击送花"
        self.btn01.pack()
        self.btn01["command"] = self.songhua
        """创建退出按钮"""
        self.btnQuit = Button(self, text="退出", command=root.destroy)
        self.btnQuit.pack()
    def songhua(self):
        messagebox.showinfo("送花", "送你 99 朵玫瑰花")
root = Tk()
root.geometry("400x100+200+300")
root.title("一个经典的GUI程序类的测试")
app = Application(master=root)

if __name__ == '__main__':
    root = Tk()
    root.geometry("400x100+200+300")
    root.title("一个经典的 GUI 程序类的测试")
    app = Application(master=root)
    root.mainloop()

老师关于这段代码几点不懂的地方:

1,创建application为什么要继承Frame,是因为Frame有更加特殊的功能吗?通过Application类的构造方法把root传给父类的构造方法,这么做的目的是什么?后面self.master=master是为app这个对象的master属性赋值为root吗?


2.创建组件的方法里,不太懂self.bt01 = Button(self)的含义,bt01也是app这个对象新增的属性吗(包括后面的bt01['text'],bt01["command"]),顺便老师解释下Button(self)是啥意思,还有这个方法里调用songhua这个方法时怎么没加括号

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

课程分类

百战程序员微信公众号

百战程序员微信小程序

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