[英]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.