如何获取滑块值并将其用作定时窗口中的时间值? Python Tkinter

时间:2014-07-28 12:55:41

标签: python tkinter slider raspberry-pi

我还希望数字倒计时是一个垂直条,它的体积会减小,好像是一个瓶子倒空。这可能吗? 我还希望滑块上设置的值是3个LED的定时输出,并保持这些LED在这段时间内保持开启状态。这也有可能吗? 我是一个完整的Python菜鸟,刚刚购买了一个Raspberry Pi。 任何帮助都会很棒! 请指教,

from Tkinter import *

#-----------------------------------------------    

frame_1 = None
frame_2 = None
time = 0

#-----------------------------------------------    

def create_frame_1():
    global frame_1

    frame_1 = Frame(window)
    frame_1.configure(bg='purple')

    label = Label(frame_1, text='EuroFlow E-cig Filler')
    label.grid(row=0, column=1)

    btn_nxt = Button(frame_1, bg='purple',  text='Enter', command=show_frame_2)  
    btn_nxt.grid(row=1, column=1, padx=100, pady=100)

def create_frame_2():

    def show_values():
        print w1.get(), w2.get(), w3.get()

    global frame_2

    frame_2 = Frame(window)
    frame_2.configure(bg='purple')

    btn_ent = Button(frame_2, text='Enter', command=timed_window) 
    btn_ent.grid(row=3, column=3, padx=5, pady=5)
    label_chem = Label(frame_2, bg='purple', text='Please Choose Chemical Levels')
    label_chem.grid(row=0, column=2, padx=5, pady=5)
    label_nic = Label(frame_2, bg='purple', text='Nictonine (ml)')
    label_nic.grid(row=1, column=1, padx=5, pady=5)
    label_glyc = Label(frame_2, bg='purple', text='Glycol (ml)')
    label_glyc.grid(row=1, column=2, padx=5, pady=5)
    label_gli = Label(frame_2 , bg='purple', text='Glycerine (ml)')
    label_gli.grid(row=1, column=3, padx=5, pady=5)
    w1 = Scale(frame_2, troughcolor='green', bg='purple', from_=30, to=0, orient=VERTICAL, resolution=0.5)
    w1.grid(row=2, column=1, padx=5, pady=5)
    w2 = Scale(frame_2, troughcolor='green', bg='purple', from_=30, to=0, orient=VERTICAL, resolution=0.5)
    w2.grid(row=2, column=2, padx=5, pady=5)
    w3 = Scale(frame_2, troughcolor='green', bg='purple', from_=30, to=0, orient=VERTICAL, resolution=0.5)
    w3.grid(row=2, column=3, padx=5, pady=5)

    btn_back = Button(frame_2, text='Back', command=show_frame_1) 
    btn_back.grid(row=3, column=1, padx=5, pady=5)

#-----------------------------------------------    

def show_frame_1():
    frame_2.pack_forget()
    window.title('EuroFlow')
    frame_1.pack()

def show_frame_2():
    frame_1.pack_forget()
    window.title('Process Screen')
    frame_2.pack()



#-----------------------------------------------    

def timed_window():
    global time

    time = 500    #------ I want this value to be a sum of the 3 values set on the sliders

    def countdown():
        global time

        if time > 0:
            time -= 1
            lab.config(text=str(time))
            subwindow.after(100, countdown) # 100 miliseconds
        else:
            subwindow.destroy()

    subwindow = Toplevel(window)
    subwindow.title('countdown')
    subwindow.configure(bg='purple')

    lab = Label(subwindow, bg='purple', text=str(time))
    lab.pack(padx=20, pady=20)

    subwindow.after(100, countdown) # 100 miliseconds

#-----------------------------------------------    

window = Tk()

create_frame_1()
create_frame_2()

show_frame_1()

window.mainloop()

1 个答案:

答案 0 :(得分:-1)

