我有以下代码,其中我使类显示的许多实例,然后在每个类中调用函数display,它显示数据
from tkinter import *
class Display:
def __init__(self, x, y):
self.x = x
self.y = y
def display(self):
canvas.create_oval(self.x,self.y,self.x+10,self.y+10,fill="lime")
def show(inst):
makeFun = Tk()
canvas = Canvas(makeFun, width=800, height=700)
makeFun.title("Test Evolution")
canvas.pack()
instance = [Display(random.randrange(300,700),random.randrange(300,700)) for a in range(inst)]
for a in range(inst):
instance[a].display()
canvas.mainloop()
但是当我调用该函数时...
show(10)
它返回一个错误,指出:
NameError: name 'canvas' is not defined
在函数中创建的变量local
,您无法在其他函数中访问它,因此应将其作为参数发送
def display(self, canvas):
和
item.display(canvas)
顺便说一句:名称Item
更适合此类,因为它是您将显示的项目/对象。
您可以使用首选方法处理列表 - 无需range()
for item in instances:
item.display(canvas)
完整工作示例
import tkinter as tk # `import *` is not preferred
import random
class Item:
def __init__(self, x, y):
self.x = x
self.y = y
def display(self, canvas):
canvas.create_oval(self.x, self.y, self.x+10, self.y+10, fill="lime")
def show(inst):
root = tk.Tk()
root.title("Test Evolution")
canvas = tk.Canvas(root, width=800, height=700)
canvas.pack()
instances = [Item(random.randrange(300,700),random.randrange(300,700)) for a in range(inst)]
for item in instances:
item.display(canvas)
root.mainloop()
show(100)