0

Tkinter を使用して、私が書いているプログラムの GUI を作成しています。これは、私が持っている Zigbee 制御の LED ライトを調整します。ループを使用して、輝度スライダーとして使用するスケールの複数のコピーを作成しています。スライダーを適切に作成することはできますが、実際にスライダーを正しく調整するのは困難です。これが私のコードです:

import simplejson as json  
import requests         # submits http requests
from Tkinter import *
from ttk import Frame, Button, Label, Style, Notebook

# MD5 hash from  http://www.miraclesalad.com/webtools/md5.php
myhash = "d9ffaca46d5990ec39501bcdf22ee7a1"
appname = "dddd"    # name content isnt relevant
num_lights = int(3)

class hueApp(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.initUI()      

    def initUI(self, *args, **kwds):

        # title the app window
        self.parent.title("Hue controller")
        self.style = Style() 

        # create grid layout
        self.columnconfigure(0, pad=3)
        self.columnconfigure(1, pad=3)
        self.columnconfigure(2, pad=3)

        self.rowconfigure(0, pad=3)

        self.scale=[]
        self.val=[]
        for i in range(num_lights):
            print 'i=', i, type(i)
            self.val.append(i+1)
            print 'val=', self.val, type(self.val)
            self.scale.append(Scale(self, from_=255, to_=0, command=lambda i=self.val: self.brightness_adj(i,light_id=i)))
            print self.scale[i]
            print 'i = ', i, type(i), '\n\n'
            self.scale[i].set(150)
            self.scale[i].grid(row=1, column=i)

            if i == 2:
                print '\n', self.scale, '\n'
                print self.val, '\n'
                self.scale[i].set(200)



        self.centerWindow
        self.pack()

    def brightness_adj(self,light_val, light_id):
        #global bri_val
        print 'light_id:', light_id, type(light_id)
        print 'light_val:', light_val, type(light_val)

        print self.val[int(light_id)]
        #print int(light_id)
        bri_val = self.scale[light_id-1].get()
        print bri_val

        light = light_id
        global huehub
        huehub = "http://192.168.0.100/api/"+ myhash + "/lights/" + str(light)
        #brightness_logic()
        reply = requests.get(huehub)
        a=json.loads(reply.text)
        #print bri_val
        payload = json.dumps({"bri":bri_val})
        sethuehub = huehub + "/state"
        reply = requests.put(sethuehub, data=payload)

    def centerWindow(self):

        w = 250
        h = 150

        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()

        x = (sw-w)/2
        y = (sh-h)/2
        self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y))

def main():
    root=Tk() #the root window is created
    app=hueApp(root) #create an instance of the application class

    root.mainloop()  

if __name__ == '__main__':
        main()

このコードを実行しようとすると、おそらくエラーが発生することがわかりました。基本的に私の問題は、各スケールのコマンドがbrightness_adjにスケールの値を送信するだけであることですが、ライトのIDを通過させることができません。作成時に追加される self.scale リストのインデックスを送信することで、これを実行しようとしていました。対応する電球に新しい明るさを送信できるように、どの照明が調整されているかを知る必要があります。私が十分に明確だったことを願っています。前もって感謝します!

4

1 に答える 1

0

scaleコールバック関数をウィジェットに割り当てる行で何をしようとしているのか、少し混乱しています。

self.scale.append(Scale(self, from_=255, to_=0, command=lambda i=self.val: self.brightness_adj(i,light_id=i)))

sinceself.valは であり、 と の両方の引数listとして送信していますが、これは整数である必要があると思います。light_vallight_id

考えられる修正:

brightness_adj割り当てられているスケールに応じて、各コールバックが関数に異なる ID を送信するようにしたいと思います。これを修正する方法は次のとおりです。

hueAppこの関数をクラスの名前空間に追加します。

def brightnessCallbackFactory(self, id):
    return lambda light_val:self.brightness_adj(light_val, id)

次に、コールバック割り当て行を上記から次のように変更します。

self.scale.append(Scale(self, from_=255, to_=0, command=self.brightnessCallbackFactory(i)))

これにより、ID 値を内部名前空間に保持し、対応するscaleウィジェットに割り当てるコールバック関数が作成されます。

于 2013-10-02T22:47:15.727 に答える