您可以通过执行w1.get()从每个滑块获取值,但是只有在全局声明滑块(不良做法)或者重新编写应用程序以作为类工作时才能获得该值,并且滑块属于该类。

一个类旨在保存结构,因此您可以使用类定义结构并实例化它,以使此更清晰,大多数tkinter小部件(如框架和标签)都是类的示例。

from Tkinter import *

class App():
    def __init__(self):
        #create window
        self.window = Tk()

        #create frame 1
        self.frame_1 = Frame(self.window)
        self.frame_1.configure(bg='purple')

        label = Label(self.frame_1, text='EuroFlow E-cig Filler')
        label.grid(row=0, column=1)

        btn_nxt = Button(self.frame_1, bg='purple',  text='Enter', command=self.show_frame_2)  
        btn_nxt.grid(row=1, column=1, padx=100, pady=100)

        #create frame 2
        self.frame_2 = Frame(self.window)
        self.frame_2.configure(bg='purple')

        btn_ent = Button(self.frame_2, text='Enter', command=self.timed_window) 
        btn_ent.grid(row=3, column=3, padx=5, pady=5)
        label_chem = Label(self.frame_2, bg='purple', text='Please Choose Chemical Levels')
        label_chem.grid(row=0, column=2, padx=5, pady=5)
        label_nic = Label(self.frame_2, bg='purple', text='Nictonine (ml)')
        label_nic.grid(row=1, column=1, padx=5, pady=5)
        label_glyc = Label(self.frame_2, bg='purple', text='Glycol (ml)')
        label_glyc.grid(row=1, column=2, padx=5, pady=5)
        label_gli = Label(self.frame_2 , bg='purple', text='Glycerine (ml)')
        label_gli.grid(row=1, column=3, padx=5, pady=5)
        self.w1 = Scale(self.frame_2, troughcolor='green', bg='purple', from_=30, to=0, orient=VERTICAL, resolution=0.5)
        self.w1.grid(row=2, column=1, padx=5, pady=5)
        self.w2 = Scale(self.frame_2, troughcolor='green', bg='purple', from_=30, to=0, orient=VERTICAL, resolution=0.5)
        self.w2.grid(row=2, column=2, padx=5, pady=5)
        self.w3 = Scale(self.frame_2, troughcolor='green', bg='purple', from_=30, to=0, orient=VERTICAL, resolution=0.5)
        self.w3.grid(row=2, column=3, padx=5, pady=5)

        btn_back = Button(self.frame_2, text='Back', command=self.show_frame_1) 
        btn_back.grid(row=3, column=1, padx=5, pady=5)

        #start by showing the first frame
        self.show_frame_1()

    def show_frame_1(self):
        self.frame_2.pack_forget()
        self.window.title('EuroFlow')
        self.frame_1.pack()

    def show_frame_2(self):
        self.frame_1.pack_forget()
        self.window.title('Process Screen')
        self.frame_2.pack()

    def timed_window(self):
        t1 = self.w1.get() # get each of the slider values
        t2 = self.w2.get()
        t3 = self.w3.get()
        self.time = t1 + t2 + t3 # add the values together

        self.subwindow = Toplevel(self.window)
        self.subwindow.title('countdown')
        self.subwindow.configure(bg='purple')

        self.lab = Label(self.subwindow, bg='purple', text=str(self.time))
        self.lab.pack(padx=20, pady=20)

        self.subwindow.after(100, self.countdown) # 100 miliseconds

    def countdown(self):
        if self.time > 0:
            self.time -= 1
            self.lab.config(text=str(self.time))
            self.subwindow.after(100, self.countdown) # 100 miliseconds
        else:
            self.subwindow.destroy()

if __name__ == "__main__":
    app = App()
    app.window.mainloop()

我已经修改了大部分代码以使用基于类的结构,但是这个程序中至少会有一个缺陷,如果值加起来是小数而不是整数,我不知道如何你的倒计时会处理它。