我是新手python用户。 今天我想得到一个网站的验证码,并在我的GUI上显示但遇到问题。 在这段代码中,我在画布的位置上什么都得不到,但标签和按钮可以正确显示:
class Application():
def __init__(self):
self.root = Tkinter.Tk()
self.createWidgets()
def createWidgets(self):
label = Label(self.root,text='Input this Checkcode')
label.pack() #show correctly
canvas = Tkinter.Canvas(self.root,width = 500)
response = urllib2.urlopen('http://xxx/ValidateCode')
image = Image.open(StringIO(response.read()))
im = ImageTk.PhotoImage(image)
canvas.create_image(300,50,image = im)
canvas.pack() # no image
quitButton = Button(self.root,text='Quit',command=self.root.quit)
quitButton.pack() #show correctly
if __name__ == '__main__':
app = Application()
app.root.mainloop()
但是在这个中我获得了预期的结果,唯一的区别是在 main 中编写GUI而不是另一个类:
if __name__ == '__main__':
root = Tkinter.Tk()
response = urllib2.urlopen('http://xxx/ValidateCode')
image = Image.open(StringIO(response.read()))
label = Label(root,text='Input this Checkcode')
label.pack() # show correctly
canvas = Tkinter.Canvas(root,width = 500)
im = ImageTk.PhotoImage(image)
canvas.create_image(300,50,image = im)
canvas.pack() # show correctly
quitButton = Button(root,text='Quit',command=root.quit)
quitButton.pack() # show correctly
root.mainloop()
这是为什么?我真的很困惑......谢谢。
答案 0 :(得分:1)
将您的Canvas和其他GUI元素转换为Application
的实例变量,如self.canvas
,self.label
等。否则当您离开{{1}时,它们将超出范围}。 main 示例有效的原因是因为调用createWidgets
时所有变量仍在范围内。