如何将元组解压为参数并传递给函数,在python tkinter中单击一个按钮即可更改画布颜色

如何将元组解压为参数并传递给函数,在python tkinter中单击一个按钮即可更改画布颜色,python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,我是tkinter的新手。 我很难找到一种方法将元组解压成参数并传递给函数,最终函数将使用它来更改画布小部件的颜色。 该代码实际上是一个交通灯模拟器,其中元组包含数据,这些数据决定单击“下一步”按钮时应该点亮哪个灯。 最初,所有3个灯光均为灰色。单击“下一步”,应显示红色、灰色、灰色,并从元组中获取参数,其中内部元组的元素分别分配给红色、黄色和绿色。所以对于真、假、假,结果应该是红色、灰色、灰色。在随后的单击中,代码应该从tuple中获取输入并显示灯光。对元组所做的任何更改都应该由代码适应 下面

我是tkinter的新手。 我很难找到一种方法将元组解压成参数并传递给函数,最终函数将使用它来更改画布小部件的颜色。 该代码实际上是一个交通灯模拟器,其中元组包含数据,这些数据决定单击“下一步”按钮时应该点亮哪个灯。 最初,所有3个灯光均为灰色。单击“下一步”,应显示红色、灰色、灰色,并从元组中获取参数,其中内部元组的元素分别分配给红色、黄色和绿色。所以对于真、假、假,结果应该是红色、灰色、灰色。在随后的单击中,代码应该从tuple中获取输入并显示灯光。对元组所做的任何更改都应该由代码适应

下面是代码。阶段是这里的元组

import tkinter as tk

phases = ((True,  False, False),
          (True,  True,  False),
          (False, False, True),
          (False, True,  False))

def Signal():
        '''<NEED HELP HERE>'''        
        Canvas.itemconfigure(C1,fill = "red")
        Canvas.itemconfigure(C2,fill = "red")
        Canvas.itemconfigure(C3,fill = "red")

TL = tk.Tk()
TL.minsize(80,550)
Canvas = tk.Canvas(TL,width=200, height=500, bg="#696969")
Canvas.grid()
C1 = Canvas.create_oval(38,160,160,30,outline="black",width=5,fill="#A9A9A9")
C2 = Canvas.create_oval(38,320,160,190,outline="black",width=5,fill="#A9A9A9")
C3 = Canvas.create_oval(38,480,160,350,outline="black",width=5,fill="#A9A9A9")
Next = tk.Button(TL, text = "Next", width = 8, command = Signal)
Next.grid()
##Next.bind("<Button-1>",Signal)
Quit = tk.Button(TL, text = "Quit", width = 8, command = TL.destroy)
Quit.grid()

