问题描述
我正在尝试使用 Python 中的 tKinter 库编写游戏代码。我制作了三个必须协同工作的函数。两个函数用于显示名称输入并将其保存到变量中,而另一个函数用作游戏本身。第一个列出的函数是我用来将输入存储到变量中的函数。第二个函数用于名称输入。第三个功能是针对游戏本身的。
def input_ophalen():
input = Naam1.get("1.0","end-1c")
print(input)
input = Naam2.get("1.0","end-1c")
print(input)
input = Naam3.get("1.0","end-1c")
print(input)
def create_kiezen():
global Naam1
global Naam2
global Naam3
kiezen = Tk()
kiezen.geometry('600x600')
kiezen.title('Namen invoeren!')
kiezen.configure(background='darkgrey')
Spelen = Button(kiezen,text='Begin!',bd='5',height='2',width='15',command=lambda: [kiezen.destroy(),Spelmenu()])
Terug = Button(kiezen,text='Terug',menu()])
Spelen.pack(anchor='s',side='right')
Terug.pack(anchor='s',side='left')
kiezen.minsize(400,400)
kiezen.maxsize(400,400)
naamblok = Canvas(kiezen,width=300,height=200)
naamblok.place(x=50,y=50)
Opslaan=Button(naamblok,height=1,width=10,text='Opslaan',command=lambda: input_ophalen())
Opslaan.place(relx=0.5,rely=0.7,anchor=CENTER)
Naam1=Text(naamblok,width=15,height=1)
Naam1.place(relx=0.5,rely=0.3,anchor=CENTER)
Naam2= Text(naamblok,height=1)
Naam2.place(relx=0.5,rely=0.4,anchor=CENTER)
Naam3=Text(naamblok,height=1)
Naam3.place(relx=0.5,rely=0.5,anchor=CENTER)
mainloop()
def Spelmenu():
global punt1
global punt2
global punt3
spelmenu = Tk()
spelmenu.geometry('400x400')
spelmenu.title('Spelen maar!')
spelmenu.configure(background='darkgrey')
spelmenu.minsize(400,400)
spelmenu.maxsize(400,400)
volgendeB = Button(spelmenu,text='Volgende worp',width='15')
volgendeB.place(x=150,y=350)
wBeurt = Canvas(spelmenu,height=60)
wBeurt.place(x=50,y=40)
wBeurt.create_text(150,30,text="De beurt is aan " + str(Naam1))
scores = Canvas(spelmenu,height=200)
scores.place(x=50,y=130)
worp1=randint(1,6)
worp2=randint(1,6)
fWorp1=str(worp1)
fWorp2=str(worp2)
if worp1 < worp2 or worp1 > worp2:
punt1 = 2
scores.create_text(156,10,text="Je hebt " + fWorp1 + " en " + fWorp2 + " gegooit dus je hebt 2 punten gekregen!")
else:
punt1 = 5
scores.create_text(156,text="Je hebt " + fWorp1 + " en " + fWorp2 + " gegooit dus je hebt 5 punten gekregen!")
mainloop()
代码的问题在于,当您进入游戏的实际窗口时,它会在顶部画布中显示以下内容:“De beurt is aan .!canvas.!text”。而不是“.!canvas.!text”我想要第一个玩家的名字。有谁知道我该如何解决这个问题?
解决方法
由于 keizen.destroy()
在 Spelmenu()
之前被调用,Naam1
也会被销毁。因此,在 Naam1
内部访问 Spelmenu()
时会引发异常。
建议使用另一个全局 StringVar
Naam1_var
来存储 Naam1
的内容并在 Spelmenu()
中使用该变量:
def create_kiezen():
global Naam1,Naam1_var
...
Naam1_var = StringVar()
Spelen = Button(kiezen,text='Begin!',bd='5',height='2',width='15',command=lambda: [Naam1_var.set(Naam1.get("1.0","end-1c")),kiezen.destroy(),Spelmenu()])
...
def Spelmenu():
...
wBeurt.create_text(150,30,text="De beurt is aan " + Naam1_var.get())
...