记界面项目第一阶段

PyQt5设计用户界面+Fortran计算程序

Posted by kamzero on 2019-09-03

界面项目第一阶段

基本实现了规划中的功能。从决定做到搭出框架花了一天,从有框架到基本实现功能花了一天半,之后休息看书打球了一天,收尾花了大半天。期间效率还是不错的,代码量并不大,整个写下来有581行,写到400行的时候大改过一次,当时压缩到了二百多行。因为基本上是陌生的东西,能够在一周之内完成还是比较满意的。

做界面的选择很多,我选择了pyqt5,其实在国内pyqt5的资料很少,很不适合入门选手,适合熟悉qt喜欢python的人用…为什么不用qt呢?可能是为了逃避C++吧(我就看看你能逃避到什么时候)希望qt可以作为我面对C++的一个契机,早日脱离C+STL的水平。

界面部分基本实现了,当前重心是和计算部分交互,这部分代码是拿Fortran写的…我查过很多混合编译的资料,Fortran和Python采用f2py库混合编程效果并不是很理想。原作者用Fortran来写主要是看重Fortran当中许多科学计算的子程序,这当中已有相当一部分被改写进NumPy库中。Fortran的语法并不困难,作者的注释很棒,大概写了两千三百行,其中实际用到的代码约有一千五百行,因此,我决定将计算部分的代码改写为python代码。不仅仅是为了界面交互,更是为了帮计算部分实现更加复杂的逻辑。为了达到这一目的,我不仅仅要学习fortran,更要了解计算部分的各项细节。虽然Fortran的语法并不难,了解一门编程语言对我来说没有很大的困难,但是…这毕竟是在我意料之外的…希望能早日完成吧。

能接触到Fortran这门神奇的语言实属巧合,为了了解代码迁移的可能性,我去看了一些评价,发现现在还有很多很多传统学科的实验室都在应用这种语言,而且有很多祖传的可读性很差却效率极高的子程序,被科研界广泛沿用。

昨天是很特别的一天,去校篮球队试训,晚上回来又看了篮球世界杯中国对波兰的紧张对决。打球真的好辛苦啊啊啊啊啊,训练完怀疑第二天能不能起来,结果第二天好像还好。打完球的我心如止水,只想写代码。记得中学时候军训,旁边那个优秀的小姐姐一边蹲姿一边默默流泪,完了跟我说:”每次军训的时候,就想着,我还是回去读书好了…“ 昨天打完球,我只想说,我再也不在学习的时候想着教练我想打篮球了。好处就是,经过游泳和篮球的锻炼,好像壮实一点啦。

我有很多个机会可以打好篮球,可是我都没有做出那样的选择。对于初中之后的我来说,运动只是生活中的调剂,放下吧。

接下来的事情就真的是工作性质诶!真的该好好考虑如何平衡工作、学习、运动、生活、家庭啦。人生的每一个阶段想要的东西不能太多,静下心来看看书吧。

那些踩过的坑

项目初期还有心情记录一下get到的东西,后来就不太记了,也没有整理,挂上来作为以后的备份吧。

pip装库,记得以管理员身份运行cmd

C:\WINDOWS\system32>

布局

盒布局、弹性元素

忘了安装路径

输入 import sys

输入 print(sys.path)

列表中的第四个将是你的安装路径

将ui文件转换为py文件

​ cmd中打开1.ui所在路径:cd C:/work
​ 然后输入pyuic5 -o 1.py 1.ui

python全局变量

global声明

按钮的排他性

button1.setAutoExclusive(True)

嵌套布局

https://www.cnblogs.com/hhh5460/p/5173846.html

必须躺在空widget里

配合工具canvas画图

忘了细节

隐藏子窗口

1
2
a.setVisible(False) 
a.hide()

分区

该做的事情早晚得做

布局

主要是嵌套布局上的一些技巧

时常找不到对象在哪

打算什么时候补补python的基础鸭?

关于画图的尝试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#coding:utf-8

# 导入matplotlib模块并使用Qt5Agg
import matplotlib
matplotlib.use('Qt5Agg')
# 使用 matplotlib中的FigureCanvas (在使用 Qt5 Backends中 FigureCanvas继承自QtWidgets.QWidget)
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5 import QtCore, QtWidgets,QtGui
import matplotlib.pyplot as plt
import sys

class My_Main_window(QtWidgets.QDialog):
def __init__(self,parent=None):
# 父类初始化方法
super(My_Main_window,self).__init__(parent)

# 几个QWidgets
self.figure = plt.figure()
self.canvas = FigureCanvas(self.figure)
self.button_plot = QtWidgets.QPushButton("绘制")

# 连接事件
self.button_plot.clicked.connect(self.plot_)

# 设置布局
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.canvas)
layout.addWidget(self.button_plot)
self.setLayout(layout)

# 连接的绘制的方法
def plot_(self):
ax = self.figure.add_axes([0.1,0.1,0.8,0.8])
ax.plot([1,2,3,4,5])
self.canvas.draw()

# 运行程序
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
main_window = My_Main_window()
main_window.show()
app.exec()

画图问题解决啦

调用整个库

from numpy import *

字体

setFont

初始比例

Python 混合编译

解耦和!解耦和!解耦和!

还不如我都用python写…

python脚本 to exe

句子

高德纳:“过早的优化是万恶之源”

自动换行

先自定义一个很长的字符串,否则不会实现自动换行

1
2
self.tailLable.setText(u'                                    ') 
self.tailLable.setWordWrap(True)

开发者日志

2019.9.3 最后完成了参数设置子窗口,开始看fortran部分

2019.9.2 实现了文件选择,基本实现协议中的功能。

​ 考虑fortran与Python的参数传递,打算拿python重写fortran…

2019.9.1 实现了绘图

2019.8.31 按钮排他性

2019.8.30 开始此项目界面部分,有个样子了

To be continued