gpt4 book ai didi

python - Python 中基于 GUI 的冒险游戏 - 未定义玩家名称

转载 作者:太空宇宙 更新时间:2023-11-04 04:40:05 25 4
gpt4 key购买 nike

我正在尝试将数据从 Tkinter 条目提取到一个变量中以供以后使用——我目前正在尝试将其打印到 shell 以进行测试——但是,每当我尝试将变量打印到 shell 时,它都会说“pname 未定义”- pname 是变量的名称。

代码:

# Imports necesary modules
import sys, os, time
import winsound as ws
import tkinter as tk

# Creates window
gui = tk.Tk()
gui.title('Tiemer Niptus')
gui.geometry('1920x1080')
gui.configure(bg='#572f87')
#gui.wm_iconbitmap('resources\images\icon.ico')

# Defines prerequisite functions
def gt_play():
ws.PlaySound('resources\sound\gt.wav', ws.SND_FILENAME|ws.SND_LOOP|ws.SND_ASYNC)

def win_play():
ws.PlaySound('resources\sound\win.wav', ws.SND_FILENAME|ws.SND_LOOP|ws.SND_ASYNC)

def dth_play():
ws.PlaySound('resources\sound\dth.wav', ws.SND_FILENAME|ws.SND_LOOP|ws.SND_ASYNC)

def snd_stop():
ws.PlaySound(None, ws.SND_FILENAME|ws.SND_PURGE)

def death():
dth_play()
gui.configure(bg='#000000')

dth_lbl = tk.Label(text='YOU HAVE DIED', font = ['Helvetica', 60], bg='#000000', fg='#a50b29')
dth_lbl.pack()
dth_lbl.place(x=950, y=370, anchor="center")

dth_btn = tk.Button(text='TRY AGAIN?', font = ['Helvetica', 60], bg='#a50b29', fg='#000000',
command = lambda:[dth_lbl.destroy(), dth_btn.destroy(), snd_stop(), str_screen()])
dth_btn.pack()
dth_btn.place(x=950, y=500, anchor="center")

def win():
win_play()
gui.configure(bg='#1dcc0d')

win_lbl = tk.Label(text='YOU HAVE WON!', font = ['Helvetica', 60], bg='#1dcc0d', fg='#ffd700')
win_lbl.pack()
win_lbl.place(x=950, y=370, anchor="center")

win_btn = tk.Button(text='PLAY AGAIN?', font = ['Helvetica', 60], bg='#1dcc0d', fg='#ffd700',
command = lambda:[win_lbl.destroy(), win_btn.destroy(), snd_stop(), str_screen()])
win_btn.pack()
win_btn.place(x=950, y=500, anchor="center")

# Defines stage functions
def str_screen():
gt_play()
gui.configure(bg='#572f87')

str_lbl = tk.Label(text='TIEMER NIPTUS', font = ['Helvetica', 60], fg='#00ffab', bg='#572f87')
str_lbl.pack()
str_lbl.place(x=950, y=350, anchor="center")

str_btn = tk.Button(text='START', font = ['Helvetica', 50], bg='#7d0234', fg='#00ffab', width = 15,
command = lambda:[str_lbl.destroy(), str_btn.destroy(), name_select()])
str_btn.pack()
str_btn.place(x=950, y=475, anchor="center")

def name_select():
pname_lbl = tk.Label(text='INPUT NAME', fg='#00ffab', font = ['Helvetica', 50], bg='#572f87')
pname_lbl.pack()
pname_lbl.place(x=950, y=340, anchor="center")

pname_ent = tk.Entry(bg='#00ffab', fg='#7d0234', font = ['Helvetica', 40], width = 14)
pname_ent.pack()
pname_ent.place(x=950, y=415, anchor="center")
pname = pname_ent.get()

go_btn = tk.Button(text='GO', font = ['Helvetica', 25], bg='#7d0234', fg='#00ffab', width = 21,
command = lambda:[snd_stop(), pname_lbl.destroy(), pname_ent.destroy(), go_btn.destroy(), street()])
go_btn.pack()
go_btn.place(x=950, y=490, anchor='center')

def street():
print(pname)

# Draws window and starts game
str_screen()
gui.mainloop()

错误:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\lucas\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 1550, in __call__
return self.func(*args)
File "C:\Users\lucas\Desktop\Program\TiemerNiptus.py", line 77, in <lambda>
command = lambda:[snd_stop(), pname_lbl.destroy(), pname_ent.destroy(), go_btn.destroy(), street()])
File "C:\Users\lucas\Desktop\Program\TiemerNiptus.py", line 82, in street
print(pname)
NameError: name 'pname' is not defined

最佳答案

来 self 的评论:

Scoping error - the variable is not known inside def street(). You either need to pass it in as variable, provide it as classvariable (for a instance that you know in the scope of your function) or declare it as global .

如果您想了解类,请阅读文档:https://docs.python.org/3.6/tutorial/classes.html

有关基本方法,请参阅代码中的注释:

# Imports necesary modules
import sys, os, time
import winsound as ws
import tkinter as tk

class MyData:
"""This is a bad example for oop. Normaly classes link data (state) with behavior.
For now this has data, no behavior (I cheated some behaviour into it ;).
Its use is more of a container for data that you pass around - if thats the only
thing it will ever do, use a dictionary as 'key=value' store instead."""
def __init__(self):
self.pname = ""

def FancyName(self):
"""Returns self.pname in an UpPeR LoWeR CaSe mAnNeR"""
return ''.join(x.upper() if i % 2 == 0 else x.lower() for i,
x in enumerate(self.pname))


# create data storage class instance
myData = MyData () # use a dictionary until you need "behaviour"

# left out more of your code

def name_select():
global myData
pname_lbl = tk.Label(text='INPUT NAME', fg='#00ffab', font = ['Helvetica', 50],
bg='#572f87')
pname_lbl.pack()
pname_lbl.place(x=950, y=340, anchor="center")

pname_ent = tk.Entry(bg='#00ffab', fg='#7d0234',
font = ['Helvetica', 40], width = 14)
pname_ent.pack()
pname_ent.place(x=950, y=415, anchor="center")
myData.pname = pname_ent.get() # at this time, pname_ent.get() is still empty, you
# need to capture the value when the GO button
# is pressed

# not sure if this syntax works, cant try right now. capture the pname_ent.get() value
# as 'lname' and provide it to the street() function, you destroy your inputs
# here, so no way to get to the values when already inside street() ...
go_btn = tk.Button(text='GO', font = ['Helvetica', 25], bg='#7d0234', fg='#00ffab',
width = 21,
command = lambda lname = pname_ent.get():[snd_stop(),
pname_lbl.destroy(), pname_ent.destroy(),
go_btn.destroy(), street(lname)])
go_btn.pack()
go_btn.place(x=950, y=490, anchor='center')

def street(n):
global myData
myData.pname = n
print(myData.FancyName())

关于python - Python 中基于 GUI 的冒险游戏 - 未定义玩家名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50851250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com