TypeError:正好接受2个参数(给定1个)asksaveasnamefile

时间:2014-04-22 00:44:58

标签: python file-io tkinter typeerror

我正在尝试在跳棋游戏中进行保存和加载功能。已经给出了保存和加载功能,我只需要创建按钮并使其在tkinter界面中工作。

这是给出的两个函数:

def sauvegarder(self, nom_fichier):

    try:
        with open(nom_fichier, "w") as f:
            f.write("{}\n".format(self.couleur_joueur_courant))
            f.write("{}\n".format(self.doit_prendre))
            if self.position_source_forcee is not None:
                f.write("{},{}\n".format(self.position_source_forcee[0],self.position_source_forcee[1]))

            else:
                f.write("None\n")
            f.writelines(self.damier.convertir_en_chaine())
    except:
        raise ProblemeSauvegarde("Problème lors de la sauvegarde.")

def charger(self, nom_fichier):

    try:
        with open(nom_fichier) as f:
            self.couleur_joueur_courant = f.readline().rstrip("\n")
            doit_prendre_string = f.readline().rstrip("\n")
            if doit_prendre_string == "True":
                self.doit_prendre = True
            else:
                self.doit_prendre = False

            position_string = f.readline().rstrip("\n")
            if position_string == "None":
                self.position_source_forcee = None
            else:
                ligne_string, colonne_string = position_string.split(",")
                self.position_source_forcee = (int(ligne_string), int(colonne_string))

            self.damier.charger_dune_chaine(f.read())
    except:
        raise ProblemeChargement("Problème lors du chargement.")

在我在界面中工作的文件中,我写了两个函数:

import tkinter as tk
from tkinter.filedialog import askopenfilename, asksaveasfilename
from dames.partie import Partie
from dames.exceptions import PositionSourceInvalide, PositionCibleInvalide

class InterfaceDamier(tk.Frame):

def __init__(self, parent, taille_case, damier):
    """taille_case est la taille d'un côté d'une case en pixels."""
    # Definition du damier : # de cases
    self.n_lignes = 8
    self.n_colonnes = 8

    # Definition du damier : taille des cases (en pixels)
    self.taille_case = taille_case

    # Defiz«nition du damier : couleur de cases
    self.couleur1 = "white"
    self.couleur2 = "gray"

    # Pièces sur le damier, on utilise le damier de la classe damier
    self.damier = damier

    # Calcul de la taille du dessin
    canvas_width = self.n_colonnes * self.taille_case
    canvas_height = self.n_lignes * self.taille_case


    # Initialisation de la fenêtre parent contenant le canvas
    tk.Frame.__init__(self, parent)

    # Initialisation du canvas
    self.canvas = tk.Canvas(self, borderwidth=0, highlightthickness=0, width=canvas_width, height=canvas_height,
                           background="white")

    # On place le canvas et le plateau (self) à l'aide de "grid".
    self.canvas.grid(padx=2, pady=2, sticky=tk.N + tk.S + tk.E + tk.W)
    self.grid(padx=4, pady=4, sticky=tk.N + tk.S + tk.E + tk.W)

    # Fait en sorte que le redimensionnement de la fenêtre redimensionne le damier
    self.canvas.bind("<Configure>", self.actualiser)


    ##test sam
    self.piecesJoue ={}
    self.frame2 = ""


def charger_fichier(self):
    #fonction pour charger une partie déjà jouée à partir d'un fichier texte
    nom_fichier = tk.filedialog.askopenfilename(filetypes = [("Fichiers Texte","*.txt")]) 
    if len(nom_fichier) > 0:
        self.partie = Partie(nom_fichier)

        self.pieces = {}

        for position, piece in self.game.interfaceDames.InterfaceDamier.items():
            nom = self.obtenir_nom_piece_selon_caractere(str(piece))
            self.addpiece(nom, position[0], position[1], "blanc")

        self.frame2.destroy()
        self.frameMenu.destroy()
        self.piecesJoue.clear()
        self.__init__(self, parent)
        self.canvas.bind("<Configure>", self.actualiser)

def sauvegarder_fichier(self):
    "fonction pour enregistrer une partie  de jeu dans un fichier texte "

    mesformats = [("Fichiers Texte","*.txt")]
    root = Tkinter.Tk()

    nom_fichier = tk.FileDialog.asksaveasfilename(parent=root,filetypes =    [mesformats],title="Sauvegarder la partie sous...") 

    if len(nom_fichier) > 0:
        self.Partie.sauvegarder(nom_fichier)

按钮似乎有效,但它总是在2个函数中得到同样的错误:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python32\lib\tkinter\__init__.py", line 1399, in __call__
return self.func(*args)
TypeError: charger() takes exactly 2 arguments (1 given)

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python32\lib\tkinter\__init__.py", line 1399, in __call__
return self.func(*args)
TypeError: sauvegarder() takes exactly 2 arguments (1 given)

我认为这可能是 init 中缺少的东西,但我找不到它。 (许多功能名称和说明都是用法语写的,很遗憾)

1 个答案:

答案 0 :(得分:2)

如果我有完整的源代码(可能放入pastebin或其他东西)但是会有所帮助,听起来你有类似的东西

myButton = tk.Button(text='A Button!', command=charger)

由于按钮回调的工作方式,这不起作用。 Tkinter不能(据我所知)以这种方式发送任何参数。 Tkinter中有不同的回调格式。如果你绑定和像

这样的事件
<<Modified>>

命令,Tkinter将期望一个参数函数,第一个(也是唯一的)参数是截获的事件Tkinter。按钮什么都没有。为了使其工作,您可以使用lambda,partial(来自functool)或函数包装器。如果我在课堂上有一个需要打开的按钮(你必须原谅我 - 我不会说法语),我可能会这样做:

myButton = tk.Button(text='A Better Button!', command = lambda: charger(self.someFileName))

根据您的实施情况,部分可能会更好,或者谁知道。但是,如果我正确地读你,你需要这样的东西来按照现在的方式使用你的保存/打开功能。

我希望这会有所帮助,如果没有,可能会发布一些更多的源代码,我们会解决它。