为了账号安全,请及时绑定邮箱和手机立即绑定

在类之间传递 tkinter 画布而不从父级内部调用子级

在类之间传递 tkinter 画布而不从父级内部调用子级

白衣非少年 2022-11-01 14:46:35
当谈到 Python 时,我有点像初学者,但我决定要编写一个基本的 2-d 物理操场。Unfortionetly 我在尝试设置基本结构时遇到了麻烦。我的计划是在名为 mainWindow 的父函数中创建一个带有画布的 GUI,然后我想我会创建一个子类(Hero),它创建一个用户可以在画布上操作的圆圈。这似乎工作得很好。当我尝试对 Hero 类做任何事情时,就会出现问题,比如调用一个函数来删除圆圈,这样我就可以在某个方向重绘它。我似乎无法将画布从 mainWindow 传递给 Hero 类。任何帮助将不胜感激,包括告诉我这是错误的做事方式。我添加了我正在使用的两个文档,因为我的漫无边际可能难以理解。我从 phesics.py 文档中运行程序,导致 GUI 弹出我的画布和一个红色圆圈。当我关闭窗口时,出现以下错误:classes.py”,第 29 行,在 moveHeroBody canvas.delete(heroBody) NameError: name 'canvas' is not definedUnfortionetly我不知道如何让“世界”进入孩子类.pyfrom tkinter import *class mainWindow():    def __init__(self):            #Setup the GUI            root = Tk()            root.geometry('800x600')            # Setup the canvas within the GUI (master)            world = Canvas(root, height = 600, width = 800, bg = "#FFFFFF")            world.place(relx = 0.5, rely = 0.5, anchor = CENTER)            Hero(world)            root.mainloop()class Hero(mainWindow):    def __init__(self,world):        #Initial creation of hero at coordinates        x1 = 10        y1 = 10        x2 = 70        y2 = 70        heroBody = world.create_oval(x1,y1,x2,y2, fill = "#FF0000", outline = "#FF0000")    #Move the hero    def moveHeroBody():        print("moveHeroBody")        world.delete(heroBody)物理学.pyfrom tkinter import *from classes import *mainWindow1 = mainWindow()moveHero = Hero.moveHeroBody()
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

您可以通过它,但是您正在丢弃价值。另外,Hero不应该继承自mainWindow.


您需要另存world为属性,以便以后可以引用它。


class Hero():

    def __init__(self,world):

        self.world = world

        ...

然后,您可以使用self.world来引用画布:


def moveHeroBody():

    print("moveHeroBody")

    self.world.delete(heroBody)

虽然,上面的代码会失败,因为heroBody它是一个局部变量__init__- 你需要对它做同样的事情:


class Hero():

    def __init__(self,world):

        self.world = world

        ...

        self.heroBody = world.create_oval(...)


    #Move the hero

    def moveHeroBody():

        print("moveHeroBody")

        self.world.delete(self.heroBody)


查看完整回答
反对 回复 2022-11-01
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

我认为您需要Hero在 mainWindow 类中初始化该类。代码中需要做的修改是:


类.py


from tkinter import *

from time import sleep



class mainWindow():

    def __init__(self):

            #Setup the GUI

            self.jump_gap = 25

            root = Tk()

            root.geometry('800x600')

            # Setup the canvas within the GUI (master)

            self.world = Canvas(root, height = 600, width = 800, bg = "#FFFFFF")

            self.world.place(relx = 0.5, rely = 0.5, anchor = CENTER)


            self.hero = Hero(self.world)

            self.world.pack()

            root.bind("<space>",self.jump) # -> [1] Binds the SPACE BAR Key to the function jump 

            root.mainloop()


    def jump(self,event):

        gaps = list(range(self.jump_gap))

        for i in gaps:

            self.world.after(1,self.hero.moveHeroJump(h=i))  # [2] -> Binds the moveHeroJump method with the window action to a queue of updates

            self.world.update() #[2] updates the canvas

            sleep(0.01*i) # Added some linear wait time to add some look to it

        gaps.reverse()

        for i in gaps:

            self.world.after(1,self.hero.moveHeroJump(h=-i))

            self.world.update()

            sleep(0.01*i)



class Hero():

    def __init__(self,world):

        #Initial creation of hero at coordinates

        self.world = world

        self.x1 = 10

        self.y1 = 410

        self.x2 = 70

        self.y2 = 470

        self.heroBody = self.world.create_oval(self.x1,self.y1,self.x2,self.y2, fill = "#FF0000", outline = "#FF0000")


    #Move the hero

    def moveHeroJump(self,h):

        print("moveHeroBody")

        self.y1 -= h

        self.y2 -= h

        self.world.delete(self.heroBody)

        self.heroBody = self.world.create_oval(self.x1,self.y1,self.x2,self.y2, fill = "#FF0000", outline = "#FF0000")

物理.py


from tkinter import *

from classes import *


mainWindow1 = mainWindow()

编辑


所以这让我几分钟前开始玩了,我从堆栈中研究了一些资源来完成这个问题。以下是来源(在代码中也有引用):


如何将空格键键绑定到 tkinter python 中的某个方法

移动 Tkinter 画布

上面编辑的解决方案能够执行一个简单的跳球动画。self.jump_gap是一个固定的量,它告诉球它需要跳跃多少。jump解析一定高度的方法h让moveHeroJump小球改变它的位置,改变位置后排队进入Canvas一个更新被调用来查看小球的变化。


查看完整回答
反对 回复 2022-11-01
  • 2 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号