如何在Python Tk Frame中显示和更改图标

0 投票
2 回答
2810 浏览
提问于 2025-04-16 14:00

我有一个用Python Tkinter做的框架,这个框架里显示了几个字段。我还想加一个红色/黄色/绿色的图标,用来显示一个外部设备的状态。
这个图标是从一个叫做ICON_LED_RED.ico的文件中加载的。

  1. 我该怎么在我的框架里显示这个图标呢?
  2. 我该怎么在运行时更改这个图标?比如把BitmapImage('RED.ico')换成BitmapImage('GREEN.ico')。

这里有一些代码,但它是工作的:

class Application(Frame):

  def __init__(self,  master=None):

    Frame.__init__(self, master)
    self.pack()
    self.createWidgets()


  def createWidgets(self):

    #  ...other frame code.. works just fine.
    self.OKBTN = Button(self)
    self.OKBTN["text"] = "OK"
    self.OKBTN["fg"]   = "red"
    self.OKBTN["command"] =  self.ok_btn_func
    self.OKBTN.pack({"side": "left"})

    # when I add the following the frame window is not visible
    # The process is locked up such that I have to do a kill -9 
    self.statusFrame = Frame(self, bd=2, relief=RIDGE)
    Label(self.statusFrame, text='Status:').pack(side=LEFT, padx=5)
    self.statIcon = BitmapImage('data/ICON_LED_RED.ico')
    Label (self.statusFrame, image=self.statIcon ).grid()
    self.statusFrame.pack(expand=1, fill=X, pady=10, padx=5) 

2 个回答

0

我用下面的代码在tkinter中显示一个图标

class dialog(Tk):
     def __init__(self):
        Tk.__init__(self)
        self.wm_iconbitmap('images/Icon.ico')
1

问题在于你在同一个容器里同时使用了网格布局和打包布局。这种情况常常会导致图形界面卡住。原因是,网格管理器会调整所有东西的大小以适应,然后打包管理器又看到变化,重新调整大小。接着,网格管理器又看到变化,再次调整大小,反复循环。

你在使用打包布局的时候,给包含“状态:”文本的标签用了打包,而给带有图片的标签用了网格布局。

撰写回答