首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tkinter按钮颜色无缘无故闪烁

Tkinter按钮颜色无缘无故闪烁
EN

Stack Overflow用户
提问于 2019-07-25 09:23:24
回答 1查看 68关注 0票数 0

我正在创建一个刷新函数来更改tkinter中按钮的颜色,问题是这个颜色必须来自另一个函数,该函数返回一个字符串,每次我更新所有内容时都会闪烁片刻。

我试过使用StringVar(),只更新颜色而不更新整个布局,但是它只会停留在循环中,不会显示布局。我还试着把所有的表都扔到一个列表中,然后立即改变整个网格,而不是一个一个地改变网格,但没有成功。

守则的核心是:

代码语言:javascript
复制
root = Tk()
frame=Frame(root)
root.title("States")
Grid.rowconfigure(root, 0, weight=1)
Grid.columnconfigure(root, 0, weight=1)
frame.grid(row=0, column=0, sticky=N+S+E+W)
grid=Frame(frame)
grid.grid(sticky=N+S+E+W, column=0, row=7, columnspan=2)
Grid.rowconfigure(frame, 7, weight=1)
Grid.columnconfigure(frame, 0, weight=1)

def loop_1():
        for x in range(4):
            for y in range(3):
                btnxy(x,y,frame)
        for x in range(4):
            Grid.columnconfigure(frame, x, weight=1)
        for y in range(3):
            Grid.rowconfigure(frame, y, weight=1)
        root.after(1000,loop_1)
loop_1()

其中btnxy创建一个按钮并将其放置在网格中。

代码语言:javascript
复制
def btnxy(x,y,frame):
    index=4*y+x+1
    if index>8:
        message="Relay "+str(index-8)
        btn = Button(frame,text=message, command=lambda p=(index-8): Relay(index-8), bg="blue", relief="groove", height=10, width=30)
    else:
        message="Entrée "+str(index)
        color=check_color(index)
        btn = Button(frame,text=message, command="", bg=color, relief="groove", height=10, width=30)
    btn.grid(column=x, row=y, sticky=N+S+E+W

check_color是一个函数,它返回带有“红色”或“绿色”的字符串。

对于我的理解,这应该不需要太多的处理能力,因此更新容易,但它会闪现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-25 12:24:32

我试着修改一下您的代码,但老实说,我无法让它工作,也不理解它背后的逻辑。有几点是不合适的:

1)全球进口情况不佳。不要使用from tkinter import *。相反,请使用import tkinter as tk。这提高了可读性,使事情变得清晰,还有许多其他好处(您可以很容易地在Google上找到更多)。

2)使用函数loop1将按钮放置在所需的框架中。这一切都很好,但您没有将框架作为参数传递,root也是如此。如果您确实修改了代码以说明这一点,您将看到闪存消失了,尽管由于缺乏参数,root.after会出现问题。

这里的解决方案是更改应用程序的结构,以便按钮和根可以方便地访问和使用。让您开始工作的一种方法可以是以下代码:

代码语言:javascript
复制
import tkinter as tk
from random import shuffle


def get_random_colors():
    colors = ["red" for i in range(4)] + ["blue" for i in range(4)] + ["green" for i in range(4)]
    shuffle(colors)
    return colors


class MyGUI(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)

        self.frame = tk.Frame()
        self.frame.pack()

        self.n_rows = 3
        self.n_cols = 4

        self.bt_list = []

        for x in range(self.n_rows):
            for y in range(self.n_cols):
                self.bt_list.append(tk.Button(self.frame, text="Button {}.{}".format(x, y)))
                self.bt_list[-1].grid(row=x, column=y)

    def change_colors(self):
        colors = get_random_colors()
        for index, button in enumerate(self.bt_list):
            button.configure(bg=colors[index])
        self.after(5000, self.change_colors)

root = MyGUI()
root.after(5000, root.change_colors)
root.mainloop()

首先,主框架现在是类的一个属性,所以只要我在类中需要调用self.frame,只要self被传递给函数就足够了。

然后,我决定将按钮存储在列表中,这样我就可以通过self访问类中的按钮。这很有用,因为在change_colors函数中,我可以循环遍历列表并通过.configure(bg=<color here>)更改按钮。

最后一点是.after。在定义root之后,我在类构造函数外调用它一次,然后在change_colors函数中使用self调用它。最后的代码应该每5秒随机改变按钮的颜色。

希望能帮上忙!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57198532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档