如何将元组解压缩到参数中并传递给函数,该函数在单击按钮后会在 python tkinter 中更改 canvas 颜色
How to unpack a tuple into arguments and pass to function which upon clicking a button changes a canvas color in python tkinter
我是 tkinter 的新手。
我很难找到一种方法将元组解压缩为参数并传递给函数,该函数最终将使用它来更改 canvas 小部件的颜色。
该代码实际上是一个交通灯模拟器,其中元组包含数据,这些数据决定在单击“下一步”按钮时应点亮哪个灯。
最初所有 3 个灯都是灰色的。单击 Next 时,应显示 Red、grey、grey 从元组中获取参数,其中内部元组的元素分别分配给红色、黄色和绿色。所以对于 True, False, False,结果应该是 Red,grey,grey。在随后的点击中,代码应该从元组中获取输入并显示灯光。对元组所做的任何更改都应包含在代码中。
下面是代码。阶段是这里的元组。
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()
你的问题读起来像是在询问作业的解决方案,所以在你阅读下面之前先试一试,这实际上不是实现这个问题的最佳方式。理想情况下,您希望为您的 GUI 创建一个 class,并在其中包含您的小部件和回调函数。尽管如此,这里有一个 非最佳 解决方案:
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()
我使用了一个全局变量 count
,当您按下 Next
时它会递增。例如,当 phase = (True, False, False)
时,我还创建了一个列表 colors
,即 ["red", "black", "black"]
。
你可以试试这个:
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 的新手。 我很难找到一种方法将元组解压缩为参数并传递给函数,该函数最终将使用它来更改 canvas 小部件的颜色。 该代码实际上是一个交通灯模拟器,其中元组包含数据,这些数据决定在单击“下一步”按钮时应点亮哪个灯。 最初所有 3 个灯都是灰色的。单击 Next 时,应显示 Red、grey、grey 从元组中获取参数,其中内部元组的元素分别分配给红色、黄色和绿色。所以对于 True, False, False,结果应该是 Red,grey,grey。在随后的点击中,代码应该从元组中获取输入并显示灯光。对元组所做的任何更改都应包含在代码中。
下面是代码。阶段是这里的元组。
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()
你的问题读起来像是在询问作业的解决方案,所以在你阅读下面之前先试一试,这实际上不是实现这个问题的最佳方式。理想情况下,您希望为您的 GUI 创建一个 class,并在其中包含您的小部件和回调函数。尽管如此,这里有一个 非最佳 解决方案:
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()
我使用了一个全局变量 count
,当您按下 Next
时它会递增。例如,当 phase = (True, False, False)
时,我还创建了一个列表 colors
,即 ["red", "black", "black"]
。
你可以试试这个:
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()