Tkinter - постоянно обновлять переменную, не нажимая кнопку

Итак, вот мой скрипт на питоне:

from Tkinter import *
#import RPi.GPIO as GPIO

#GPIO.setmode(GPIO.BOARD)
#GPIO.setup(12, GPIO.OUT)

#p = GPIO.PWM(12, 50)
#p.start(0)

def cmd():
   speed = "Rotor speed= " + str(var.get())
   label.config(text = speed)
   #dc = int(var.get())
   #p.ChangeDutyCycle(dc)

tk = Tk()
var = DoubleVar()
scale = Scale(tk, from_=100, to=0, variable = var)
scale.pack(anchor=CENTER)
button = Button(tk, text="Set speed", command=cmd)
button.pack(anchor=CENTER)
label = Label(tk)
label.pack()

tk.mainloop()

print("Closing the program and cleaning up the GPIO")
#p.stop()
#GPIO.cleanup()

Некоторые части пока закомментированы, потому что я работаю над кодом на своем ПК, а не на Raspberry Pi. Я оставил их для контекста.

Итак, этот код создает очень простой графический интерфейс для моего вертолета. Он отлично работает, но чтобы изменить рабочий цикл моего вывода ШИМ (функция cmd()), мне нужно нажать кнопку.

Я попытался заставить свою программу автоматически проверять значение ползунка, но я просто не могу понять это.

Любые идеи, как я могу изменить этот код, чтобы изменить значение dc вместе с движением ползунка, без необходимости нажимать кнопку, чтобы обновить его?


person M B    schedule 28.03.2017    source источник
comment
Не могли бы вы уточнить, что вы имели в виду под изменением значения постоянного тока вместе с перемещением ползунка, пожалуйста?   -  person abccd    schedule 28.03.2017
comment
dc — рабочий цикл на выводе №12. В текущей программе, когда я нажимаю кнопку, она меняет dc на любое значение ползунка. Я пытаюсь автоматически опросить положение ползунка, не нажимая кнопку, чтобы значение dc всегда соответствовало значению ползунка.   -  person M B    schedule 28.03.2017
comment
По сути, прямо сейчас мне приходится нажимать кнопку каждый раз, когда я хочу выполнить: dc = int(var.get()) что работает, но не идеально. Я бы предпочел, чтобы значение всегда соответствовало ползунку.   -  person M B    schedule 28.03.2017


Ответы (1)


Вы можете сделать это следующим образом: Поскольку Scale также имеет аргумент command (который вызывается каждый раз при изменении шкалы), он также передает значение scale.get() при вызове. Таким образом, вы можете избавиться от своей кнопки.

from Tkinter import *
def cmd(speed):
    speed_text = "Rotor speed= " + str(speed)
    label.config(text = speed_text)
    # or you can change it like this(many people prefers this way more):
    # label['text'] = speed_text
    # dc = speed

tk = Tk()
var = DoubleVar()
scale = Scale(tk, from_=100, to=0, variable = var, command=cmd)
scale.pack(anchor=CENTER)
label = Label(tk)
label.pack()

tk.mainloop()
person abccd    schedule 28.03.2017
comment
Спасибо. Я добавил весь код GPIO, и он работал именно так, как я хотел. Спасибо - person M B; 28.03.2017