pyqt优秀的开源界面(pyqt5开发的漂亮界面)

有这样一个需求,把图中界面上每个控件显示的内容保存到字典中。

pyqt优秀的开源界面(pyqt5开发的漂亮界面)

每个控件类都有一个获取展示内容的方法,所以,最直观的实现方案就是逐个控件取。

例如,策略名称(StrategyKey)属于QLineEdit类,用text方法获取展示内容,self.StrategyKey.text();账户(InvestorID)属于QComboBox类,用currentText方法获取展示内容,
self.InvestorID.currentText()……

def save(self):    result = {}        # 策略名称    result['StrategyKey'] = self.StrategyKey.text()    # 账户    result['InvestorID'] = self.InvestorID.currentText()        # 买卖    direction = self.Direction.currentText()    if direction == '买':        result['Direction'] = '0'    elif direction == '卖':        result['Direction'] = '1'        # 优先平今    reusult['CloseTodayFirst'] = self.CloseTodayFirst.isChecked()        # 开平    offset_flag = self.OffsetFlag.currentText()    if offset_flag == "开":        result['OffsetFlag'] = '0'    elif offset_flag == "平":        result['OffsetFlag'] = '1'    elif offset_flag == "平今":        result['OffsetFlag'] = '3'    elif offset_flag == "平昨":        result['OffsetFlag'] = '4'        # 报价基准    benchmark_flag = self.BenchmarkFlag.currentText()    if benchmark_flag == "对手价":        result['BenchmarkFlag'] = '0'    elif benchmark_flag == "排队价":      result['BenchmarkFlag'] = '1'            # 交易所    result['ExchangeID'] = self.ExchangeID.currentText()    # 合约代码    result['InstrumentID'] = self.InstrumentID.currentText()    # 目标数量    result['TargetVolume'] = self.TargetVolume.value()    # 单次最大量    result['MaxOrderVolumeLimit'] = self.MaxOrderVolumeLimit.value()    # 开始时间    result['StartTime'] = self.StartTime.time().asString()    # 执行间隔    result['ExecuteGap'] = self.ExecuteGap.value()        return result

虽然这样实现是最简单的,但是当控件多且业务场景复杂时,会产生大量重复代码,也更容易出错。所以,不管从开发的角度还是维护的角度,这样写都不是最优的。

接下来,我们进行优化。

首先,买卖、开平、报单基准价这三个控件展示的是文本,而程序需要的是枚举值,它们之间存在一一对应关系。我们将展示值和枚举值对应关系存放在字典中,使用字典的查找功能就可以替代if……else……。

# 买卖展示值 - 枚举值字典direction_text_flag_dict = {    '买':'0',    '卖':'1'}# 开平展示值 - 枚举值字典offsetflag_text_flag_dict = {    '开':'0',    '平':'1',    '平今':'3',    '平昨':'4'}# 报价基准展示值 - 枚举值字典benchmarkflag_text_flag_dict = {    '对手价':'0',    '排队价':'1'}# 买卖枚举值result['Direction'] = benchmarkflag_text_flag_dict.get(self.Direction.currentText(), '')# 开平枚举值result['OffsetFlag'] = benchmarkflag_text_flag_dict.get(self.OffsetFlag.currentText(), '')# 报价基准枚举值result['BenchmarkFlag'] = benchmarkflag_text_flag_dict.get(self.BenchmarkFlag.currentText(), '')

当对应关系发生变化时,也只需要修改字典中的对应关系。

当需要反向转换时,根据枚举值设置展示值,也可以轻松实现。

# 买卖枚举值 - 展示值字典direction_flag_text_dict = dict(zip(direction_text_flag_dict.values(), direction_text_flag_dict.keys()))# 开平枚举值 - 展示值字典offsetflag_flag_text_dict = dict(zip(offsetflag_text_flag_dict.values(), offsetflag_text_flag_dict.keys()))# 报价基准枚举值 - 展示值字典benchmarkflag_flag_text_dict = dict(zip(benchmarkflag_text_flag_dict.values(), benchmarkflag_text_flag_dict.keys()))# 买卖展示值direction_display = direction_flag_text_dict.get(item_dict['Direction'], '')# 开平展示值offsetflag_display = offsetflag_flag_text_dict.get(item_dict['OffsetFlag'], '')# 报价基准展示值benchmarkflag_display = benchmarkflag_flag_text_dict.get(item_dict['BenchmarkFlag'], '')

