我正在尝试在跳棋游戏中进行保存和加载功能。已经给出了保存和加载功能,我只需要创建按钮并使其在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 中缺少的东西,但我找不到它。 (许多功能名称和说明都是用法语写的,很遗憾)
答案 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))
根据您的实施情况,部分可能会更好,或者谁知道。但是,如果我正确地读你,你需要这样的东西来按照现在的方式使用你的保存/打开功能。
我希望这会有所帮助,如果没有,可能会发布一些更多的源代码,我们会解决它。