在python tkinter中创建椭圆形小部件时遇到问题

在python tkinter中创建椭圆形小部件时遇到问题,python,tkinter,Python,Tkinter,我在画布小部件上创建椭圆形时遇到问题,因此我在构造函数的框架上声明了一个画布小部件 class Map(Frame): def __init__(self, master = none): Frame.__init__(self, master) ....... ##lines of code c = Canvas(master, width = 500,height = 500,relief = "groove") c

我在画布小部件上创建椭圆形时遇到问题,因此我在构造函数的框架上声明了一个画布小部件

class Map(Frame):

    def __init__(self, master = none):
        Frame.__init__(self, master)
        .......  ##lines of code
        c = Canvas(master, width = 500,height = 500,relief = "groove")
        c.pack(side  = "right")

    def operation(self):
        .............. ##lines of code
        self.createoval()  ##call create oval method after loop code

    def createoval(self):
        x = 0
        y = 0
        c1 = canvas.create_oval(x-5, y-5, x+10, y+10, fill = "red")
        ##error map object has no create_oval.
        c1.coords(c1, x, y)  
        c1.move(c1, 500, 500)
        return c1
理想情况下,我希望在循环完成后创建椭圆形,因此我将调用处理此问题的方法,但我有两个问题

第一。我遇到的第一个问题是在画布上创建椭圆形,该画布已在构造函数中建立。当我尝试执行此操作时,会收到消息“canvas not defined”,或者当我使用self.canvas.createoval时,会收到消息“map object has no attribute canvas”

所以我的问题是如何创建一个方法,在构造函数中建立的画布上创建椭圆

第二期:

c1 = canvas.create_oval(x-5, y-5, x+10, y+10, fill = "red")

我得到一个错误,没有定义x,尽管它已经定义,并且我使用了coords()方法,但这并没有解决问题。

这段代码有很多问题。下面是我在画布上创建一个椭圆形的代码(尽管给定了坐标,但部分是屏幕外的)

要解决您的一些问题:

  • 当您应该使用
    none
    时,您使用了
    none
    。它区分大小写
  • 创建对象时,如果希望对象实例知道某个变量,则需要使其成为
    self
    的一部分。这意味着当您使用
    c=canvas(…
    创建画布时,您需要实际拥有
    self.c=canvas(…
    )。否则
    c
    将只存在于
    \uuuuu init\uuuuu
    的范围内,而不会存在于其他任何地方
  • 您尝试使用
    canvas
    变量创建椭圆,但该变量从何而来?它以前从未定义过。您在
    \uuuu init\uuuu
    方法中专门称画布变量
    c
    ,因此您需要在
    createoval
    方法中调用它。注意,您还需要使用<代码>self.c
  • 您使用了行
    c1.coords(c1,x,y)
    大概是为了设置椭圆的位置。但是,椭圆的创建已经设置了位置,因此如果这是您的意图,那么这是一条多余的线。它也没有被正确使用。创建的变量
    c1
    是一个简单的整数,是画布上椭圆的ID。您需要调用
    c使用
    self.c.coords(c1,x,y)
    使用画布对象的oords
    方法。这将把画布
    self.c
    上的
    c1
    椭圆的坐标重置到
    (x,y)位置
    ,但是,由于您在创建椭圆后从未更改过
    x
    y
    ,因此它会将其设置为相同的位置,您不会注意到任何更改
  • 调用
    move
    时,您将看到与调用
    coords
    时相同的问题

  • 这段代码有很多问题。下面是我在画布上创建椭圆形的代码(尽管给定了坐标,但部分是屏幕外的)

    要解决您的一些问题:

  • 当您应该使用
    none
    时,您使用了
    none
    。它区分大小写
  • 当你创建一个对象时,如果你想让该对象的实例知道一个变量,你需要使它成为
    self
    的一部分。这意味着当你用
    c=canvas(…
    创建画布时,你需要实际拥有
    self.c=canvas(…
    。否则
    c
    将只存在于
    \uuuu init\uuuu
    的范围内,而不会存在于其他任何地方
  • 您尝试使用
    canvas
    变量创建椭圆,但该变量从何而来?它以前从未定义过。您在
    \uuuu init\uuuu
    方法中专门称画布变量
    c
    ,因此您需要在
    createoval
    方法中调用它。注意,您还需要使用<代码>self.c
  • 您使用了行
    c1.coords(c1,x,y)
    大概是为了设置椭圆的位置。但是,椭圆的创建已经设置了位置,因此如果这是您的意图,那么这是一条多余的线。它也没有被正确使用。创建的变量
    c1
    是一个简单的整数,是画布上椭圆的ID。您需要调用
    c使用
    self.c.coords(c1,x,y)
    使用画布对象的oords
    方法。这将把画布
    self.c
    上的
    c1
    椭圆的坐标重置到
    (x,y)位置
    ,但是,由于您在创建椭圆后从未更改过
    x
    y
    ,因此它会将其设置为相同的位置,您不会注意到任何更改
  • 调用
    move
    时,您将看到与调用
    coords
    时相同的问题

  • 收听错误消息。当您执行
    c=Canvas时(…
    变量c只存在于
    init
    方法的范围内。它不会存在于
    createoval
    中,除非您通过说
    self.c
    将其作为对象实例的一部分。此外,您不能在
    init
    中调用它
    c
    ,而在
    createoval
    中调用它e变量的名称相同。请倾听错误消息。当您执行
    c=Canvas时(…
    变量c只存在于
    init
    方法的范围内。它不会存在于
    createoval
    中,除非您通过说
    self.c
    将其作为对象实例的一部分。此外,您不能在
    init
    中调用它
    c
    ,而在
    createoval
    中调用它e变量的名称相同。
    from tkinter import *
    
    class Map(Frame):
    
        def __init__(self, master = None):
            Frame.__init__(self, master)
            self.c = Canvas(master, width = 500,height = 500,relief = "groove")
            self.c.pack(side  = "right")
    
        def operation(self):
            self.createoval()  ##call create oval method after loop code
    
        def createoval(self):
            x = 0
            y = 0
            c1 = self.c.create_oval(x-5, y-5, x+10, y+10, fill = "red")
            return c1
    
    m = Map(Tk())
    m.createoval()