我正在使用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), 'nn'
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 列表的索引来做到这一点。我需要知道正在调整哪个光,以便我可以向相应的灯泡发送新的亮度。我希望我足够清楚。提前感谢!
我对您要对将回调函数分配给scale
小部件的行做什么有点困惑:
self.scale.append(Scale(self, from_=255, to_=0, command=lambda i=self.val: self.brightness_adj(i,light_id=i)))
由于self.val
是一个list
,并且您将其作为light_val
和light_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
小部件。