繁体   English   中英

Python Tkinter文本输出

[英]Python Tkinter Text Output

我正在与Tkinter一起制作“真心话大冒险”游戏。 我收到此错误:

 UnboundLocalError: local variable 'text' referenced before assignment

执行此代码时:

from tkinter import *
import random

tk = Tk()
tk.title("Truth or Dare")
tk.resizable(0, 0)
canvas = Canvas(tk, width=500,height=350)
canvas.create_text(250, 20, text="Truth Or Dare", fill='red', font=('Helvetica', 20))
text = canvas.create_text(250, 200, text='Test!')

def spm():
    canvas.delete(text)
    spillere = ['Niels','Astrid']
    p1 = random.choice(spillere)
    p2 = random.choice(spillere)
    x1 = random.randint(0,3)
    s1 = ['skal spise kage','sig huj ud af vinduet'] # En udfordring til en spiller
    s2 = ['kan du lide kage?','har du nogensinde danset step?'] # Et spørgsmål til en spiller
    s3 = ['skal sige hej til','skal sige huj til','skal spise kage med'] # Noget med en anden spiller
    s4 = ['vil du spise kage med','vil du spise kage med'] # Et spørgsmål om en anden spiller
    while True:
        if p1 == p2:
            p2 = random.choice(spillere)
        else:
            break
    if x1 == 0:
        text = canvas.create_text(250, 200, text='%s %s' % (p1, random.choice(s1)), font=('Helvetica', 15))
    elif x1 == 1:
        text = canvas.create_text(250, 200, text='%s %s' % (p1, random.choice(s2)), font=('Helvetica', 15))
    elif x1 == 2:
        text = canvas.create_text(250, 200, text='%s %s %s' % (p1, random.choice(s3), p2), font=('Helvetica', 15))
    elif x1 == 3:
        text = canvas.create_text(250, 200, text='%s %s %s?' % (p1, random.choice(s4), p2), font=('Helvetica', 15))


btn = Button(tk, text="Klik!", command=spm, width=50,height=5,font=('Helvetica' , 15))
btn.pack()
canvas.pack()

我希望在按下按钮时将字符串显示在画布上,并在再次按下按钮时获得新的字符串显示,而不会在同一位置出现两个字符串。

谢谢。

text声明为全局值。 否则,解释器会认为text是本地的,并且在您在if套件中为其分配之前,在canvas.delete(text)引用该text时会感到困惑。

def spm():
    global text
    #...etc

spm函数内部的文本是局部范围的,并且与该函数之前声明的全局文本变量不同

我总是发现使gui环境脱离类工作更好,我将text变量assigments更改为id,因为canvas.create_text返回所作用的画布的ID,而不是任何实际的文本值。 您会发现通过利用该类,它将起作用。

from Tkinter import *
import random

tk = Tk()
tk.title("Truth or Dare")
tk.resizable(0, 0)
canvas = Canvas(tk, width=500,height=350)
canvas.create_text(250, 20, text="Truth Or Dare", fill='red', font=    ('Helvetica', 20))
class Window(object):
    def __init__(self):
        self.id = canvas.create_text(250, 200, text='Test!')

    def spm(self):
        canvas.delete(self.id)
        spillere = ['Niels','Astrid']
        p1 = random.choice(spillere)
        p2 = random.choice(spillere)
        x1 = random.randint(0,3)
        s1 = ['skal spise kage','sig huj ud af vinduet'] # En    udfordring til en spiller
        s2 = ['kan du lide kage?','har du nogensinde danset step?']
        s3 = ['skal sige hej til','skal sige huj til','skal spise kage me d'] # Noget med en anden spiller
        s4 = ['vil du spise kage med','vil du spise kage med']
        while True:
            if p1 == p2:
                p2 = random.choice(spillere)
            else:
                break
        if x1 == 0:
            self.id = canvas.create_text(250, 200, text='%s %s' % (p1, random.choice(s1)), font=('Helvetica', 15))
        elif x1 == 1:
            self.id = canvas.create_text(250, 200, text='%s %s' % (p1,random.choice(s2)), font=('Helvetica', 15))
        elif x1 == 2:
            self.id = canvas.create_text(250, 200, text='%s %s %s' % (p1, random.choice(s3), p2), font=('Helvetica', 15))
        elif x1 == 3:
            self.id = canvas.create_text(250, 200, text='%s %s %s?' % (p1, random.choice(s4), p2), font=('Helvetica', 15))

window = Window()
btn = Button(tk, text="Klik!", command=window.spm,     width=50,height=5,font=('Helvetica' , 15))
btn.pack()
canvas.pack()
tk.mainloop()

不要将文本用作变量名:

text = canvas.create_text(250, 200, text='Test!')

应该变成(例如):

mytext = canvas.create_text(250, 200, text='Test!')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM