关于解决Matplotlib的中文错误的问题

所有数据进行了录入,接下来是展示数据的强大工具:Matplotlib

但Matplotlib对中文的支持,由于字体的不对,可能导至数据无法正常显示。通过查找网络上的一些高手的解决办法,最终找到最简单的方法:重新定义字体

具体办法:

1、先查看看安装的Matplotlib有哪些字体:

mpl_fonts = set(f.name for f in FontManager().ttflist)
for f in sorted(mpl_fonts):
print(‘\t’ + f)

2、在找到的字体内找到,能显示中文设定为默认字体:

matplotlib.rc(‘font’, family=’Kai’)

楷体

3、注意事项:

要先:import matplotlib

解决QT5值入matplotlib的问题

近期解决了:python plt与Qt的集成
需要导入的控件
from matplotlib.backends.backend_qt5 import NavigationToolbar2QT
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

一、QT:需提前定义好
graph_view=QGraphicsView()
graph_scen=QGraphicsScene()
与tableView()与tableModel关系类似可以查手册解决问题


二、必须先实例化:类
class MyFigureCanvas(FigureCanvas):
def init(self):
# 画布上初始化⼀个图像
self.figure = Figure()
super().init(self.figure)


三、操作
1、将绘图控件实例化:fig=MyFigureCanvas()
2、添加画布:ax=fig.figure.add_subplot()
3、在画布当中绘制:ax.plot(x,y,color=’red’)
4、在场景中增加实例化的控件:graph_scen.addWidget(fig)
5、将场景设置到View当中:graph_view.setSence(graph_scen)
最终效果:

至此:强大的库matplotlib已经加入到了控件当中,还可以实现菜单栏、修改数据的功能。

其它操作
增加操作界面
将导入的NavigationToolbar2QT加入到layout当中:

tool_bar=NavigationToolbar2QT(fig,widget)
glayout.addWidget(tool_bar)

以上为加入控件后的图形
注:不能在Scene当中添加,报错:QGraphicsProxyWidget::setWidget: cannot embed widget 0x60000374b170 which is not a toplevel widget, and is not a child of an embedded widget

五、重要功能:
清除图形
ax.cla()
绘制图形
ax.plot(data)
fig.draw()


六、画布清除功
garph_scen.clear():此功能慎用,使用后需要重新建立所有对像,重画所有的图形

解决pandas不能删除数据库内指定数据问题

pandas与SQLite通信实质只是封装了sqlalchemy的增加、替换、读取的功能


from sqlalchemy import create_engine
from config import DB_URI

engine = create_engine(DB_URI) # 创建引擎
conn = engine.connect() # 连接
result = conn.execute(‘SELECT 1’) # 执行SQL
print(result.fetchone())
conn.close() # 关闭连接

通过查阅相关手册与办法:
sqlAlchemy:官方手册:https://docs.sqlalchemy.org/en/14/
https://www.cnblogs.com/blueberry-mint/p/14277882.html

得到SQLalchemy可以直接用sql语句进行操作:engine直接用pandas一起启动的那个就OK

于是增删查改功能,全能用SQL语言来解决。当然也可以用对像方式,只是没有那么多时间来搞了。看到在Django下也有一个与数据库通信的库,看似好用:


