输入文本无法正确显示在画布上

问题描述

我正在尝试使用 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())
    ...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...