命名空间和访问Tkinter

时间:2013-04-04 04:09:52

标签: python tkinter

我有一个问题,虽然我不确定使用什么语言。我对如何在不使用全局变量的情况下从其他模块访问主驱动程序模块中定义的画布感到困惑。例如,我已经在driver.py中实例化了画布,但我试图从Level.py中绘制。对于上下文,它最终将读取文本文件并根据它从RPG-ish游戏中提取的数据绘制地图。这是我的代码:

Driver.py:

import tkinter
import Level


HEIGHT = 1024
WIDTH = 800
TILE_SIZE = 32
VERTICAL_TILES = HEIGHT//TILE_SIZE
HORIZONTAL_TILES = WIDTH//TILE_SIZE

root = tkinter.Tk()
root.title("RPG Land")
window = tkinter.Canvas(root,width= WIDTH, height=HEIGHT )


lev = Level.LevelMgr()
lev.loadLevel()
lev.drawLevel()

window.pack()

root.mainloop()

Annnd Level.py:

import tkinter
from driver import window

class LevelMgr:
    def __init__(self):
        self.levelData = []
        self.visibleLevel = []
        self.tileColors = {
                            0 : 'empty',
                            1 : 'wall',
                            2 : 'bush' }

    def loadLevel(self):
        fyle = open('levels/level1','r')
        count = 0
        for lyne in fyle:
            self.levelData.append(lyne)
            count += 1


    def drawLevel(self):
        currentY = 0
        currentX = 0
        for col in self.levelData:
            currentY += 32
            for t in col:
                window.create_rectangle(currentX, currentY, 32, 32, fill="blue")
                currentX += 32

关于如何更好地构建程序的任何建议也将受到赞赏。访问其他命名空间时,这样做的正确方法是什么?我是否需要在driver.py上使用“import Level”,以及在Level.py中使用“import driver”?我对这样一个程序的基本结构感到有点困惑。

1 个答案:

答案 0 :(得分:1)

LevelMgr取决于窗口,因此请在__init__中明确命名:

class LevelMgr:
    def __init__(self, window):
        self.window = window
    def drawLevel(self):
        ...
            for t in col:
                self.window.create_rectangle(currentX, currentY, 32, 32, fill="blue")

删除import语句:

from driver import window

然后,在Driver.py中:

lev = Level.LevelMgr(window)

另一种可能性是在Level.py而不是window中定义Driver.py