2017-01-01 2 views
-1

Итак, я делаю игру, и я использую Tkinter и Python 2.7, и я хочу хранить данные карты в файлах. Я пытаюсь создать меню, чтобы открыть файл и установить переменную. У меня возникла проблема с определением функции, используемой на кнопке Tkinter.Функция вызова Python, определенная в классе

Открывается окно 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!

+3

Является ли ваш отступ правильным? Является ли '' 'mapset''' атрибутом' '' maps'''? – wwii

+0

Похож на 'def mapset (var):' и его тело нужно отменить еще раз – andy9775

+2

Вы никогда не вызываете функцию 'maps()' для создания объекта. И 'self.data' должен быть' self.data = something'. – Barmar

ответ

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 Tkinter as tk и добавьте 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') в качестве ключа.

Смежные вопросы