Python函数/按钮参考/范围错误

时间:2015-04-10 16:01:33

标签: python tkinter

我正在尝试创建一个简单的纸牌游戏。它有一个主菜单,有4个按钮和2个图像.4个按钮是wargarbageinstructquit_exe。单击时war按钮应为command=self.game_war,垃圾时为instruct按钮。 quit_exe应该显示如何玩,war应该只是退出应用程序。让我们以war为例来解决这个问题。

目标

点击后,我需要def game_war(self)执行grid_forget()功能。单击此选项后,它应war所有小部件,以便它可以为return的游戏生成小部件。当点击一个名为nonlocal的按钮时,它也应该清除小部件,然后重新生成主菜单。

要求

它需要能够开始基于点击按钮的游戏,并且游戏功能应该能够使用变量已经引用使用,覆盖和保存这些变量,因此它可以忘记小部件并放置新的小部件。当游戏结束时,它应忘记当前小部件,使用预先引用的变量,然后重新生成主菜单。

问题

我在赋值错误之前得到了一个局部变量。我尝试使用globalwar,但似乎无效。我需要这个,因为这是一个要求。

摘要

我需要能够执行一个可以获取和使用变量的函数。在这种情况下,我需要game_war来致电warinstruct可以访问quit_exegarbageusrCrdcpuCrd,{{1 }}和import tkinter import winsound from tkinter import * from PIL import Image, ImageTk from random import randint, randrange class CardGame(tkinter.Frame): def __init__(self, root): tkinter.Frame.__init__(self, root) #define variables for cards crdImg = [] usrStk = None cpuStk = None #define card images i = 1 while i < 57: i = i + 1 crdImg.append('img/cards/%s.png' % (i - 1)) usrStk = crdImg[54] cpuStk = crdImg[55] #define card stacks usrCrdImg = Image.open(usrStk) usrCrdBg = ImageTk.PhotoImage(usrCrdImg) usrCrd = tkinter.Label(root, image=usrCrdBg) usrCrd.image = usrCrdBg cpuCrdImg = Image.open(cpuStk) cpuCrdBg = ImageTk.PhotoImage(cpuCrdImg) cpuCrd = tkinter.Label(root, image=cpuCrdBg) cpuCrd.image = cpuCrdBg #define empty cell generation def empCell(px, py, r, c): grid(padx=px, pady=py, row=r, column=c) #define buttons war = tkinter.Button(self, text="Play War!", command=self.game_war) garbage = tkinter.Button(self, text="Play Caravan!", command=self.game_garbage) instruct = tkinter.Button(self, text="How to Play", command=self.instruct) quit_exe = tkinter.Button(self, text="Quit", command=quit) #define layout usrCrd.grid(row=1, column=1) cpuCrd.grid(row=1, column=4) war.grid(row=2, column=2) garbage.grid(row=3, column=2) instruct.grid(row=4, column=2) quit_exe.grid(row=5, column=2) #define game functions def game_war(self): war.grid_forget() garbage.grid_forget() instruct.grid_forget() quit_exe.grid_forget() usrCrd.grid_forget() cpuCrd.grid_forget() print("Debug") def game_garbage(self): print("Debug") def instruct(self): print("Debug") if __name__=='__main__': root = Tk() root.columnconfigure(1, weight=1) root.rowconfigure(1, weight=1) CardGame(root).grid(row=5, column=3) root.wm_title('Card Game') root.mainloop() 变量清除它们,然后为游戏生成新变量,然后当游戏结束时,重新生成主菜单小部件。

{{1}}

1 个答案:

答案 0 :(得分:1)

您没有将任何变量保存为实例变量 - 它们都是本地变量。如果要保存变量以便可以在其他方法中使用它,请将其另存为实例:

self.war = Button(self, text="Play War!", command=self.game_war)
self.garbage = Button(self, text="Play Caravan!", command=self.game_garbage)
self.instruct = Button(self, text="How to Play", command=self.instruct)
self.quit_exe = Button(self, text="Quit", command=quit)
...
self.war.grid_forget()
self.garbage.grid_forget()
self.instruct.grid_forget()
self.quit_exe.grid_forget()

......等等。

另外,您应该选择一种导入tkinter的方法,而不是导入两次。我建议&#34;将tkinter导入为tk&#34;,然后使用&#34; tk。&#34;作为每个小部件的前缀,因为全局导入可能导致代码不清楚。