将事件绑定到组合框选择以在 Toplevel window (Tkinter Python) 内显示图像

Binding event to combobox selection to display image inside Toplevel window (Tkinter Python)

我正在尝试将选择事件绑定到组合框中的项目,以便在选择指定项目后在顶层 window 内显示图像。我运行的代码没有错误。但是,在选择组合框中的项目时不会显示图像。任何帮助将不胜感激。

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()

这是将回调绑定到 Combobox 事件的一个微妙问题,您需要传入一个函数作为参数,但是您写了

self.CMB.bind("<<ComboboxSelected>>", self.CMBinsert())

self.CMBinsert 之后有括号,所以你没有传递函数,你实际上是调用函数一次,然后传递结果。只需删除那些括号:

self.CMB.bind("<<ComboboxSelected>>", self.CMBinsert)

之后,回调签名出现错误:

TypeError: CMBinsert() takes 1 positional argument but 2 were given

因为它需要一个 event 参数,只需将您的 def 更改为:

 def CMBinsert(self, evt):