gpt4 book ai didi

python - 我正在尝试在 Python 中创建一个按钮(导入 Tkinter),每次点击后颜色都会改变

转载 作者:太空宇宙 更新时间:2023-11-04 09:16:58 24 4
gpt4 key购买 nike

我正在尝试在 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 - 所以请记住这一点。

最佳答案

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 被认为是 bool 值 false,而所有其他数字都是 bool 值 true(甚至 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 的值增加 1,但当它超过与最后一种颜色对应的索引时,让它返回到零(看看这与使用迭代器相比有多费力?):

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")
...

关于python - 我正在尝试在 Python 中创建一个按钮(导入 Tkinter),每次点击后颜色都会改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8144468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com