TL.mainloop()
将tkinter作为tk导入
相位=((真、假、假),
(真、真、假),
(假,假,真),
(假,真,假)
def信号():
''''''        
Canvas.itemconfigure(C1,fill=“红色”)
Canvas.itemconfigure(C2,fill=“红色”)
Canvas.itemconfigure(C3,fill=“红色”)
TL=tk.tk()
TL.minsize(80550)
Canvas=tk.Canvas(TL,宽度=200,高度=500,背景=“#6969”)
Canvas.grid()
C1=画布。创建椭圆(38160160,30,outline=“black”,width=5,fill=“#a9a9”)
C2=画布。创建椭圆(38320160190,outline=“black”,width=5,fill=“#a9a9”)
C3=画布。创建椭圆(38480160350,outline=“black”,width=5,fill=“#a9a9”)
下一步=tk.按钮(TL,text=“下一步”,宽度=8,命令=信号)
Next.grid()
##Next.bind(“,信号)
Quit=tk.Button(TL,text=“Quit”,width=8,command=TL.destroy)
Quit.grid()
TL.mainloop()

你的问题读起来像是在问作业的解决方案,所以在阅读下面的内容之前,先仔细考虑一下,这实际上不是实现这一点的最佳方式。理想情况下,您希望为GUI创建一个类,并在其中包含小部件和回调函数。尽管如此,这里有一个非最佳解决方案:

import tkinter as tk

phases = ((True, False, False),
          (True, True, False),
          (False, False, True),
          (False, True, False))

def Signal():
    Signal.cur_state = (Signal.cur_state + 1 ) % 4

    print(Signal.cur_state)

    Canvas.itemconfigure(C1, fill="red" if phases[Signal.cur_state][0] else '#A9A9A9')
    Canvas.itemconfigure(C2, fill="yellow" if phases[Signal.cur_state][1] else '#A9A9A9')
    Canvas.itemconfigure(C3, fill="green" if phases[Signal.cur_state][2] else '#A9A9A9')

Signal.cur_state = 0

TL = tk.Tk()
TL.minsize(80, 550)
Canvas = tk.Canvas(TL, width=200, height=500, bg="#696969")
Canvas.grid()
C1 = Canvas.create_oval(38, 160, 160, 30, outline="black", width=5, fill="#A9A9A9")
C2 = Canvas.create_oval(38, 320, 160, 190, outline="black", width=5, fill="#A9A9A9")
C3 = Canvas.create_oval(38, 480, 160, 350, outline="black", width=5, fill="#A9A9A9")
Next = tk.Button(TL, text="Next", width=8, command=Signal)
Next.grid()
##Next.bind("<Button-1>",Signal)
Quit = tk.Button(TL, text="Quit", width=8, command=TL.destroy)
Quit.grid()

TL.mainloop()
将tkinter作为tk导入
相位=((真、假、假),
(真、真、假),
(假,假,真),
(假,真,假)
def信号():
Signal.cur_state=(Signal.cur_state+1)%4
打印(信号电流状态)
Canvas.itemconfigure(C1,fill=“red”if phases[Signal.cur_state][0]else'#a9a9')
Canvas.itemconfigure(C2,fill=“yellow”if phases[Signal.cur_state][1]else'#a9a9')
Canvas.itemconfigure(C3,fill=“green”if phases[Signal.cur_state][2]else'#a9a9')
Signal.cur_state=0
TL=tk.tk()
TL.minsize(80550)
Canvas=tk.Canvas(TL,宽度=200,高度=500,背景=“#6969”)
Canvas.grid()
C1=画布。创建椭圆(38、160、160、30,outline=“黑色”,width=5,fill=“#a9a9”)
C2=画布。创建椭圆(38320160190,outline=“black”,width=5,fill=“#a9a9”)
C3=画布。创建椭圆(38480160350,outline=“black”,width=5,fill=“#a9a9”)
下一步=tk.按钮(TL,text=“下一步”,宽度=8,命令=信号)
Next.grid()
##Next.bind(“,信号)
Quit=tk.Button(TL,text=“Quit”,width=8,command=TL.destroy)
Quit.grid()
TL.mainloop()

我使用一个全局变量
count
,当您按下
Next
时,该变量将递增。我还创建了一个列表
colors
,例如,当
阶段=(真、假、假)
时,它是
[“红”、“黑”、“黑”]
。 您可以尝试以下方法:

import tkinter as tk

phases = ((True,  False, False),
          (True,  True,  False),
          (False, False, True),
          (False, True,  False))

def give_color(phase, light_number):
    colors_availables = ("red", "yellow", "green")
    return colors_availables[light_number-1] if phase[light_number-1] else "#A9A9A9"

global count
count = 0

def Signal():
    global count
    p = phases[count]
    Canvas.itemconfigure(C1,fill = give_color(p, 1))
    Canvas.itemconfigure(C2,fill = give_color(p, 2))
    Canvas.itemconfigure(C3,fill = give_color(p, 3))
    count += 1
    count = count%4

TL = tk.Tk()
TL.minsize(80,550)
Canvas = tk.Canvas(TL,width=200, height=500, bg="#696969")
Canvas.grid()
C1 = Canvas.create_oval(38,160,160,30,outline="black",width=5,fill="#A9A9A9")
C2 = Canvas.create_oval(38,320,160,190,outline="black",width=5,fill="#A9A9A9")
C3 = Canvas.create_oval(38,480,160,350,outline="black",width=5,fill="#A9A9A9")
Next = tk.Button(TL, text = "Next", width = 8, command = Signal)
Next.grid()
##Next.bind("<Button-1>",Signal)
Quit = tk.Button(TL, text = "Quit", width = 8, command = TL.destroy)
Quit.grid()

TL.mainloop()
将tkinter作为tk导入
相位=((真、假、假),
(真、真、假),
(假,假,真),
(假,真,假)
def给出颜色(相位、灯光编号):
可用颜色=(“红色”、“黄色”、“绿色”)
如果相位[light_number-1]为“A9A9”,则返回颜色[light_number-1]可用
全局计数
计数=0
def信号():
全局计数
p=相位[计数]
Canvas.itemconfigure(C1,fill=give_color(p,1))
Canvas.itemconfigure(C2,fill=give_color(p,2))
Canvas.itemconfigure(C3,fill=give_color(p,3))
计数+=1
计数=计数%4
TL=tk.tk()
TL.minsize(80550)
Canvas=tk.Canvas(TL,宽度=200,高度=500,背景=“#6969”)
Canvas.grid()
C1=画布。创建椭圆(38160160,30,outline=“black”,width=5,fill=“#a9a9”)
C2=画布。创建椭圆(38320160190,outline=“black”,width=5,fill=“#a9a9”)
C3=画布。创建椭圆(38480160350,outline=“black”,width=5,fill=“#a9a9”)
下一步=tk.按钮(TL,text=“下一步”,宽度=8,命令=信号)
Next.grid()
##Next.bind(“,信号)
Quit=tk.Button(TL,text=“Quit”,width=8,command=TL.destroy)
Quit.grid()
TL.mainloop()

看不到任何尝试,请确保您发布的代码实际按照您声称的方式运行。您不需要在
give_color()
中创建
colors
列表。如果相位[light_number-1]为其他“#A9A9”,则返回颜色[light_number-1]可用。请注意,当相位为假时,OP需要灰色。谢谢,phoenixo和acw1668。那很有用谢谢你,k-war。这很有帮助。由于我是新手,我不知道在分配了一个值之后,我们可以在widget的config命令中使用if-else。