我正在尝试学习一些Python和Tkinter。下面的示例代码旨在在屏幕上放置两个窗口,一些按钮和一个带有图像的Canvas,并在其上绘制一些线条。
窗口和按钮看起来很好,但是我没有看到画布图像或画布线。我很感激帮助找出制作画布的必要条件。
from Tkinter import *
import Image, ImageTk
class App:
def __init__(self, master):
def scrollWheelClicked(event):
print "Wheel wheeled"
frame = Frame(master)
frame.pack()
self.button = Button(frame, text = "QUIT", fg="red", command=frame.quit)
self.button.pack(side=LEFT)
self.hi_there = Button(frame, text="Hello", command=self.say_hi)
self.hi_there.pack(side=LEFT)
top = Toplevel()
canvas = Canvas(master=top, width=600, height=600)
image = Image.open("c:\lena.jpg")
photo = ImageTk.PhotoImage(image)
item = canvas.create_image(0, 0, image=photo)
canvas.create_line(0, 0, 200, 100)
canvas.create_line(0, 100, 200, 0, fill="red", dash=(4, 4))
canvas.create_rectangle(50, 25, 150, 75, fill="blue")
canvas.pack
testBtn = Button(top, text = "test button")
testBtn.pack()
def say_hi(self):
print "hi there everyone!"
root = Tk()
app = App(root)
root.mainloop()
答案 0 :(得分:5)
我解决了这个问题:
self.photo = ImageTk.PhotoImage(image)
self.item = canvas.create_image(0, 0, image=self.photo)
必须将对ImageTk实例的引用存储在某处,或者当您的App.__init__()
方法返回时,它将被垃圾收集,并且画布将无法显示它。 (Tkinter没有保留对图像的引用。)
保持对它的引用的一种方法是将它存储在“self.photo”或名为“photo”的变量中,或者像大多数程序员一样对常量变量(不变的变量,如'TEN') = 10'),'PHOTO = PhotoImage(...)'为什么......我不知道。导入模块'gc'(内置Python 3的垃圾收集模块)并运行gc.disable()不起作用。 (如果你想尝试一下:https://docs.python.org/3/library/gc.html)
答案 1 :(得分:3)
在canvas对象上调用pack时需要括号。否则,您只是引用函数对象,而不是调用它。
例如:
canvas.pack()
另一个例子:
>>>def hello():
... print "hello world"
... return
>>>hello
返回函数引用(函数hello at 0x ....)
>>>hello()
实际上调用了hello函数