Как распаковать кортеж в аргументы и перейти к функции, которая при нажатии кнопки меняет цвет холста в python tkinter - PullRequest
0 голосов
/ 13 февраля 2020

Я новичок ie для Ткинтера. У меня возникли трудности с поиском подхода, чтобы распаковать кортеж в аргументы и перейти к функции, которая в конечном итоге использовала бы его для изменения цвета виджета canvas. Код на самом деле является имитатором света traffi c, в котором кортеж содержит данные, которые определяют, какой свет должен быть зажжен при нажатии кнопки «Далее». Изначально все 3 индикатора серого цвета. при нажатии кнопки «Далее» должны отображаться красный, серый, серый с аргументами из кортежа, где элементы внутренних кортежей назначаются соответственно красному, желтому и зеленому. Поэтому для True, False, False результат должен быть красным, серым, серым. И при последующих щелчках код должен принимать входные данные от кортежа и отображать индикаторы. Любые изменения, сделанные в кортеже, должны быть учтены в коде.

ниже код. Фазы это кортеж здесь.

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()

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Я использую глобальную переменную count, которая увеличивается при нажатии Next. Я также создаю список colors, например ["red", "black", "black"], когда phase = (True, False, False). Вы можете попробовать это:

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()
0 голосов
/ 13 февраля 2020

Ваш вопрос звучит так, как будто вы спрашиваете решение о назначении, так что хорошенько подумайте, прежде чем читать ниже, что на самом деле не лучший способ реализовать это. В идеале вы хотите создать класс для вашего 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()
...