I am attempting to bind a selection event to items within a combobox to display an image inside a toplevel window once the specified item is selected. The code I have runs without error. However, the images are not displayed upon selecting the items inside the combobox. Any help would be appreciated.
from tkinter import * import tkinter as tk from tkinter import ttk class Image_viewer: def __init__(self, win): self.root = win self.root.title('Root Window') self.root.geometry('200x150+600+200') self.lblHeading = tk.Label(self.root, text = 'Root Window', font = ('Times New Roman', 14), bg = 'White') self.lblHeading.pack(side = tk.TOP) self.lblHeading.focus() self.btnView = tk.Button(self.root, text = 'Image Viewer', command = self.view) self.btnView.place(relx = 0.5, rely = 0.9, anchor = tk.SE) self.btnClose = tk.Button(self.root, text = 'Close', command = self.close) self.btnClose.place(relx = 0.8, rely = 0.9, anchor = tk.SE) def CMBinsert(self): self.imgas = tk.PhotoImage(file = '../raw/as.png') self.imggr = tk.PhotoImage(file = '../raw/gr.png') if self.box_value.get() == 'as': #creates textbox to insert image into self.mytext = tk.Text(self.top) self.mytext.place(relx = 0.5, rely = 0.80, height=150, width=200, anchor = tk.CENTER) #inserts image into textbox self.mytext.image_create(tk.END, image = self.imgas) elif self.box_value.get() == 'gr': #creates textbox to insert image into self.mytext = tk.Text(self.top) self.mytext.place(relx = 0.5, rely = 0.80, height=150, width=200, anchor = tk.CENTER) #inserts image into textbox self.mytext.image_create(tk.END, image = self.imgas) else: pass def view(self): #creating top level self.top = Toplevel() self.top.title('Top Level') self.top.geometry('500x500') #Quit Button self.btnClose2 = Button(self.top, text="Quit", command= self.top.destroy) self.btnClose2.place(relx = 0.9, rely = 0.1, anchor = tk.SE) #initializing combobox self.box_value=StringVar() self.CMB = ttk.Combobox(self.top, textvariable=self.box_value, state='readonly') self.CMB['values']=['as','gr'] self.CMB.place(relx = 0.6, rely = 0.3, anchor = tk.SE) #binding selection event to combobox selection event self.CMB.bind("<<ComboboxSelected>>", self.CMBinsert()) def close(self): self.root.destroy() def main(): root = tk.Tk() Image_viewer(root) root.mainloop() if __name__ == '__main__': main()
Advertisement
Answer
This is a subtle issue with binding the callback to the Combobox event, you need to pass in a function as an argument, but you wrote
self.CMB.bind("<<ComboboxSelected>>", self.CMBinsert())
with the parenthesis after self.CMBinsert
, so you’re not passing the function, you’re actually calling the function once, and passing in the result instead. Just remove those parenthesis:
self.CMB.bind("<<ComboboxSelected>>", self.CMBinsert)
After that, you get an error on the callback’s signature:
TypeError: CMBinsert() takes 1 positional argument but 2 were given
because it’s expecting an event
parameter, just change your def to:
def CMBinsert(self, evt):