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

相关推荐

  • 股票选股公式(股票公式指标大全)

    选股 公式是众多投资者的经验总结,对股票投资不熟悉的用户可以通过选股 公式获取有用的投资信息,从而指导个人的投资行为,但是选股公式并 不是万能的,其彰显的只是一般情况,所以用户不能盲目套用 最近几周一直有事在做一个非常复杂的指标,都没有发消息了。 今天放一个很实用的小公式。选股逻辑是,个股走势企稳上攻并且回踩均线后,再次企稳的股票。 大部分人炒股都是喜欢买有立竿见影效果的股票,这样的资金利用率会很高,免去了很多洗盘,震荡,磨底的时间。但是一个个去找实在麻烦。今天抽空做了个简单的公式,希望能够对各位有帮助。 公式源代码如下:复制红色字体: CROSS(EXPMA(C,12),EXPMA(C,50)) AND O>C AND CROSS(EXPMA(C,50),L) AND C>EXPMA(C,50); 所有的指标不是万能的,公式筛选的成功率也跟大盘的强弱有关,弱势行情下的筛选准确率肯定也要打折扣,但是强势情况下,筛选就非常有必要了,总好过你一个个去自己翻股票,4000多只票,你翻几个小时那黄花菜都凉了。 以下是我这段时间筛选出来的案例。

    2022年5月10日
    11
  • 有哪些不起眼的高利润小本生意推荐?

    手上有点钱需要做小生意的话,有多种选择的,就看你想从事哪些方面的事情。那些小本生意来钱快?接下来我们就一起来了解一下那些不起眼的高利润小本生意吧。

    2021年5月1日
    75
  • 鸿蒙系统更新时间表

    随着鸿蒙系统上线,大批的华为手机开始更换了鸿蒙系统,很多朋友还不知道自己的机型什么时候可以更新鸿蒙系统,今天分享一下系统更新的时间。 首批是目前市场的主流机型,这部分机型也是华为公司的旗舰机型,但在美国的打压,芯片断供情况下几乎成为了绝唱。但是随着光刻机的引进,加上技术改造升级及国内家大力支持,相信在芯片领域一定会取得飞速进展。前段时间也有相关新闻报道,国内的科技公司已经攻克了7纳米关口,量产只是时间问题。 三季度开始就开始更新 华为公司对旗下品牌手机进行系统无差别更新已经明确了时间表,所以大家不必担心。我想大家对老旧机型的系统更新,更多的是想要体验鸿蒙系统使用的效果。 在这小编也想对国内的企业喊话,希望大家能够全力支持国产系统,这样才能真正实现自主,实现双赢,摆脱被卡脖子的局面。

    2021年6月5日
    13
  • 抖音自然流量怎么快速爆发?

    做抖音直播电商,看数据,用壁虎看看! 很多抖音玩家都想通过大量的曝光,积累用户流量池,那么瞬爆连爆的技术就一定要会。 听起来很牛,实际操作起来也不难,壁虎看看在这里给大家分享两种不同类型的方法,分别是定时版和叠加版,大家可以自己根据实际情况使用,学习完本文就一定能学会。 一、原理 首先讲一下这个玩法的原理,其实就是利用抖音网页版的一个定时发布,把这个发布作品的流量聚集起来,然后集中在一个时间点内进行爆发。通过发布多个视频,让作品形成一个滚雪球的效应,产生一个连爆的效果。 抖音的算法机制分发流量时,流程首先是审核,审核后没有违规后会给作品流量展示,然后开始慢慢涨。 具体的分发时间,大概是基础播放量从0到500,大概需要15~30分钟的样子,之后系统再根据你这个作品,去推下一个流量。 账号权重比较好,或者是作品比较优质、反馈比较好的话,会给你直接下一个流量池。 说完了原理,下面咱们来讲瞬爆连爆定时版的操作方法。 二、定时版操作方法 抖音可以定时发布是通过网页版实现的,并且需要提前两个小时去准备这个发布工作。这两个小时的时间内,只要你定时好了,作品发布出去,系统就会给你开始推流量。然后能达到多少的播放量,就取决于这个视频的播放量有多少。 其次的话,视频的播放量取决于发布视频的账号权重有多高,一般来说账号的权重越高,视频的播放量就会越好。 通过上述这样形式去发布的话,就是看第一个视频能不能爆,比如说多个视频中有一个有了上万的流量,那就是小爆,其他的视频也能通关这条爆的视频,得到一定的曝光量。 一发视频就能爆,当然这是理想状态下,如果连爆不了,第二天的时候要把低播放量的视频作品全部删除掉,然后这种情况下再发一天,基本上爆的几率很大。 如果爆不了的话,这时候需要考虑去换作品内容方向,但是换作品不要去换太大的领域类目,比如说卖零食的话,你还是去卖零食,不要去卖服饰,这样账号的权重又没有了因小失大。 然后就是想办法怎么让这个视频衔接上,达到一个连爆的效果,就是一定要让这个视频的时间在24小时之内去链接上前几次的视频。 比如说这个作品是今天发的,第一个作品是今天7点发,第二个作品是7点半发,那你在第二天的时候,在7点的时候也要发一个,然后在7点半的时候,也要再发一个,就是发布的时间节点要一致。 三、实操干货(注意时间节点) 下面上干货,讲实操。首先发视频素材最重要,要么纯原创,要么搬…

    2021年7月7日
    59
  • 望梅止渴的主人公是谁(望梅止渴的历史人物是谁)

    “望梅止渴的主人公是曹操,曹操带兵讨伐吴国时找不到水源,士兵十分口渴,曹操就告诉他们前面有梅林,士兵听了之后心中充满了斗志和希望,口中生津不止,并赶往前方,很快找到水源。” 今天的三国成语故事见于《三国演义》第二十一回,发生在曹操与刘备“青梅煮酒论英雄”之际,相关人物分别为曹操和刘备。原文如下: 玄德也防曹操谋害,就下处后园种菜,亲自浇灌,以为韬晦之计。关、张二人曰:“兄不留心天下大事,而学小人之事,何也?”玄德曰:“此非二弟所知也。”二人乃不复言。一日,关、张不在,玄德正在后园浇菜,许褚、张辽引数十人入园中曰:“丞相有命,请使君便行。”玄德惊问曰:“有甚紧事?”许褚曰:“不知。只教我来相请。”玄德只得随二人入府见操。操笑曰:“在家做得好大事!”?得玄德面如土色。操执玄德手,直至后园,曰:“玄德学圃不易!”玄德方才放心,答曰:“无事消遣耳。” 操曰:“适见枝头梅子青青,忽感去年征张绣时,道上缺水,将士皆渴;吾心生一计,以鞭虚指曰:‘前面有梅林。’军士闻之,口皆生唾,由是不渴。今见此梅,不可不赏。又值煮酒正熟,故邀使君小亭一会。”玄德心神方定。随至小亭,已设樽俎:盘置青梅,一樽煮酒。二人对坐,开怀畅饮。酒至半酣,忽阴云漠漠,聚雨将至。从人遥指天外龙挂,操与玄德凭栏观之。 按照小说的情节发展,歼灭吕布后,曹操将刘备带至许都。刘备心惊胆战,担心被曹操所害。一日,曹操派许褚前来邀请刘备去府中见面。见面之后,曹操与刘备说起一年前征讨张绣的一件往事。曹操告诉刘备,大军在行军途中时,将士们口渴,但附近却没有水源。曹操便欺骗将士们说不远处有一片梅林。将士们听到这句话后,立刻想到了梅子的酸味而流涎,不再口渴。 本文要介绍的成语,便是大家所熟知的“望梅止渴”, 原意是梅子酸,当说到梅子的时候,就会想到梅子酸而产生流涎,因而止渴。后比喻愿望无法实现,用空想安慰自己。这句成语的最早出处是南北朝刘义庆所撰《世说新语》。 小说中描述的这个“望梅止渴”的故事,最早见于《世说新语•假谲》:“魏武行役,失汲道,军皆渴,乃令曰:‘前有大梅林,饶子,甘酸可以解渴。’士卒闻之,口皆出水,乘此得及前源。”宋代沈括在《梦溪笔谈》中也提到:“吴人多谓梅子为‘曹公’,以其尝望梅止渴也。”可见这个故事流传已久,并非《三国演义》作者的首创。 说到这个故事发生的地点,后来的一些地方志资料中有所提及。例如《读史方舆纪要》…

    2022年1月14日
    97
  • 美的冰箱质量怎么样,排名如何?

    美的冰箱事业部当下同时经营着“美的”、“华凌”、“小天鹅”、“colmo”四个品牌,但就冰箱质量以及市场上的表现来说,美的品牌冰箱有比较大的优势,而且一些高性价比型号也是集中在美的,这里主要为大家介绍美的双制冷循环或者三制冷循环冰箱。 排坑:商家会把单循环的循环系统在商品页面描述成双循环、三循环,这个你在看产品介绍是看不出来的,因为它实际上是单循环+双风道或者多风道,只是循环送风。双循环指的是有两个独立的蒸发器,独立工作,三循环那就是在变温区还有一台单独的蒸发器独立工作。这种情况你必须问客服,一般客服会真实告诉你。 独立双循环制冷 19分钟急速净味系列法式BCD-508WTPZM(E)和十字对开门BCD-507WTPZM(E) 这两款冰箱容积一样,尺寸也一样,冰箱面板也是一样,都是双循环制冷,只是冰箱形态的区别。最适合的入手价格5.0K-5.5K之间,建议在有活动的时候入手。 冰箱容积:508L(冷藏室:308L、冷冻室175L、变温室25L) 冰箱尺寸:深668mm;宽833mm;高1898mm 冰箱容积:507L(冷藏室307L、冷冻室175L、变温室25L)冰箱尺寸:深668mm;宽833mm;高1898mm 主要性能: 能耗:一级能耗 压缩机:变频 制冷方式:风冷 循环系统:独立双循环制冷系统 附加值 除菌净味功能:搭载美的19分钟急速净味,PST超磁电离净味技术,携带超磁感电解装置,释放出更多的活性离子,快速分解歼灭异味、细菌分子。同时通过高活性金属催化剂,强力加快异味分解速度,达到双重净化、更加快速彻底地完成净味和除菌的效果。 性能PLUS:压缩机电机双变频,提高冰箱制冷运行的稳定性,节能降噪。 十字对开门BCD-476WGPM(E) 冰箱容积:476L(冷藏室330L、冷冻室146L) 冰箱尺寸:深740mm;宽833mm;高1808mm 这款冰箱最适合的入手价格是4.8k-5k,超过5k就性价比就不高了 主要性能: 能耗:一级能耗 压缩机:变频 制冷方式:风冷 循环系统:独立双循环制冷系统 附加值 保鲜功能:内置感温探头,在精确感知箱体内温度变化后,通过风道开关控制冷气流量大小,从而控制内部温度波动幅度,达到食材保鲜的效果。 除菌净味功能:装载了铂金净味装置,释放大量的铂金粒子,通过内部循环系统分散到冰箱内的各个角落吸附异味,除了净味,抗菌率99.9…

    2022年5月13日
    29