【问题标题】:How to Update TKinter Label Image Using Classes (Dynamic Update Using Config() Method) [duplicate]如何使用类更新 TKinter 标签图像(使用 Config() 方法动态更新)[重复]
【发布时间】:2021-07-23 00:14:45
【问题描述】:

我想更新存储在 red_smiley_1 标签中的图像。 我想定义我的方法'change_row_one',以便我可以使用 Label.configure() 方法来更新存储在此 Label 小部件中的图像。 我应该如何定义我的方法? 我已经包含了我当前的方法,这给我带来了问题。 谢谢。

class Cube(tk.Tk):
  def __init__(self):
  super().__init__()
  self.title("John's GUI Cube Application")
  self.geometry("300x180")
  self.resizable(True,True)

  container = ttk.Frame(self)
  container.grid(padx=10,pady=10,sticky='EW')

  cube_frame = CubeFrame(container).grid(row=0,column=0,sticky='NSEW')

class CubeFrame(ttk.Frame):
  def __init__(self,container):
  super().__init__(container)
  self.red_smiley = ImageTk.PhotoImage(Image.open('./images/red_smile.png'))
  self.white_smiley = ImageTk.PhotoImage(Image.open('./images/white_smile.png'))
  self.yellow_smiley = ImageTk.PhotoImage(Image.open('./images/yellow_smile.png'))

  # Red Smiley Image Labels
  self.red_smiley_1 = ttk.Label(self,image=self.red_smiley).grid(row=0,column=0)
  self.red_smiley_2 = ttk.Label(self,image=self.red_smiley).grid(row=0,column=1)
  self.red_smiley_3 = ttk.Label(self,image=self.red_smiley).grid(row=0,column=2)

  # Image Label Buttons
  self.row_one_button = ttk.Button(self,text='Change Row 1',command=self.change_row_one).grid(row=0,column=3,sticky='WE')
  self.row_two_button = ttk.Button(self,text='Change Row 2',command=self.change_row_two).grid(row=1,column=3,sticky='WE')
  self.row_three_button = ttk.Button(self,text='Change Row 3',command=self.change_row_three).grid(row=2,column=3,sticky='WE')

  # Change Row One Image Labels
  def change_row_one(self):
    new_image = ImageTk.PhotoImage(Image.open('./images/white_smile.png'))
    self.red_smile_1.configure(image=new_image)
    self.red_smile_1.image = new_image

【问题讨论】:

  • 点击按钮你什么也没做,那它怎么改变图像呢?
  • 我应该澄清一下,我正在尝试使用按钮单击来更新存储在标签“red_smiley_1”中的图像。我最初定义 'change_row_one' 方法的方法如下: def change_row_one(self): new_image = ImageTk.PhotoImage(Image.open('./images/white_smile.png')) self.red_smile_1.configure(image=new_image ) self.red_smile_1.image = new_image
  • 如果您使用的是同一张 white_smiley 图像,则不必创建新变量 (new_image)。看看my answer

标签: python tkinter label project


【解决方案1】:

我发现了我的问题。 创建标签时,我在同一行中使用了 grid() 方法。 这是返回无。 解决方案网址:Tkinter: AttributeError: NoneType object has no attribute <attribute name>

【讨论】:

  • 我不是发布了同样的答案吗?这不是解决了你的问题吗?
【解决方案2】:

你可以试试这个:

class CubeFrame(ttk.Frame):
    def __init__(self,container):
    super().__init__(container)
        self.red_smiley = ImageTk.PhotoImage(Image.open('./images/red_smile.png'))
        self.white_smiley = ImageTk.PhotoImage(Image.open('./images/white_smile.png'))
        self.yellow_smiley = ImageTk.PhotoImage(Image.open('./images/yellow_smile.png'))
        
          # Red Smiley Image Labels
        self.red_smiley_1 = ttk.Label(self,image=self.red_smiley)
        self.red_smiley_1.grid(row=0,column=0)
        self.red_smiley_2 = ttk.Label(self,image=self.red_smiley)
        self.red_smiley_2.grid(row=0,column=1)
        self.red_smiley_3 = ttk.Label(self,image=self.red_smiley)
        self.red_smiley_3.grid(row=0,column=2)
        
          # Image Label Buttons
        self.row_one_button = ttk.Button(self,text='Change Row 1',command=change_row_one)
        self.row_one_button.grid(row=0,column=3,sticky='WE')
        self.row_two_button = ttk.Button(self,text='Change Row 2',command=change_row_two)
        self.row_two_button.grid(row=1,column=3,sticky='WE')
        self.row_three_button = ttk.Button(self,text='Change Row 3',command=change_row_three)
        self.row_three_button.grid(row=2,column=3,sticky='WE')

  # Change Row One Image Labels
    def change_row_one(self):
        self.red_smiley_1.config(img=<other image/self.white_smiley>)

首先,您在制作新标签时做错了。您正在制作新标签并设置该标签的内联位置,这将返回None,这意味着您不能使用这些响应变量。而且你不必在命令中做self.&lt;function&gt;,函数不需要self你只能写&lt;function&gt;

【讨论】:

  • 当我在单击按钮后使用您的方法时,标签不会以图形方式显示我使用您在解决方案中提到的 configure() 方法引用的新图像。想法?
  • @YohanCho 我不明白你的意思。你什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2020-10-21
相关资源
最近更新 更多