进一步,利用python语言的反射机制,我们就可以根据名称查找到关联控件实例,例如,getattr(self, ‘StrategyKey’)就是self.StrategyKey。这样我们就可以通过遍历控件名列表获得相关展示值,并存到字典中。

def from_display(widget, text_list, currenttext_list, value_list, time_list):    result = {}        # QLineEdit类控件展示值    for item in text_list:        result[item] = getattr(widget, item).text() if getattr(widget, item) else ''        # QComboBox类控件展示值    for item in currenttext_list:        result[item] = getattr(widget, item).currentText() if getattr(widget, item) else ''             # QComboBox类控件展示值    for item in value_list:        result[item] = getattr(widget, item).value() if getattr(widget, item) else 0            # QTimeEdit类控件展示值    for item in time_list:      result[item] = getattr(widget, item).time().asString() if getattr(widget, item) else ''            return resultdef save(self):    text_list = [        'StrategyKey',    ]    current_list = [        'InvestorID',        'ExchangeID',        'InstrumentID'    ]    value_list = [        'TargetVolume',        'MaxOrderVolumeLimit',        'ExecuteGap',    ]    time_list = [        'StartTime',    ]        reust = from_display(self, text_list, current_list, value_list, time_list)    result['Direction'] = direction_text_flag_dict.get(self.Direction.currentText(),'')    result['OffsetFlag'] = offsetflag_text_flag_dict.get(self.OffsetFlag.currentText(),'')    result['BenchmarkFlag'] = benchmarkflag_text_flag_dict.get(self.BenchmarkFlag.currentText(),'')

因为不同类控件获取展示值的方法不同,QLineEdit使用text方法,QComboBox使用currentText方法,QSpinBox使用value方法,所以理论上有几个控件,上述代码中的from_display函数就需要几个参数,还是不够简洁。

是否可以给不同的控件类增加一个相同的获取展示值的方法呢?当然可以。

QtWidgets.QLineEdit.getDisplay = lambda self: self.text()QtWidgets.QTimeEdit.getDisplay = lambda self: self.time().toString()QtWidgets.QCheckBox.getDisplay = lambda self: self.isChecked()QtWidgets.QSpinBox.getDisplay = lambda self: self.value()QtWidgets.QComboBox.getDisplay = lambda self: self.currentText()

通过以上定义,我们就给用到的几个控件类打了个补丁,增加一个getDisplay方法,用来获取展示值。

之前写的from_display函数就不需要区分具体的控件类了。

def from_display(widget, item_list):    result = {}        for item in item_list:        reuslt[item] = getattr(self, item).getDisplay()            return resultdef save(self):    item_list = [        'StrategyKey',        'InvestorID',        'ExchangeID',        'InstrumentID',        'TargetVolume',        'MaxOrderVolumeLimit',        'ExecuteGap',        'StartTime',        'CloseTodayFirst',    ]        reuslt = from_display(self, item_list)    result['Direction'] = benchmarkflag_text_flag_dict.get(self.Direction.currentText(), '')    result['OffsetFlag'] = benchmarkflag_text_flag_dict.get(self.OffsetFlag.currentText(), '')    result['BenchmarkFlag'] = benchmarkflag_text_flag_dict.get(self.BenchmarkFlag.currentText(), '')

优化之后,随着控件数量的增加,代码量不会显著增加。

通过上述过程总结下来的经验,将字典中的数值展示到控件上的需求就可以这样来实现了:

