求各位解答,我用pysimplegui编写了一个UI,在UI中我调用了一个外部设备的接口,实时展示其成像结果,设备自带的软件成像结果正常显示,但是我的就一直闪烁,偶尔会正常一段时间
正常是这样
这是我的
这是成像部分的代码
# 尝试导入名为 config 的模块,如果导入成功,则将该模块中的 config 属性赋值给变量 defaults。如果导入失败,则将 defaults 赋值为 None
try:
defaults = __import__("config", globals(), locals(), ['config']).config
except:
defaults = None
# 尝试将变量`config`设置为与当前文件位于同一目录中的配置文件的路径。如果找不到该文件,则将`config`设置为`None`。
try:
config = os.path.join(os.path.dirname(__file__), defaults.configPath)
except:
config = None
# 尝试将变量`dev`设置为`defaults.developmentMode`的值。如果`defaults.developmentMode`不存在或出现错误,则将`dev`设置为`False`。
try:
dev = defaults.developmentMode
except:
dev = False
# 尝试使用给定的参数创建一个名为processor的对象,如果出现运行时错误,则将错误信息打印出来
try:
processor = tp.processor(rows=DEFAULT_CHUNK, threaded=True, defaults=defaults, config=config)
except RuntimeError as e:
print e
# 设置size元组
size = (int(round(DEFAULT_ROWS * pxSCALE)), int(round(processor.X_SIZE * pxSCALE * pxRATIO)))
# 设置imgSize元组
imgSize = (DEFAULT_ROWS, processor.X_SIZE)
# 创建一个大小为imgSize,数据类型为np.float32的零矩阵data
data = np.zeros(imgSize,dtype=np.float32)
# 创建一个大小为imgSize的tw.Worker对象worker
worker = tw.Worker(imgSize)
# 设置对比度为2,亮度为0.5
worker.SetContrast(2,0.5)
# 接受一个名为file_or_bytes的参数和一个名为resize的可选参数。
def convert_to_bytes(file_or_bytes):
img = Image.fromarray(file_or_bytes)
bio = io.BytesIO()
# 然后,将图像保存为GIF格式,并将其存储在名为bio的BytesIO对象中。
img.save(bio, format="GIF")
# 最后,删除图像对象并返回bio对象的字节表示形式。
del img
return bio.getvalue()# 尝试导入名为 config 的模块,如果导入成功,则将该模块中的 config 属性赋值给变量 defaults。如果导入失败,则将 defaults 赋值为 None
try:
defaults = __import__("config", globals(), locals(), ['config']).config
except:
defaults = None
# 尝试将变量`config`设置为与当前文件位于同一目录中的配置文件的路径。如果找不到该文件,则将`config`设置为`None`。
try:
config = os.path.join(os.path.dirname(__file__), defaults.configPath)
except:
config = None
# 尝试将变量`dev`设置为`defaults.developmentMode`的值。如果`defaults.developmentMode`不存在或出现错误,则将`dev`设置为`False`。
try:
dev = defaults.developmentMode
except:
dev = False
# 尝试使用给定的参数创建一个名为processor的对象,如果出现运行时错误,则将错误信息打印出来
try:
processor = tp.processor(rows=DEFAULT_CHUNK, threaded=True, defaults=defaults, config=config)
except RuntimeError as e:
print e
# 设置size元组
size = (int(round(DEFAULT_ROWS * pxSCALE)), int(round(processor.X_SIZE * pxSCALE * pxRATIO)))
# 设置imgSize元组
imgSize = (DEFAULT_ROWS, processor.X_SIZE)
# 创建一个大小为imgSize,数据类型为np.float32的零矩阵data
data = np.zeros(imgSize,dtype=np.float32)
# 创建一个大小为imgSize的tw.Worker对象worker
worker = tw.Worker(imgSize)
# 设置对比度为2,亮度为0.5
worker.SetContrast(2,0.5)
# 接受一个名为file_or_bytes的参数和一个名为resize的可选参数。
def convert_to_bytes(file_or_bytes):
img = Image.fromarray(file_or_bytes)
bio = io.BytesIO()
# 然后,将图像保存为GIF格式,并将其存储在名为bio的BytesIO对象中。
img.save(bio, format="GIF")
# 最后,删除图像对象并返回bio对象的字节表示形式。
del img
return bio.getvalue()
# 定义一个函数,该函数接受两个可选参数e和critical。如果e存在,则将其转换为字符串并打印出来。最后,返回None。
def on_error(e=None, critical=True):
print str(e)
return
# 创建一个大小为size + (3,),数据类型为np.uint8的零矩阵img
img = np.zeros(size + (3,), dtype=np.uint8)
# 创建一个大小为size + (3,),数据类型为np.uint8的空矩阵scaledImg
scaledImg = np.empty(size + (3,), dtype=np.uint8)
# 定义一个函数on_result,它有一个参数_data
def on_result(_data):
# 声明全局变量img和scaledImg
global img
global scaledImg
# 如果_data为空,则返回
if _data is None:
return
# 将_data复制一份
_data = _data.copy()
# 调用worker.makeImg(_data)生成图像,然后将其转置
img = worker.makeImg(_data).transpose([1, 0, 2]).copy()
# 将img缩放到指定大小,并使用最近邻插值法
scaledImg = cv2.resize(img, size, interpolation=cv2.INTER_NEAREST)
# 更新窗口中的图像
window['-IMAGE-'].update(data=convert_to_bytes(scaledImg))
#time.sleep(0.8)
# 调用processor.start函数,该函数接受两个参数on_result和on_error。当processor处理图像时,它将调用on_result函数,并将处理后的图像数据作为参数传递给它。如果processor在处理图像时遇到错误,则它将调用on_error函数,并将错误信息作为参数传递给它。
def show_img():
processor.start(on_result, on_error)
# 死循环,用于监听用户的滑块输入,将其发送到服务端
has_start_thread = False
window.finalize()
求解答
我使用的是python2.7
[ sg.Text("City", size = (20, 1)), sg.Combo(("北京", "上海", "深圳"), size=(10, 1), default_value="上海", key = "-CITY-")]
(1)第一项参数是一个 tuple,是下拉框里所有的选项,这里列出了 3 个城市。
(2)为了显示所有下拉框内容,我们将 size 指定为 (10, 1), 10 个英文字符宽,一个字符高。
(3)再没有选中的时候,Combo 默认显示 default_value 中的值。