【问题标题】:Python call function defined in class类中定义的 Python 调用函数
【发布时间】:2017-01-01 05:01:25
【问题描述】:

所以我正在制作一个游戏,我正在使用 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

另外,我如何在另一个文件中访问maps 中的data 变量(所以应该是maps.data,对)?

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

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

如果您需要任何其他信息,请告诉我。 另外,print "Happy New Years!

【问题讨论】:

  • 你的缩进是否正确? mapsetmaps 的属性吗?
  • 看起来像def mapset(var):,它的主体需要再次缩进
  • 您永远不会调用maps() 函数来创建对象。而self.data 应该是self.data = something
  • 您发布的代码存在多个问题。正如 Barmar 所提到的,您永远不会创建 maps 实例,并且 maps.__init__ 方法没有意义。 mapset 应该做什么?它应该是maps的方法吗?此外,widget.pack.grid 方法返回None,因此buttons = Frame(fselect).pack()buttons 设置为None。你忘了.pack那个Label小部件。
  • 你指的是哪个“变量data”?没有这样的变量。 data 是您似乎希望在 maps 类中拥有的属性的名称,但您从未真正创建该类的实例,或正确地为变量分配任何内容。我认为您的 TK 代码不是您遇到的主要问题。相反,它掩盖了您对基本 OOP 概念的困惑。尝试阅读the Python tutorial's chapter on classes,然后看看是否可以解决。

标签: python python-2.7 tkinter


【解决方案1】:

这是一个简单的 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' 扩展名)作为键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2018-10-04
    • 2022-01-06
    相关资源
    最近更新 更多