QtWidgets.QLineEdit.setDisplay = lambda self, value: self.setText(str(value))QtWidgets.QTimeEdit.setDisplay = lambda self, value: self.setTime(QtCore.QTime.fromString(value))QtWidgets.QCheckBox.setDisplay = lambda self, value: self.setChecked(value)QtWidgets.QSpinBox.setDisplay = lambda self, value: self.setValue(value)QtWidgets.QComboBox.setDisplay = lambda self, value: self.setCurrentText(str(value))def display(self, item_dict):    item_dict['Direction'] = direction_flag_text_dict.get(item_dict['Direction'], '')    item_dict['OffsetFlag'] = offsetflag_flag_text_dict.get(item_dict['OffsetFlag'], '')    item_dict['BenchmarkFlag'] = benchmarkflag_flag_text_dict.get(item_dict['BenchmarkFlag'], '')        for key, value in item_dict.items():        widget = getattr(self, key, None)        if widget and getattr(widget, 'setDisplay', None):            widget.setDisplay(value)
本文链接:https://www.dzdvip.com/37098.html 版权声明:本文内容均来源于互联网。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 395045033@qq.com,一经查实,本站将立刻删除。
(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年8月7日 10:30
下一篇 2022年8月7日 11:15

相关推荐

  • 上海国五车还能上牌吗(上海国五车可以开到什么时候)

    “上海国五车已经不能上牌。上海在2019年7月1日后就停止国五车上牌,停止的上牌时间也就是国六排放标准的实施时间。如果想要购买国五的车,建议到当地车辆管理部门核实后再决定是否购买。” 上海国五车可以开到什么时候 2017年的时候才开始实施国5标准的排放,但是早在2015年的时候买车就能买到国5标准的车了。然而现在已经是国6标准了,在2015年时间买的国5标准的车很多人都保养得挺好看起来还比较新并没有换车的计划,担心国5标准的车会被淘汰。现在的二手车也大多是国5标准的,一些想买2手车的朋友也担心国5标准的车要被淘汰了不敢下手。今天就来跟大家讲一下国5标准的车还能开多久的问题,希望能够帮助到大家。   手里的国5车还能开多久跟国6标准实施我觉得没有啥关系,只要你的车子排放标准符合当时买车的标准能过年检都没有问题。因为国6实施了只是说新车如果是国5的就不能卖而已,但是以前已经买了的国5标准的车照样是可以用的。很多人6年前买的国5的车今年才到第一次上线检测的时候,车子还比较新车况良好远远没有达到换车的时候。 所以国5的车我觉得再开10年一点问题都没有,但是再开10年以后车子应该也还能过年检,毕竟现在车辆没有强制报废的说法。就是年限太长车辆各个部件都已经会出现老化的现象了,毛病多了可能养车费用会更高不适合继续开了而已。 总的来说,国5的车只要还能过年检你自己不嫌弃车辆旧了再开10年是一点问题都没有的,甚至可以一直开下去直到它过不了年检报废。你看以前的那些国2的老车现在都还有在路上跑的,甚至以前的很古老的那些大众方方正正的桑塔纳都还能在路上看见,这些都证明不管现在实施的是什么样的排放标准,对于以前已经买了的车只要年检符合当时买车的标准都是可以正常开的。

    2022年12月17日
    45
  • 赣是哪个省的简称(赣是哪个省的车牌)

    江西,地处中国东南部,东邻浙江省、福建省,南连广东省,西接湖南省,北毗湖北省、安徽省而共接长江;是长江经济带重要组成部分。自古以来物产富饶、人文荟萃,素有“物华天宝、人杰地灵”之誉。春秋战国时期,吴、越、楚三国分争江西,古有“吴头楚尾,粤户闽庭”之称,是江南的鱼米之乡。 江西简称“赣“。是从自古的“江南西道”简称而来,而江南西道就是目前的赣江水运,北起九江的湖口,南至宋城(现在的赣州市)这条水路当时起到重要的承接南北的交通运力。而赣江是由发源地赣州的两条河——章江和贡江交汇而形成,从字面看,形成赣字。 “江西”省名源自强盛繁华的唐朝,公元733年唐玄宗划全国为15道,江南道一分为二,为江南东道和江南西道,江南西道以洪州为首府,洪州即今天的南昌,江南西道简称江西道,“江西”由此得名,由于省内最大最长的河流赣江自南而北纵贯全省,因此江西又简称“赣”。 江西人文荟萃。江南四大名楼滕王阁因王勃的《滕王阁序》名噪九州。“落霞与孤鹜齐飞 ,秋水共长天一色”成了千古名句。苏轼的《题西林壁》“横看成岭侧成峰,远近高低各不同.不识庐山真面目,只缘身在此山中“使庐山闻名天下。江西在中国历史文明的长河中人才辈出,陶渊明、王安石、欧阳修、晏殊、晏几道、曾巩、黄庭坚、杨万里、朱熹、陆九渊、文天祥、汤显祖等等均出自江西。 江西是中国新民主主义革命的摇篮。中共发动了具有重大历史意义的八一南昌起义,起义在党的领导下举得重大胜利。 在由毛泽东领导的秋收起义后,其后建立了中国第一块农村革命根据地——井冈山革命根据地,为革命保存了火种。其间,在毛泽东思想指导下取得三次反围剿的胜利。中国革命的星星之火在江西正形成燎原之势。1931年,中国工红军在江西瑞金开始艰难的长征路。 在后来的抗日战争和解放战争中,江西人民都积极支持革命事业,打击日本侵越者和国民党反动派,为祖国的革命事业贡献自己的力量。 在改革开放和现代建设的历征程中,赣鄱大地生机盎然。 赣是哪个省的车牌 江西车牌字母代表江西的城市 赣A :南昌市, 赣B :赣州市, 赣C :宜春市, 赣D :吉安市, 赣E :上饶市, 赣F : 抚州市, 赣G :九江市, 赣H :景德镇市, 赣J :萍乡市, 赣K :新余市, 赣L :鹰潭市。 你来自哪座城市呢?

    2022年1月3日
    81
  • 苹果手机有哪些机型是双卡双待的?

    苹果手机双卡双待机型有:iPhone XS Max、iPhone XR、iPhone 11、iPhone 11 Pro、iPhone 11 Pro Max、iPhone 12、iPhone 12 Pro、iPhone 12 Pro Max、iPhone 13、iPhone 13 Pro、iPhone 13 Pro Max。 iPhone XR: 苹果首款双卡双待手机,不支持5G网络,支持电信、联通、移动所有频段的2G、3G、4G网络。 SIM卡类型:Nano SIM卡 iPhone XS Max: 只要国行版才具有双卡双待功能,其他地区为一个实体卡,一个esim卡。 不支持5G网络,支持电信、联通、移动所有频段的2G、3G、4G网络。 SIM卡类型:Nano SIM卡 iPhone 11系列:iPhone 11、iPhone 11 Pro、iPhone 11 Pro Max iPhone11系列的网络配置是一样的,不支持5G网络,支持电信、联通、移动所有频段的2G、3G、4G网络。 SIM卡类型:Nano SIM卡 iPhone 12系列:iPhone 12、iPhone 12 Pro、iPhone 12 Pro Max iPhone12系列(除iPhone12mini为单卡)的网络配置是一样的,支持5G网络,并且同时支持NSA(非独立组网,伪5G)与SA(独立组网,真5G)、5G载波聚合、5G/4G动态频谱共享等功能。同时支持电信、联通、移动所有频段的2G、3G、4G网络。 SIM卡类型:Nano SIM卡 Apple iPhone 12 Pro Max (A2412) 256GB 海蓝色【ZJP】查看 iPhone 13系列:iPhone 13、iPhone 13 Pro、iPhone 13 Pro Max iPhone13系列的网络配置是一样(除iPhone13mini为单卡),都为双卡双待。全网通,支持2G、3G、4G、5G网络, SIM卡类型:Nano SIM卡 当前的操作环境为iOS环境,采用手机为iPhone 13,对应操作系统为:iOS 15.3.1。

    2022年6月12日
    88
  • 拴q是什么意思网络用语(拴q出自哪里什么梗)

    最近我们看综艺节目里面的一些明星还有和朋友聊天的时候,总是会碰到栓Q这个词语,一开始很多人都不知道啥意思,我也是一头雾水,看朋友发的这个我还在想要表达什么意思呢? 关于这个栓Q其实就是thank you的意思,因为博主在介绍自己家乡的时候会用英语,最后会说一句thank you,但是因为发音不标准的问题,因此大家听到的都是栓Q,因此我们看到最近的热搜上面也说了,使用这个词语的创始人算是找到了。 后来不断地进行演变,表达这个词语的时候也会有很多种含义的,如果只是一个最简单的词语的话,大家就可以直接理解成谢谢的意思。 但是说我真的会谢,我真的会栓Q等一些句子的时候,他表达的含义就比较多了,我们也可以看到百科上对于这个的含义有详细的介绍,大家看一下图片,会了解的更加清晰的。 看完这个梗以及这个梗的意思,相信大家一下就理解了这个词语的用法以及要表达的含义了。 现在的网络用语确实非常多,一旦自己不留意,就很多内容看不懂了,不知道大家最不理解的一个网络用语或者词语是什么呢?欢迎我们一起留言交流哦! 【我真的栓q】 栓Q与我真的会谢该梗融合为“我真的栓Q”,表示无语,下头的情绪,当然也还可以单纯表示感谢。 假如今天上班迟到了,我真的栓Q了就是比较无语的觉得今天竟然迟到了,不开心、不高兴,自己的情绪比较低落。 我真的会谢是什么意思 【我真的会谢】 该梗出自微博搞笑博主怨男0的口头禅。 该博主每次遇到一些让人很无语的情况时,他都会说出这句话,尤其是发微博时候喜欢带上“我真的会谢”。 可以根据语境不同来表达意思,大多数是一种对生活中遇到的那些让人郁闷的人或者事的调侃 拴q是什么意思 【拴q】 栓Q其实就是英文“thank you”的读音空耳衍生,英文的本意是感谢,出自抖音英语教学博主刘涛(Teacher Liu) 这位英语教学博主其实是一位农民,但是他很努力地自学了英语,还坚持不懈每天讲英语,只是发音还是有些不太标准,在有一次翻译完“桂林山水甲天下,阳朔堪称甲桂林”这句话之后,说了一句“welcome to guilin,welcome to yangshuo,thank you”,因为这句话里面的“thank you”的发音非常像“栓Q”,非常魔性,引得网友们争相模仿,之后这个梗就火了。

    2022年7月16日
    316
  • 回南天是什么意思(南方回南天是什么意思)

    “回南天也被简称为回南,是对我国南方地区一种天气现象的称呼,回南天通常指每年春天时,气温开始回暖而湿度开始回升的现象,回南天一般出现在春季的二三月份,浓雾是回南天最具特色的表象,回南天空气湿度大,为防潮湿,在早晚注意关窗,家中挂干燥剂等。” 山一程 水一程 南方人的崩溃你不懂 今天天星儿一打开微博 就看到热搜榜上赫然挂着的两条热搜 #回南天有多离谱#和#南方多地进入回南天# 一点进去南方网友吐槽之情溢出屏外 借此机会 天星儿就重点聊聊回南天那些事儿 (对这part无感的小伙伴可直接跳到预报部分) 究竟什么是回南天? 专家解读:回南天是我国南方地区的一种天气现象,通常指每年2-3月天气回暖,湿度增加,居民家中的墙壁、地面、玻璃甚至物品出现的严重返潮“出水”现象。 天星儿解释:简单来说,就是湿漉漉、湿哒哒的感觉,在家里仿佛置身水帘洞、澡堂。 你有故事我有图,有图有真相~ △墙壁、玻璃“出水”图。刘英轶(资料图) 感受不够直观?亲身演绎! △墙壁似乎有自己的想法…… 回南天究竟是怎么形成的? 专家解读:回南天出现的本质是物体表面的温度低于空气露点温度,导致水汽在物体表面凝结。 天星儿解释:2-3月份,来自海上的暖湿气流增强,而此时北方冷空气仍然活跃并频繁南下,华南一带冷暖快速转换,当经历很长时间的低温后,暖湿气流迅速反攻,就易形成回南天现象。这就像在北方,走进一个干燥寒冷的浴室,猛然把热水开到最大,不久浴室顶棚和四壁就会有水滴形成。 回南天几乎是华南地区“特产”,尤其是广东和广西春天常常出现明显的回南天现象。此外,像是江西等南方地区小伙伴也对回南天有深深的恐惧。 一般出现回南天现象需要两个天气条件:持续3天以上的日平均气温低于14℃,以及气温突然变暖并且湿度加大。 2012年春天,广东曾经历过近几年来最严重的“回南天”现象。以广州为例,2012年2-3月曾出现5次“回南天”过程,分别为2月6日、13-15日、21-24日,3月4-6日、15-18日。严重的“回南天”使得当年广州大棚蔬菜品质下降减产,价格上涨。 今后三天,华南出现回南天的概率不大。所以,有衣服、被子、内衣、内裤晾晒需求的小伙伴,可以在降雨间歇期适当开展晾晒计划~~~ 防潮是重点有什么超好用的道具么? 南方小伙伴对回南天有着来自灵魂深处的拒绝,天星儿盘点了一些除湿防潮“道具“供参考…… 除了借助这些“道具“,…

    2022年3月26日
    102
  • 阿里腾讯裁员数万人?“萝卜蹲”游戏上演

    字节裁完,阿里裁,阿里裁完,腾讯裁。 一场“萝卜蹲”游戏上演了。 3月13日,“阿里裁员”、“腾讯裁员”的话题相继上了微博热搜。 有传言称,腾讯阿里等互联网巨头会在未来几周进行大裁员。腾讯预计裁员 10%~30%,阿里裁员30%。 这是什么概念?阿里去年财报显示员工规模超过了 25 万,而腾讯财报则称员工规模超过了10万。 按照中位数的裁员20%估算下来,将意味着阿里“砍掉”5万人,相当于半个腾讯;而腾讯也要缩减掉约2万人,可以说是个夸张的数字。 消息一出,整个互联网都炸开了锅。有网友甚至评价,“真正的断臂求生,看谁的现金熬过今年。” 伯虎财经看了下,如今阿里、腾讯未作出声明回应,真假尚未可知。但是也不禁让人疑问,今年的裁员潮提前来临了? 在百度上,搜索“大厂裁员”会出现4060万个词条。在新浪微博上,搜索“裁员”,弹出的是各大互联网公司裁员的话题。 裁员,成为大厂不可避免的关键词。   大厂拉响“警报” 早在去年11月,就传出阿里裁员2万人的消息。随后,阿里官方出来辟谣。 从阿里巴巴披露的2021年第一季度财报来看,阿里巴巴营收2057.40亿元(市场预期2093.8亿元),同比增长33.81%,净利润450.68亿元,同比下滑5.19%。 对比第一季度,阿里巴巴第二季度营收2006.9亿元(市场预期2061.7亿元),同比增长29%。第二季度调整后净利润285.2亿元,同比下滑高达39%。 去年阿里的财报也反映出阿里的增长在减速,净利润更是直线下滑,内部自身的管理运营和战略布局自然有优化必要。 而上周,阿里旗下MMC事业群就率先计划裁员,裁员数量约20%,目前多个业务线已经初步敲定裁员名单。 紧接着是腾讯,今年2月腾讯PCG旗下社交电商产品小鹅拼拼业务几乎解散,腾讯的回应是业务调整,员工可选择内部调岗。 为什么大厂相继裁员?我们从中概互联的股票走势上可见一斑。 以中概互联网ETF为例(跟踪中概互联股票的交易型开放式指数基金),我们来看看中概互联股票的走势: 图片来源@知乎用户:十七而已 从数据来看,2021年2月至今,中概互联ETF全年呈下跌趋势,从2021年2月10日2.57元的高点跌至如今的1.02元(数据截至2022年3月11日),跌幅达60%。 粗略估算,自2021年高位以来,中概股公司总市值累计缩水已超6.3万亿元(数据源自Wind)。 今年…

    2022年3月15日
    43