安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

一个PyQt界面程序的优雅之路

2月2日 相见欢投稿
  有这样一个需求,把图中界面上每个控件显示的内容保存到字典中。
  每个控件类都有一个获取展示内容的方法,所以,最直观的实现方案就是逐个控件取。
  例如,策略名称(StrategyKey)属于QLineEdit类,用text方法获取展示内容,self。StrategyKey。text();账户(InvestorID)属于QComboBox类,用currentText方法获取展示内容,self。InvestorID。currentText()defsave(self):result{}策略名称result〔StrategyKey〕self。StrategyKey。text()账户result〔InvestorID〕self。InvestorID。currentText()买卖directionself。Direction。currentText()ifdirection买:result〔Direction〕0elifdirection卖:result〔Direction〕1优先平今reusult〔CloseTodayFirst〕self。CloseTodayFirst。isChecked()开平offsetflagself。OffsetFlag。currentText()ifoffsetflag开:result〔OffsetFlag〕0elifoffsetflag平:result〔OffsetFlag〕1elifoffsetflag平今:result〔OffsetFlag〕3elifoffsetflag平昨:result〔OffsetFlag〕4报价基准benchmarkflagself。BenchmarkFlag。currentText()ifbenchmarkflag对手价:result〔BenchmarkFlag〕0elifbenchmarkflag排队价: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()returnresult
  虽然这样实现是最简单的,但是当控件多且业务场景复杂时,会产生大量重复代码,也更容易出错。所以,不管从开发的角度还是维护的角度,这样写都不是最优的。
  接下来,我们进行优化。
  首先,买卖、开平、报单基准价这三个控件展示的是文本,而程序需要的是枚举值,它们之间存在一一对应关系。我们将展示值和枚举值对应关系存放在字典中,使用字典的查找功能就可以替代ifelse。买卖展示值枚举值字典directiontextflagdict{买:0,卖:1}开平展示值枚举值字典offsetflagtextflagdict{开:0,平:1,平今:3,平昨:4}报价基准展示值枚举值字典benchmarkflagtextflagdict{对手价:0,排队价:1}买卖枚举值result〔Direction〕benchmarkflagtextflagdict。get(self。Direction。currentText(),)开平枚举值result〔OffsetFlag〕benchmarkflagtextflagdict。get(self。OffsetFlag。currentText(),)报价基准枚举值result〔BenchmarkFlag〕benchmarkflagtextflagdict。get(self。BenchmarkFlag。currentText(),)
  当对应关系发生变化时,也只需要修改字典中的对应关系。
  当需要反向转换时,根据枚举值设置展示值,也可以轻松实现。买卖枚举值展示值字典directionflagtextdictdict(zip(directiontextflagdict。values(),directiontextflagdict。keys()))开平枚举值展示值字典offsetflagflagtextdictdict(zip(offsetflagtextflagdict。values(),offsetflagtextflagdict。keys()))报价基准枚举值展示值字典benchmarkflagflagtextdictdict(zip(benchmarkflagtextflagdict。values(),benchmarkflagtextflagdict。keys()))买卖展示值directiondisplaydirectionflagtextdict。get(itemdict〔Direction〕,)开平展示值offsetflagdisplayoffsetflagflagtextdict。get(itemdict〔OffsetFlag〕,)报价基准展示值benchmarkflagdisplaybenchmarkflagflagtextdict。get(itemdict〔BenchmarkFlag〕,)
  进一步,利用python语言的反射机制,我们就可以根据名称查找到关联控件实例,例如,getattr(self,StrategyKey)就是self。StrategyKey。这样我们就可以通过遍历控件名列表获得相关展示值,并存到字典中。deffromdisplay(widget,textlist,currenttextlist,valuelist,timelist):result{}QLineEdit类控件展示值foritemintextlist:result〔item〕getattr(widget,item)。text()ifgetattr(widget,item)elseQComboBox类控件展示值foritemincurrenttextlist:result〔item〕getattr(widget,item)。currentText()ifgetattr(widget,item)elseQComboBox类控件展示值foriteminvaluelist:result〔item〕getattr(widget,item)。value()ifgetattr(widget,item)else0QTimeEdit类控件展示值foritemintimelist:result〔item〕getattr(widget,item)。time()。asString()ifgetattr(widget,item)elsereturnresultdefsave(self):textlist〔StrategyKey,〕currentlist〔InvestorID,ExchangeID,InstrumentID〕valuelist〔TargetVolume,MaxOrderVolumeLimit,ExecuteGap,〕timelist〔StartTime,〕reustfromdisplay(self,textlist,currentlist,valuelist,timelist)result〔Direction〕directiontextflagdict。get(self。Direction。currentText(),)result〔OffsetFlag〕offsetflagtextflagdict。get(self。OffsetFlag。currentText(),)result〔BenchmarkFlag〕benchmarkflagtextflagdict。get(self。BenchmarkFlag。currentText(),)
  因为不同类控件获取展示值的方法不同,QLineEdit使用text方法,QComboBox使用currentText方法,QSpinBox使用value方法,所以理论上有几个控件,上述代码中的fromdisplay函数就需要几个参数,还是不够简洁。
  是否可以给不同的控件类增加一个相同的获取展示值的方法呢?当然可以。QtWidgets。QLineEdit。getDisplaylambdaself:self。text()QtWidgets。QTimeEdit。getDisplaylambdaself:self。time()。toString()QtWidgets。QCheckBox。getDisplaylambdaself:self。isChecked()QtWidgets。QSpinBox。getDisplaylambdaself:self。value()QtWidgets。QComboBox。getDisplaylambdaself:self。currentText()
  通过以上定义,我们就给用到的几个控件类打了个补丁,增加一个getDisplay方法,用来获取展示值。
  之前写的fromdisplay函数就不需要区分具体的控件类了。deffromdisplay(widget,itemlist):result{}foriteminitemlist:reuslt〔item〕getattr(self,item)。getDisplay()returnresultdefsave(self):itemlist〔StrategyKey,InvestorID,ExchangeID,InstrumentID,TargetVolume,MaxOrderVolumeLimit,ExecuteGap,StartTime,CloseTodayFirst,〕reusltfromdisplay(self,itemlist)result〔Direction〕benchmarkflagtextflagdict。get(self。Direction。currentText(),)result〔OffsetFlag〕benchmarkflagtextflagdict。get(self。OffsetFlag。currentText(),)result〔BenchmarkFlag〕benchmarkflagtextflagdict。get(self。BenchmarkFlag。currentText(),)
  优化之后,随着控件数量的增加,代码量不会显著增加。
  通过上述过程总结下来的经验,将字典中的数值展示到控件上的需求就可以这样来实现了:QtWidgets。QLineEdit。setDisplaylambdaself,value:self。setText(str(value))QtWidgets。QTimeEdit。setDisplaylambdaself,value:self。setTime(QtCore。QTime。fromString(value))QtWidgets。QCheckBox。setDisplaylambdaself,value:self。setChecked(value)QtWidgets。QSpinBox。setDisplaylambdaself,value:self。setValue(value)QtWidgets。QComboBox。setDisplaylambdaself,value:self。setCurrentText(str(value))defdisplay(self,itemdict):itemdict〔Direction〕directionflagtextdict。get(itemdict〔Direction〕,)itemdict〔OffsetFlag〕offsetflagflagtextdict。get(itemdict〔OffsetFlag〕,)itemdict〔BenchmarkFlag〕benchmarkflagflagtextdict。get(itemdict〔BenchmarkFlag〕,)forkey,valueinitemdict。items():widgetgetattr(self,key,None)ifwidgetandgetattr(widget,setDisplay,None):widget。setDisplay(value)
