代码比较多,优化空间也很大,就不放上来了。
聊聊写的时候碰到的问题和解决。
QT使用的基本思路
首先实例化组件:
1 2 3 4
| self.label_name = QLabel('name') self.edit_name = QComboBox() self.label_num = QLabel('page num') self.edit_page_num = QComboBox()
|
层:
1
| self.lay_h1=QHBoxLayout()
|
向层中添加组件:
1 2 3 4 5 6 7 8 9 10
| self.lay_h1.addWidget(self.label_name) self.lay_h1.addWidget(self.label_num) self.lay_h1.addWidget(self.label_url) self.lay_h2.addWidget(self.edit_name) self.lay_h2.addWidget(self.edit_page_num) self.lay_h2.addWidget(self.edit_url) self.lay_h3.addWidget(self.btn_crawl) self.lay_h3.addWidget(self.btn_update) self.lay_h3.addWidget(self.btn_exit)
|
向窗口添加层:
1 2 3 4
| self.lay_v1=QVBoxLayout() self.lay_v1.addLayout(self.lay_h1) self.lay_v1.addLayout(self.lay_h2) self.lay_v1.addLayout(self.lay_h3)
|
定义按钮行为:
1 2 3 4
| self.btn_crawl.clicked.connect(self.crawl)
self.btn_update.clicked.connect(self.update) self.btn_exit.clicked.connect(self.close)
|
设置下拉框等等:
1 2 3
| self.edit_name.addItems(list(url_dict.keys())) self.edit_page_num.addItems(str(i) for i in range(1,11))
|
最后完成窗口设置:
1
| self.setLayout(self.lay_v1)
|
如何多py文件开发?
我也不清楚这个应该怎么称呼,总之就是多个源文件,但源文件之间可以使用其他文件的代码。要称呼的话应该是“工程”。
如果需要使用其他文件里的代码,在文件开头import
文件名即可,就当作库来使用。
主函数
也就是if __name__ == '__main__':
这句话,__name__
是自带变量,获取文件名。
使用pyqt窗口
需要实例化,即
1 2 3 4 5 6
| app = QApplication(sys.argv) addurl_test=addurl() crawl_test=crawler() main = mainpage(addurl_test,crawl_test) main.show() sys.exit(app.exec_())
|
实例化了几个窗口,在实例化时,会调用
__init__
方法,但是没有调用
show
方法,所以并不会显示。
关于窗口切换
一开始是试着通过调用close
和show
实现窗口切换,但是发现类的方法之间并不能使用主函数中实例化的窗口,需要传送参数,但是connect
方法传参会出现TypeError: argument 1 has unexpected type 'NoneType'
的问题,于是不了了之。
后面参考其他同学的代码,发现他们是通过在分页面的类内插入形如
1 2
| switch_window1=QtCore.pyqtSignal() self.switch_window1.emit()
|
的语段来实现。
在主界面似乎并没有这种语段。
需要更改父类的方法
直接写就是覆盖,如果需要在父类方法中插入语句,可以
1 2 3
| def show(self): super().show() print(self.__class__.__name__)
|
使用super()
。
QT自带计时器
1 2 3
| timer=QTimer(self) timer.start(5000) timer.stop()
|
计时器也是一个对象(毕竟面向对象),是需要实例化的。
“抓取成功”提示