2017-01-01 30 views
-1

私はゲームを作っています.TkinterとPython 2.7を使用しています。マップデータをファイルに保存したいと思います。私はファイルを開き、変数に設定するためのメニューを作ろうとしています。 Tkinter Buttonで使用する関数を定義するのに問題があります。クラスで定義された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

また、どのように私は別のファイルに(そう、それは右、maps.dataだろう)mapsdata変数にアクセスすることができますか?

#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

マップファイルのデータをself.data属性に格納する単純なGUIクラスです。

は、このコードをテストするために、私は、この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')をキーとして使用して辞書に格納するほうがよいでしょう。

関連する問題