在python tkinter中创建椭圆小部件的麻烦

时间:2016-04-05 13:31:41

标签: 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.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

理想情况下,我想要的是在循环结束后创建椭圆形状,所以我会调用处理它的方法,但是我有两个问题。

第一。我遇到的第一个问题是在构造函数中建立的画布上创建椭圆。当我尝试这样做时,我得到消息“画布未定义”或当我使用self.canvas.createoval时,我收到消息“地图对象没有属性画布”

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

第二期:

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

我得到x未定义的错误,即使它已经定义并且我使用了coords()方法但是这并没有解决问题。

1 个答案:

答案 0 :(得分:0)

您对此代码存在许多问题。下面是在我的画布上创建一个椭圆形的代码(虽然给出了你的坐标,它部分偏离屏幕)。

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

解决您的一些问题:

  1. 您应该使用none时使用None。它区分大小写!
  2. 创建对象时,如果希望该对象实例知道变量,则需要将其作为self的一部分。这意味着当您使用c = Canvas(...创建画布时,您需要实际拥有self.c = Canvas(...。否则c将仅存在于__init__的范围内,并且不会存在于其他任何地方。
  3. 您尝试使用canvas变量创建椭圆,但此变量来自何处?它以前从未定义过。您在c方法中专门调用了画布变量__init__,因此您需要在createoval方法中将其称为相同的内容。请注意,您还需要使用self.c
  4. 您使用线c1.coords(c1,x,y)大概设置了椭圆的位置。但是椭圆的创建已经设定了位置,所以如果这是你的意图,这是一条冗余线。它也没有被正确使用。创建的变量c1是一个简单的整数,它是画布上椭圆的ID。您需要使用coords使用canvas对象调用self.c.coords(c1,x,y)方法。这会将画布c1上的self.c椭圆的坐标重置为(x,y)位置,但是因为您在创建椭圆后从未更改xy ,它会将它设置到相同的位置,你不会注意到任何变化。
  5. move的{​​{1}}电话相同,您发现同样的问题。