在python GUI中更改按钮颜色

2024-10-01 09:29:45 发布

您现在位置:Python中文网/ 问答频道 /正文

import sys
from tkinter import *

def run_GUI():
    # create the window
    root = Tk()
    frame = Frame(root)
    frame.pack()

    #modify root window
    root.title("Simple GUI")
    root.geometry("700x300") # w x h        
    def SP2T():     # Edit occurs here where I forgot to pit that the button was created in a called funtction
        #Creates Row
        frameSP2T = Frame(root)
        frameSP2T.pack(side = TOP)

        #Creating Buttons First Row
        button1 = Button(frameSP2T, padx=13, pady = 6, bd=4, text="SW02",fg = "black", command = SW02)
        button1.pack(side = LEFT)

    def SW02():
        print("SW02 is on")
        button1["fg"] = "green"

    #Sets up initial boot screen
    #Creates Row
    topframe = Frame(root)
    topframe.pack(side = TOP)

    #Creating Buttons First Row
    buttonA = Button(topframe, padx=13, pady = 6, bd=4, text="SP2T",fg = "black", command = SP2T)
    buttonA.pack(side = LEFT)

    buttonB = Button(topframe, padx=12, pady = 6, bd=4, text="SP4T",fg = "black")
    buttonB.pack(side = LEFT)

    buttonC = Button(topframe, padx=12, pady = 6, bd=4, text="SP12T",fg = "black")
    buttonC.pack(side = LEFT)

    buttonD = Button(topframe, padx=12, pady = 6, bd=4, text="QUIT", fg="red",command=frame.quit)
    buttonD.pack(side = LEFT)

    #Kick off event loop
    root.mainloop()
    return

run_GUI()

我得到了一个错误:

^{pr2}$

更新的版本,希望能显示整个画面

这个程序还有更多内容,所以它说第60行,但这是问题所在。我在试着改变按钮按下时的颜色。在


Tags: textdefbuttonrootleftsidebdpack
2条回答

你在处理scope问题。异常发生在函数SW02()中,因为您试图修改不在函数作用域内的对象。你得把它递过去。将SW02()更改为以下内容:

def SW02(button1):
    print("SW02 is on")
    button1["fg"] = "green"

由于将函数用作命令的操作,因此有几个选项可以实际传递它。在

使用lambda:

^{pr2}$

使用functools.partial公司名称:

from functools import partial
# other stuff
_SW02 = partial(SW02, button1)
button = Button(frameSP2T, padx=13, pady = 6, bd=4, text="SW02",fg="black", command=_SW02)

或者,正如jornsharpe的回答所建议的那样,您可以将整个GUI函数重构为一个类,并将所有小部件都作为类成员,然后将小部件操作与类方法(而不是普通函数)相关联。你可以通过修改所有组件的方式来访问它们。在

最简单的修复方法是将global button添加到需要访问该对象的两个函数的开头:

def SP2T():
    global button1
    ...

def SW02():
    global button1
    ...

但是,使用global通常是一个错误的标志,相反,您可以采用基于类的方法,如下面这个简单的示例所示:

^{pr2}$

相关问题 更多 >