Python函数/按钮引用/Scope E

2024-09-21 01:18:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个简单的纸牌游戏。它有4个按钮和2个主菜单图像。那个4个按钮是wargarbageinstruct,和{}。当单击war按钮时,它应该是command=self.game_war,垃圾也是如此。instruct应该演示如何播放,quit_exe应该简单地退出应用程序。让我们用war来解决这个问题。在

目标

我需要在单击时,war在单击时执行def game_war(self)函数。当这个被点击时,它应该grid_forget()所有的小部件,这样它就可以为war游戏生成小部件。当一个名为return的按钮被点击时,它会清除小部件,然后重新生成主菜单。在

要求

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

问题

在赋值错误之前,我得到了一个局部变量。我试过使用nonlocalglobal,但似乎不起作用。我需要这个,因为这是一个要求。在

摘要

我需要能够执行一个可以抓取和使用变量的函数。在本例中,我需要war调用game_war,它可以访问warinstructquit_exegarbageusrCrd和{}变量来清除它们,然后为游戏生成新的变量,然后在游戏结束时,重新生成主菜单小部件。在

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()

Tags: selfgame游戏部件tkintercolumnrootquit
1条回答
网友
1楼 · 发布于 2024-09-21 01:18:23

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

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,而不是导入两次。我建议“importtkinter as tk”,然后使用“tk.”作为每个小部件的前缀,因为全局导入可能导致代码不清晰。在

相关问题 更多 >

    热门问题