其它查询功能:df=conn.execute(“select * from your_table_name”)
删除功能:conn.execute(“delete from your_table_name where columns_name=’your_select'”
注:删除功能,在操作以后,QT5的Model是不会刷新的,包括model.select()也不起作用,只能重新设定model.setTable(your_table)才能起作用

注2:’your_select’字段,必须要带‘’号

解决QT5的右键菜单栏问题

在一个table区域增加右键菜单:

def right_menu(self):
self.r_menu = QMenu()
self.action_01 = QAction(‘增加一行’)
self.action_02 = QAction(‘插入一行’)
self.action_03 = QAction(‘删除一行’)
self.action_04 = QAction(‘清除全部’)
self.r_menu.addActions([self.action_01, self.action_02, self.action_03, self.action_04])
self.action_01.triggered.connect(lambda: table_model.insertRow(table_model.rowCount()))
self.action_02.triggered.connect(lambda: print(‘this is action_02’))
self.action_03.triggered.connect(lambda: print(‘this is action_03’))
self.action_04.triggered.connect(lambda: print(‘this is action_04’))
self.r_menu.popup(QCursor.pos())
self.r_menu.show()

解决QT5窗口层叠问题及TableView内文字改色问题

一、最近主要集中解决一个窗口层叠问题:

(1)将控件/临时/放最上层:
widget.activateWindow():一定要先指定活动操作的控件,不然程序不知道操作哪个对像
widget.raise_()
用raise():由于在python3中 raise 是一个关键字,所以在PyQt5中这个方法的名字为 raise_,即widget.raise_(),但必须先指定需要的窗口为activateWindow
>>> widget3.activateWindow()
>>> widget3.raise_()
至此完美解决界面显示的问题

(2)将控件一直放于最上层:

widget2.setWindowFlags(Qt.WindowStaysOnTopHint)
功能除非关闭,会一直在最上方

二、最近主要集中解决TableView相关内容,用红色显示问题(包括背景):

窗口与背景颜色
setFont
item.setFont(QFont(‘Times’),14,QFont.Black))
setForeground
item.setForeground(QBrush(QColor(255,255,0))
setBackground
item.setBackground(QBrush(QColor(0,0,255))
setForeground
item.setForeground(QBrush(QColor(255,255,255))
255,255,255白色;255,255,0黄色;255,0,0红色

解决QListView从EXCEL内查找数据并写入数据库并动态更新List

数据最终来源于普通办公EXCEL,为了将这个接口解决完,近期做了大量的工作

得益以前用Python对EXCEL的比较熟悉的操作,一下就解决了

可以说用QT5对数据进导入,已经有自己的一些心得

怎么实现的呢?很简单用pandas,直接read_excel()函数,完美解决,细节注意再做数据的清洗工作,清洗完成后,导入到数据库对应的接收表,同样用to_sql()函数

不得不说pandas对EXCEL与SQLite接口稳定性,可为工业级生产带来不少福利。

解决了数据库内表的切换与自动生成框架体系表

近期开发学习,越来越深入,深到把自己代码写得近千行各类函数在相互调用。因为我是徙手写界面,大致需求都在自己的脑海,所以逻辑图也没有画,想起一部分就能实现和展现一部分。思路清晰,目标明确所以后台的数据库表格体系与判断,都是自己的脑海对比现实不断修改出来的。有经验以后,应该能行快实现。

解决了两个问题:一是:默认建立表格体系,并存入数据库;再从这个表里面读出项目所需要的表体系,生成项目需要的表;二是:解决了下拉菜单QComboBox控件与体系表连接,并取得相应的表格,映射到列表框,展现需要数据。再通过列表框点选,获得tableView的数据。

通过两个列表,将功能性与使用性迈进了一大步。

得到如下体会:

1、窗口尽可能与数据分离,也是QT的主要精神,但Model可在窗口与界面就绑了,以后好找;

2、函数相互调用,可能省一些代码的编写,但不利于后期维护;尽量写好注释与手册,否则自己都难找到出处;多写一些重复代码,也许后期更利于维护,看自己情况而定;

3、需要一个控件要连接两个信号的时候,可以把其中一个信号函数写入到另一个函数,执行完一个后,接着再执行另一个函数。完美解决需要执行两个动作的需求。OH Ye

3、后面的路还要走很长,但不远了!加油,少年。

将字典数据(每一条)写入到QTableView或QTreeView每一列的算法

最近想用字典来存写用户数据,主要是想解决分部分项工程存在一张字典对像里,同时又要能将字典数据写入到QTableView的Model当中。

对比了字典与列表的存储与调用不同后,我个人觉得字典比较难以操作,所以在这两天进行了研究得到以下结论:

1、字典由于有专门的key索引,理论上应该比列表快;

2、字典操作技巧性比较高,可以转化为Pandas 的DataFrame进行操作比较合理;

3、除非有几万行数据,字典与列表一般用户,性能没有什么感觉的,其次Pandas 的DataFrame真香!

首先:字典转化为DataFrame的方法:

—>pd.DataFrame(df.values(),columns=df.keys())

然而:这种方法,只能将字典的每组数据转化为每一行数据,将数组进行stark()得到的是二维数组,郁闷~!于是就行自己研究一下算法。

于是就有了这两天的思考:将字典每一行,转化为每一列QTableView的数据算法:

原始数据df情况如下:

  • >>> df
  • {‘bridge’: [‘mt_zj_oral_talbe’, ‘mt_xl_oral_talbe’, ‘mt_dz_oral_table’], ‘road’: [‘边坡’, ‘路基’, ‘下边坡拱格’], ‘隧道’: [‘初支’, ‘仰拱’], ‘附属工程’: [‘mt_bd_oral_table’, ‘mt_lj_oral_table’, ‘mt_zd_oral_table’]}
  • >>> df.keys()
  • dict_keys([‘bridge’, ‘road’, ‘隧道’, ‘附属工程’])
  • >>> df.values()
  • dict_values([[‘mt_zj_oral_talbe’, ‘mt_xl_oral_talbe’, ‘mt_dz_oral_table’], [‘边坡’, ‘路基’, ‘下边坡拱格’], [‘初支’, ‘仰拱’], [‘mt_bd_oral_table’, ‘mt_lj_oral_table’, ‘mt_zd_oral_table’]])

写入算法:

  • x=0
  • y=0 #两个计数器x,y
  • >>> for i in df.values(): #拿出数据列
  • …     x=0 #行计数器归0
  • …     for j in i:
  • …             model.setItem(x,y,QStandardItem(j))
  • …             x+=1
  • …     y+=1 #当行写完以后,将新的一列数据换列计数+1

内容写入完成后:将表头写入

>>> model.setHorizontalHeaderLabels(df.keys())

最后,字典写入效果:

大功告成!

最后:字典的写法,有一点麻烦。不如直接操作DataFrame来得快,主要是DataFrame可以直接导入数据库,其次DataFrame数据都有自己的坐标,可以随时“切片”df.iloc[i,j]要哪个取哪个,不香吗?可以一键to_excel不香吗?可以一键to_sql不香吗?……

所以将字典转化Pandas的DataFrame上面算法已经给出了答案,只要将写入model的操作改成写入DataFrame对应方法即可—–>df.iloc[x,y]=j

只要注意先设定好df的行与列大小与字典匹配就不会出错啦。

解决Qt5当中TableView与TableWidget数据互动更新与读取问题

最近,为解决PyQt5的TableView和TableWidget数据互动,一直在找办法。

最后,通过Index方法得到解决。

主要原理为:TableView无法使用Index必须用Model内的index,然后通过循环将二维数组,放入矩阵当中。

但TableWidget作为TableView的子程序更加丰富,TableWidget有item的查找工能。TableWidget.item(i,j).data()即能实现数据提取。但TableWidget.model().index(i,j).data()同样能实现数据提取功能。

数据放入功能很简单,更新model即可。在此不作更深入的讨论。model.setItem(i,j,your_data)

解决公式内的数据进行正确判断的问题,初次使用Try

界面参数已经通过model.record(i).value(j)通过循环枚举取得。

# 清空标准数据重新写入计算参数函数:
def clear_x_add(self):
    self.zj_parameter.clear()  # 清空列表
    self.list_x = []
    # 将model的数据拿出来至list_data
    row_n = table_model.rowCount()
    column_n = table_model.columnCount()
    list_data = pd.DataFrame(index=range(row_n), columns=range(column_n))
    for i in range(row_n):
        for j in range(column_n):
            list_data.loc[i, j] = table_model.record(i).value(j)
    get_x_list = list_data[list_data.columns[4:6]]  # 我只需要4,5列
    print(get_x_list)

    # 用正则表达式找出自己需要参数,当然先要import re
    get_x_compile = re.compile("[a-z]\'|[a-z]|[A-Z]")
    for n in get_x_list[4] + get_x_list[5]:  # python福利:列表相加
        add_item = re.findall(get_x_compile, n)
        for m in add_item:
            if m not in self.list_x:  # python福利:有不同元素就放入
                self.list_x.append(m)
                self.zj_parameter.appendPlainText(m + '=')  # 顺便将数据写入列表
            if 'H' not in self.list_x:
                self.zj_parameter.appendPlainText('H')
    print(self.list_x)

对文本框写入的公式需要进行=号前后数据判断:

>>> a
'33'
>>> b
33.33
>>> 
>>> 
>>> 
>>> def check_a(x):
...     try:
...             if x.isdigit() is True:
...                     print('True')
...             else:
...                     print('False')
...     except:
...             print('Data Wrong',type(x))
... 
>>> 
>>> 
>>> 
>>> check_a(a)
True
>>> a.isdigit()
True
>>> 
>>> 
>>> check_a(b)
Data Wrong <class 'float'>
>>> 
>>> 
>>> 
>>> 
>>> check_a(c)
False
>>> c
'this is string'

以上为自己写的Try也是将测试进行一个初步开始。