【问题标题】:I'm trying to create a button in Python (importing Tkinter) that changes color after every click我正在尝试在 Python 中创建一个按钮(导入 Tkinter),每次单击后都会改变颜色
【发布时间】:2011-12-29 23:26:35
【问题描述】:

我正在尝试在 Python 中创建一个按钮(使用 Tkinter),每次单击它都会改变颜色。到目前为止我有这个:

from Tkinter import *

class Application(Frame):

    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid()
            #initialize frame
        self.create_widgets()
        self.bttn_clicks = 0
            #initiates button clicks

    def create_widgets(self):
        self.bttn1 = Button(self)
        self.bttn1["text"] = "Click Me!"
        self.bttn1["command"] = self.update_count
        self.bttn1.grid()
            #creates button

    def update_count(self):
        if self.bttn_clicks + 1:
            self.bttn1.configure(background = "blue")
        if self.bttn_clicks + 2:
            self.bttn1.configure(background = "green")
        if self.bttn_clicks + 3:
            self.bttn1.configure(background = "orange")
        if self.bttn_clicks + 4:
            self.bttn1.configure(background = "red")
        if self.bttn_clicks + 5:
            self.bttn1.configure(background = "yellow")
            #changes colors from blue, to green, orange, red, then yellow

root = Tk()
root.title("Color Button")
root.geometry("200x85")
app = Application(root)
root.mainloop()

如果有人能提供帮助,我将不胜感激。另外,我是编程和 Python 的新手,我 3 天前才开始使用 Tkinter - 所以请记住这一点。

【问题讨论】:

  • @unutbu:不,这有点不同。标题大致相同。另一个问题只是某些代码中的错误,这更像是“我该怎么做?”类型的问题。不过,另一个解决方案当然可以作为这个解决方案的一个例子。
  • @unutbu 在发布这个问题之前我已经看过了,但它对我没有帮助。

标签: python tkinter


【解决方案1】:

在编辑问题之前,您没有保存对按钮的引用,因此以后无法修改它。为了能够修改小部件,您需要保存对它的引用。然后,稍后您可以使用configure 方法对其进行修改以更改其颜色:

self.bttn1 = Button(...)
...
self.bttn1.configure(background = "red"

【讨论】:

  • 保存对按钮的引用是什么意思?实际上我刚刚更新了我的工作,因为自从我上次发布这个问题以来,我已经完成了一些事情。
  • “保存引用”是指将小部件的实例分配给类的属性(例如:self.bttn1 = ...),而不是将其分配给临时变量(例如:buttn1 = ...)。
【解决方案2】:

Python 有iterators。它们类似于列表,但迭代器中的项目是根据需要生成的,而不是在定义时全部枚举。这是一个无限迭代器的示例,它是通过用itertools.cycle 包装一个元组来实现的:

In [119]: import itertools

In [120]: color=itertools.cycle(('blue', 'green', 'orange', 'red', 'yellow'))

In [121]: color
Out[121]: <itertools.cycle object at 0x9a1846c>

您可以通过对其应用next 函数来从迭代器中提取值:

In [122]: next(color)
Out[122]: 'blue'

In [123]: next(color)
Out[123]: 'green'

如果我们继续调用next 的次数足够多,迭代器将到达yellow,然后循环返回再次产生blue。因此,它是一个无限迭代器,它完美地描述了我们想要的按钮颜色,而不必弄乱任何计数器变量。

所以不用self.bttn_clicks,你可以这样使用这个迭代器:

import Tkinter as tk
import itertools

class App(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self,master)
        self.master=master
        self.grid()
        self.colors=itertools.cycle(('blue', 'green', 'orange', 'red', 'yellow'))
        self.bttn1=tk.Button(self, text='Click Me!', bg=next(self.colors),
                             command=self.change_color)
        self.bttn1.grid()
    def change_color(self):
        color=next(self.colors)
        self.bttn1.configure(background=color)

root=tk.Tk()
root.title('Color Button')
root.geometry('200x85')
app=App(root)
root.mainloop()

请注意,当鼠标悬停在按钮上时,按钮会突出显示。因此,当您单击按钮时,它看起来是灰色的。您必须将鼠标从按钮上移开才能看到颜色。


代码

if self.bttn_clicks + 1:

告诉 Python 计算表达式 self.bttn_clicks + 1。因为self.bttn_clicks 从 0 开始,所以这个表达式等于 1。在 Python 中,0 被认为是布尔假,而所有其他数字都是布尔真(甚至 float('nan')float('inf')!)。所以if self.bttn_clicks + 1 的计算结果为True 并且if-block 被执行。

因此按钮设置为蓝色:

self.bttn1.configure(background = "blue")

下一个条件

if self.bttn_clicks + 2:

被评估为 0+2 相当于 2 再次为真, 所以下一个if-block 也会被执行。现在按钮设置为绿色。以此类推。

显然,这不是我们想要的。相反,将self.bttn_clicks 的值加一,但当它超过对应于最后一种颜色的索引时,让它回零(看看这与使用迭代器相比有多费力?):

self.bttn_clicks=(self.bttn_clicks+1)%5

并测试 self.bttn_clicks 现在等于哪个值:

   if self.bttn_clicks == 0:
        self.bttn1.configure(background = "blue")
   elif self.bttn_clicks == 1:
        self.bttn1.configure(background = "green")
   ...

【讨论】:

  • 好的,我明白你在说什么,谢谢!如果我想通过使用 self.bttn_clicks 计算点击次数来改变颜色怎么办 - 主要是因为我现在很好奇如何做到这一点。
  • 哇,好吧,我终于让它工作了!非常感谢!我实际上了解我的程序现在在做什么。
猜你喜欢
  • 2015-04-15
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2023-03-07
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
相关资源
最近更新 更多