如何解决将事件绑定到组合框选择以在 Toplevel 窗口中显示图像Tkinter Python
我试图将选择事件绑定到组合框中的项目,以在选择指定项目后在顶层窗口内显示图像。我运行的代码没有错误。但是,选择组合框内的项目时不会显示图像。任何帮助将不胜感激。
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,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,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):
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。