我正在使用tkinter在Pythons中构建一个UI.我有一个带有图像的按钮,我想在单击它时更改图像.

按钮非常简单:

self.otherImage = tkinter.PhotoImage(file=os.path.join(self.imagesFolder, "image2.png"))

self.image=tkinter.PhotoImage(file=os.path.join(self.imagesFolder, "image1.png"))
self.button = tkinter.Button(self.mainWindow, image=self.image, command=lambda: [self.clicked()])

以及点击的功能:

def clicked(self):
    self.button.image=self.otherImage

但图形用户界面中的图像永远不会改变.我试着交换图像,看到了相同的行为,两个图像都会在初始加载时显示,但都不会在点击时加载.

我觉得我错过了一些简单的东西.

推荐答案

你可以通过.keys()查看所有Widget个选项.

#replace `DesiredWidget` with the existing widget that you want info from
print(tk.DesiredWidget(None).keys())

如果我们对tk.Button人这样做,"image"是目前的关键之一.这意味着您可以执行以下任一操作:

#set
button['image'] = the_image
button.configure(image=the_image)

#get
the_image = button['image']
the_image = button.cget('image')

无论您是调用方法还是键入选项,tk都会遍历多个分支以最终设置您想要的选项.您可以通过手动调用直接转到最终命令.

#self._w already exists, you just need to supply `the_image`
self.tk.call(self._w, 'configure', '-image', the_image)

如果你想做下面这样的事情,上面的信息可能会很有帮助.通过将您的Button更改为ImageButton,您的其余代码将工作,并直接到达调用点.

import tkinter as tk

class ImageButton(tk.Button):
    @property
    def image(self):
        try: return self.tk.call(self._w, 'cget', '-image')
        except tk.TclError: return None

    @image.setter
    def image(self, img):
        try: self.tk.call(self._w, 'configure', '-image', img)
        except tk.TclError: pass #replace pass with something meaningful

Python相关问答推荐

计算相同形状的两个张量的SSE损失

使用mySQL的SQlalchemy过滤重叠时间段

试图找到Python方法来部分填充numpy数组

Python—从np.array中 Select 复杂的列子集

对象的`__call__`方法的setattr在Python中不起作用'

Pandas DataFrame中行之间的差异

当点击tkinter菜单而不是菜单选项时,如何执行命令?

实现神经网络代码时的TypeError

如何使用SentenceTransformers创建矢量嵌入?

在Python中调用变量(特别是Tkinter)

pandas fill和bfill基于另一列中的条件

以异步方式填充Pandas 数据帧

Python将一个列值分割成多个列,并保持其余列相同

计算机找不到已安装的库'

提取最内层嵌套链接

如何用FFT确定频变幅值

如何在Django模板中显示串行化器错误

如何从一个维基页面中抓取和存储多个表格?

某些值的数值幂和**之间的差异

奇怪的Base64 Python解码