所以我正在制作游戏,我正在使用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!
答案 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'
扩展名)作为键。