前几天初步学习了Python环境下的Qt。
换句话说,就是可以再也不用写像以前那样的命令行程序,可以写有图形界面的程序了!(虽然,命令行简单,快)
工具:
从这个网站下载符合你版本的PyQt:[PyQt下载][1]
推荐使用**Eric6**这个Python的IDE。(请自行百度)
Python的手册(安装自带)
Qt的手册(不知为何,我PyQt自带的Assistant用不了,你们可以去下一个C++版的Qt,用它的Assistant)
英语(现阶段PyQt5的教程很少,特别是中文教程。Qt手册和Python手册也大多是英文,所以)
==================================================================================================
对于初学PyQt,我推荐先将这个网站通读一遍(PS:纯英文)
PyQt5 tutorial
将其中的程序范例都至少通读理解一遍以后,就可以尝试自己写个小程序来玩玩。
我写的是计算器。
QQ图片20151125205719.png
首先,这里需要实现几个功能:
1.界面布局(QtWidgets.QGridLayout
)
2.通过界面按钮输入数据(QtWidgets.QPushButton
)
3.结果窗口输出(QtWidgets.QTextBrowser
)
4.实现键盘按键输入数据(def keyPressEvent(self)
)
5.输入的历史记录(自定函数)
6.中缀表达式和前缀表达式的转换(前缀、中缀、后缀表达式)
一、界面布局
这里我选用的是QGridLayout的布局方式。
就是将界面分成一个二维数组的形式,每个控件所在的位置用坐标标定。
QGridLayout.addWidget(QWidget,int row,int col);
上面这是最简单的一种添加控件的方式。QWidget
->你要添加的控件row,col
为坐标
QGridLayout.addWidget(QWidget,int row,int col,int spanrow,int spancol);
这种添加控件的方式,可以人为地控制一个控件所占用的“格数”。
其中的spanrow
和spancol
是指从指定坐标(row,col)
扩充多少spanrow
行和多少spancol
列的范围。
二、通过界面按钮输入数据
这里使用的是QPushButtom.clicked.connect()
方法。
自定一个函数:
def OnChange(self):
self.senfToBuf(self.sender().text());
这样就可以将这个按钮的名字(也就是显示在按钮上的字)发送到你所需要的函数(我是sendToBuf
函数)。
其中,self.sender()
指的是触发这个函数时点击的按钮。而他的text()
方法就是得到按钮的名称。
这样就可以达到通过按钮输入数据的目的。
三、结果窗口输出
因为不想让输出窗口能够被编辑且可以多行显示,所以我使用的是QTextBrowser
而不是QLineEdit
。
对于这个控件,其实用法都差不多。显示数据使用的函数就是
QTextBrowser.setText(String);
每次数据输入的时候,都进行一次更新即可。
四、实现键盘按键输入数据
首先,我们可以知道对于QWidget
这个类(也就是我们自己的类所继承的类),他自带一个函数keyPressEvent
。
我们通过重载这个函数来达到我们自己的目的。
def keyPressEvent(self,e):
if(e.key()==Qt.Key_Enter):
self.sendToBuf('=');
else:
self.senfToBuf(e.text());
在这里,e指代的是我们触发这个Event
时按下的按键。e.key()
->按键类型(Qt里面内置了各种按键类型,我这里是只要是Enter
类型按键,就发送=号)
e.text()
->按键文本(就是按键的字。比如按下1
,这个函数就会得到'1'
)
五、输入的历史纪录
就是每次操作完一个算式,将算式加入数组然后输出罢了。
六、中缀表达式和前缀表达式的转换
仔细研读上面给出的地址。其实将中缀表达式转换成前缀、后缀表达式都可以。
可以使用列表List
的几个功能:
List.pop();
List.remove();
其实用List就可以很好地模拟栈。
下面是我写的前缀表达式的转换程序:
class prefix():
def __init__(self):
self.stack=[];
self.buf=[];
def arrange(self):
self.s1=[];
self.s2=[];
for ch in self.buf:
if(type(ch)==float):
self.s2.append(ch);
elif(ch in '/*-+'):
self.operatePK(ch);
elif(ch==')'):
self.s1.append(ch);
elif(ch=='('):
while(self.s1!=')' and len(self.s1)>0):
self.s2.append(self.s1.pop());
if(len(self.s1)>0):
self.s1.pop();
else:
print(ch);
while(len(self.s1)):
self.s2.append(self.s1.pop());
self.stack=[];
for ch in self.s2:
self.stack.append(ch);
def operateToInt(self,ch):
if(ch in '+-'):
return 0;
else:
return 1;
def operatePK(self,ch):
if(len(self.s1)==0 or self.s1[len(self.s1)-1]==')'):
self.s1.append(ch);
else:
if(self.operateToInt(ch)>=self.operateToInt(self.s1[len(self.s1)-1])):
self.s1.append(ch);
else:
while(self.operateToInt(ch)