类中定义的Python调用函数

时间:2017-01-01 05:01:25

标签: python python-2.7 tkinter

所以我正在制作游戏,我正在使用Tkinter和Python 2.7,我想将地图数据存储在文件中。我正在尝试创建一个菜单来打开文件并设置为变量。我在定义要在Tkinter按钮上使用的函数时遇到问题。

Tkinter窗口打开但是当我点击按钮时会出错。

代码:

#readfiles.py
class maps(object):
    def __init__(self):
        self.data
    def mapset(var):
        data = var
fselect = Tk()
...
buttons = Frame(fselect).pack()
Label(fselect, text="Select maps in folder:")
for i in listdir('./maps/'):
    if i[-4:] == ".pvm":
        Button(buttons, text=i[:-4], command=lambda i=i: mapset(open('./maps/'+i, 'r').read())).pack()

NameError: global name 'mapset' is not defined

另外,如何在另一个文件中访问data中的maps变量(因此它会maps.data,右)?

#main.py
from readfiles import *
print maps.data

AttributeError: type object 'maps' has no attribute 'data'

如果您需要任何其他信息,请与我们联系。 另外,print "Happy New Years!

1 个答案:

答案 0 :(得分:0)

这是一个简单的GUI类,用于存储self.data属性中地图文件中的数据。

为了测试这段代码,我使用这个Bash命令创建了一组简单的文本文件:

for i in {0..5}; do echo >"maps/map${i}.pvm" "Map $i data"; done

这是Python 3代码。要在Python 2上运行它,只需将Tkinter import语句更改为import Tkinter as tk,然后在其他import语句之前添加from __future__ import print_function

我添加了一个"Print data",可让我们测试我们是否已正确加载数据。

import tkinter as tk
import os

class Gui(object):
    def __init__(self, mapspath):
        self.data = None

        root = tk.Tk()
        frame = tk.Frame(root)
        frame.pack()

        tk.Label(frame, text="Select maps in folder:").pack()

        for fbase in os.listdir(mapspath):
            if fbase.endswith('.pvm'):
                fname = os.path.join(mapspath, fbase)
                #print(fname)
                tk.Button(frame, text=fbase[:-4], 
                    command=lambda fn=fname:self.read_map(fn)).pack()

        tk.Button(frame, text="Print data", command=self.print_map).pack()

        root.mainloop()

    def read_map(self, fname):
        with open(fname) as f:
            self.data = f.read()

    def print_map(self):
        print("current map:", self.data)

Gui("./maps")

除非这些地图很大,否则一次存储所有地图可能会更方便。您可以将它们存储在列表中,但最好将它们存储在字典中,使用基本名称(减去'.pvm'扩展名)作为键。