投诉 评论 转载

重磅!亚洲区变成8。5个名额是机会还是耻辱让我们拭目以待今日亚足联官方宣布,2026年世界杯亚洲区预选赛,亚洲区将会有8。5个名额进入世界杯,对于中国足球是机会也是挑战,如果争气将是中国足球很大的鼓舞,但是以中国队现在的状态,也可能……聪明女人很少穿铅笔裤,今年流行直筒裤,利落又显腿细,真时髦要说女人衣柜中最常见到的裤装种类,一定是铅笔裤了。铅笔裤的裤腿较为修身,能很好地勾勒出腿部的线条感,可正因如此,铅笔裤也很容易暴露腿部的短板,尤其是对于腿型不直的姐妹们来说,入……俄罗斯火箭发射成功,卫星却在半个月后坠入太平洋当地时间4月29日,俄罗斯曾用一枚安加拉1。2运载火箭,成功将约150公斤重的宇宙2555军用光学侦察卫星送入太空,半个多月来,它一直运行在整备轨道上。然而就在5月18日,突然……外网曝料暗黑4内部测试开启并且反响较好之前国外媒体曾爆料《暗黑破坏神4》已在PlayStation数据库中添加了PS4、PS5测试版,或将推出Beta试玩版。近日,有业内人士在社交媒体上爆料称,一些与暴雪关系……女乒削球名将首轮出局,田志希31淘汰韩莹,晋级16强挑战陈幸2022年10月20日,乒乓球澳门冠军赛进入白热化阶段,德国削球名将韩莹首轮出局,成为继杜凯琹后,第二位被淘汰的女单前十,韩国一姐田志希31晋级,挑战国乒世界冠军陈幸同。……倾力盘点推荐世界上拍摄次数最多的20个地方,每一个都让人惊艳在当今时代,几乎任何拥有像样手机摄像头的人都可以捕捉到他们的经历。我们为您整理了一份世界上20个拍摄地点最多的地方,最壮丽的地方。他们来了。世界上拍摄次数最多的20个地方……关于光通信的最强进阶科普大家好,今天这篇文章,小枣君将重点介绍一些光通信基础知识。众所周知,我们现在的整个通信网络,对于光通信技术有着极大的依赖。我们的骨干网、光纤宽带以及5G,都离不开光通信技……国乒结束隔离!刘诗雯长发披肩,孙颖莎可爱,马龙樊振东玩失踪4月19日,国乒全队结束隔离,此前参加WTT新加坡大满贯,3月20日所有比赛结束,稍作休整之后回国。回国之后进行了147的隔离期,检测没有问题,这样国乒全队正式解除隔离,球员们……小儿退烧小妙招清天河水!宝妈一定要收藏好,以备不时之需最近,留言区和后台有姐妹回复说宝宝这几天时不时有发烧情况,又不希望吃太多药物,然后想要一个安全又真实有用的退烧方法。今天,就给姐妹们介绍一个宝妈必备的退烧方法清天河水。清……一个PyQt界面程序的优雅之路有这样一个需求,把图中界面上每个控件显示的内容保存到字典中。每个控件类都有一个获取展示内容的方法,所以,最直观的实现方案就是逐个控件取。例如,策略名称(Strate……为什么普通人,想改变人生命运,会很难?一个阶层进入另一个较高阶层,不是一件容易的事。俗话说:要想好,得起3600个早!由此可见,难度不小。普通人,没有背景,没有条件,缺乏一定的物质供应和精神供应,犹如一颗种子……狠人赵丽颖火爆全网离婚后,她把自己活成了一个传奇前几天,赵丽颖在微博晒出一张双手照,右边明显比左边大一圈。打人打的。这条微博起因于正在热播的电视剧《风吹半夏》。赵丽颖在其中饰演将红唇大波浪半永久的企业家,在……
中药知识一点通沙苑子的功效和作用有哪些?好书推荐深度滋养头皮头发,阿道夫茶麸洗护释放天然养护效能停止征收新税,为期两年,美给四国开绿灯,对华光伏贸易战或暂缓章子怡嫂子挺会打扮,白西装上系个围兜,不仅显腰细还很时髦柳传快联想和华为(九)第四季度大赚ST中基业绩翻身,股价提前大涨,监管追问合理性45万件!乌鲁木齐邮区中心邮件日处理量创新高奋斗征程百年路启航正当风起时毛宗强绿氢是实现碳中和的有力支撑中国金融巨神替巴菲特管钱,京东腾讯背后金主,河南张磊有多牛市场监管总局组织10家免税企业公开承诺更好保护消费者权益

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利