Tkinter create_image
Tkinter create_image
我一直在努力获得一个简单的 Tkinter canvas 来使用 create_image 显示图像。我读过很多帖子说你需要在任何函数或 class 之外创建对对象的引用,否则图像对象将被垃圾收集。不幸的是,我仍然无法让它工作。以下是我的代码。忽略所有颜色 - 我用它们来说明框架和 canvas 在 window.
上的位置
-柯克
import Tkinter as tk
from PIL import Image
from PIL import ImageTk
imageList = []
image = Image.open('len_std.jpg')
#event handlers
def hit_sel_click():
imageList = []
test_image = ImageTk.PhotoImage(image)
imageList.append(cnv_hits.create_image(0,0,
image=test_image))
#start root
root = tk.Tk()
root.title('SimView')
root.resizable(width=False, height=False)
#target/control variables
hit_sel = tk.StringVar() #holds radio button with activity level
#build GUI
frm_hits = tk.Frame(root, height=800, width=200, bg='#FF0000')
frm_hits.grid(rowspan=3, sticky=tk.W+tk.N+tk.S+tk.E)
tk.Label(frm_hits, text='Activity:').grid()
tk.Radiobutton(frm_hits, text='Low', variable=hit_sel, value='Low',
command=hit_sel_click).grid(sticky=tk.W)
tk.Radiobutton(frm_hits, text='Medium', variable=hit_sel, value='Medium',
command=hit_sel_click).grid(sticky=tk.W)
tmp = tk.Radiobutton(frm_hits, text='High', variable=hit_sel,value='High',
command=hit_sel_click)
tmp.grid(sticky=tk.W)
tmp.select()
frm_hit_list = tk.Frame(frm_hits, bg='#002288')
frm_hit_list.grid(sticky=tk.W+tk.N+tk.E+tk.S)
scrl_hits = tk.Scrollbar(frm_hit_list, orient=tk.VERTICAL)
scrl_hits.grid(row=0, column=1, sticky=tk.N+tk.S)
cnv_hits = tk.Canvas(frm_hit_list, bg='#888800',width=200, height=200,
yscrollcommand=scrl_hits.set)
cnv_hits.grid(row=0, column=0, sticky=tk.W+tk.N+tk.E+tk.S)
scrl_hits.config(command=cnv_hits.yview)
root.mainloop()
您正在使用 test_image
绘制 cnv_hits
的图像。没错,但是您忘记了 test_image
是 hit_sel_click()
方法的局部变量;这意味着它对您的主程序不可用。
要解决这个问题,您有 2 个选择:
- 要么在
hit_sel_click()
中将 test_image
声明为 global
- 或者 运行
test_image = ImageTk.PhotoImage(image)
在你声明之前 hit_sel_click()
.
诺塔贝内:
对于第一种情况,你需要在hit_sel_click()
之前运行root = tk.Tk()
。
如果您选择第二个选项,您需要在test_image = ImageTk.PhotoImage(image)
之前运行root = tk.Tk()
如果您不这样做,您的程序将引发 RuntimeError
异常。
我一直在努力获得一个简单的 Tkinter canvas 来使用 create_image 显示图像。我读过很多帖子说你需要在任何函数或 class 之外创建对对象的引用,否则图像对象将被垃圾收集。不幸的是,我仍然无法让它工作。以下是我的代码。忽略所有颜色 - 我用它们来说明框架和 canvas 在 window.
上的位置-柯克
import Tkinter as tk
from PIL import Image
from PIL import ImageTk
imageList = []
image = Image.open('len_std.jpg')
#event handlers
def hit_sel_click():
imageList = []
test_image = ImageTk.PhotoImage(image)
imageList.append(cnv_hits.create_image(0,0,
image=test_image))
#start root
root = tk.Tk()
root.title('SimView')
root.resizable(width=False, height=False)
#target/control variables
hit_sel = tk.StringVar() #holds radio button with activity level
#build GUI
frm_hits = tk.Frame(root, height=800, width=200, bg='#FF0000')
frm_hits.grid(rowspan=3, sticky=tk.W+tk.N+tk.S+tk.E)
tk.Label(frm_hits, text='Activity:').grid()
tk.Radiobutton(frm_hits, text='Low', variable=hit_sel, value='Low',
command=hit_sel_click).grid(sticky=tk.W)
tk.Radiobutton(frm_hits, text='Medium', variable=hit_sel, value='Medium',
command=hit_sel_click).grid(sticky=tk.W)
tmp = tk.Radiobutton(frm_hits, text='High', variable=hit_sel,value='High',
command=hit_sel_click)
tmp.grid(sticky=tk.W)
tmp.select()
frm_hit_list = tk.Frame(frm_hits, bg='#002288')
frm_hit_list.grid(sticky=tk.W+tk.N+tk.E+tk.S)
scrl_hits = tk.Scrollbar(frm_hit_list, orient=tk.VERTICAL)
scrl_hits.grid(row=0, column=1, sticky=tk.N+tk.S)
cnv_hits = tk.Canvas(frm_hit_list, bg='#888800',width=200, height=200,
yscrollcommand=scrl_hits.set)
cnv_hits.grid(row=0, column=0, sticky=tk.W+tk.N+tk.E+tk.S)
scrl_hits.config(command=cnv_hits.yview)
root.mainloop()
您正在使用 test_image
绘制 cnv_hits
的图像。没错,但是您忘记了 test_image
是 hit_sel_click()
方法的局部变量;这意味着它对您的主程序不可用。
要解决这个问题,您有 2 个选择:
- 要么在
hit_sel_click()
中将 - 或者 运行
test_image = ImageTk.PhotoImage(image)
在你声明之前hit_sel_click()
.
test_image
声明为 global
诺塔贝内:
对于第一种情况,你需要在
hit_sel_click()
之前运行root = tk.Tk()
。如果您选择第二个选项,您需要在
test_image = ImageTk.PhotoImage(image)
之前运行
root = tk.Tk()
如果您不这样做,您的程序将引发 RuntimeError
异常。