Python宝典第11-15章:GUI编写
来源:互联网 发布:手机号码测吉凶80算法 编辑:程序博客网 时间:2024/05/21 17:57
书上一共介绍了5种方法:
- PythonWin
- tkinter
- wxPython
- PyGTK
- PyQT
调研以后,决定学习tkinter和PyQT。以下两段介绍摘自link:
Tkinter
Tkinter 似乎是与tcl语言同时发展起来的一种界面库。tkinter是python的配备的标准gui库,也是opensource的产物。Tkinter可用于windows/linux/unix/macintosh操作系统,而且显示风格是本地化的。Tkinter用起来非常简单,python自带的 IDLE就是采用它写的。
除此外,tkinter的扩展集pmw和Tix功能上都要相对它强大,但tkinter却是最基本的。我认为,在用python 做gui开发,tkinter是最基本的知识,所以这个环节是必须要学习的。你或许在以后的开发中并不常用tkinter,但是一些小型的应用上面,他还是很有用的,而且开发速度也很快。
PyQT
Qt同样是一种开源的GUI库,Qt的类库大约在300多个,函数大约在5700多个。Qt同样适合于大型应用,由它自带的qt designer可以让我们轻松来构建界面元素。
使用tkinter编写GUI:
tkinter是Python自带的GUI编程模块,是对图形库TK的封装。跨平台。
import tkinter
首先要生成一个主窗口对象,然后才能使用tkinter模块的函数方法等。生成主窗口后,再添加组件,或者调用其mainloop方法进行消息循环。
<span style="font-size:14px;"><span style="font-size:14px;"># -*- coding:utf-8 -*-# file: pyLearningtkinter.py#from tkiter import *root=Tk()root.mainloop</span></span>
使用相应组件函数生成组件,然后使用pack、grid、place等方法添加的窗口中。
如果添加组件的时候不指定位置,tkinter会自动安排到合适位置。
<span style="font-size:14px;"><span style="font-size:14px;"># -*- coding:utf-8 -*-# file: pyLearningtkinter.py#from tkinter import *root=Tk()label=Label(root, text="hello, tkinter!")label.pack()button1=Button(root, text="button1")button1.pack(side=LEFT)button1=Button(root, text="button2")button1.pack(side=RIGHT)root.mainloop()</span></span>
一共有15个核心组件。
按钮:
<span style="font-size:14px;"># -*- coding:utf-8 -*-# file: pyLearningtkinter.py#from tkinter import *root=Tk()button1=Button(root, anchor=E, text="button1", width=40, height=5)button1.pack()button2=Button(root, text="button2", bg="blue")button2.pack()button3=Button(root, text="button3", width=14, height=1)button3.pack()button4=Button(root, text="button4", width=60, height=5, state=DISABLED)button4.pack()root.mainloop()</span>
文本框:
<span style="font-size:14px;"># -*- coding:utf-8 -*-# file: pyLearningtkinter.py#from tkinter import *root=Tk()entry1=Entry(root, show='*')entry1.pack()entry2=Entry(root, show='#', width=50)entry2.pack()entry3=Entry(root, bg='red', fg='blue')entry3.pack()entry4=Entry(root, selectbackground='red', selectforeground='gray')entry4.pack()entry5=Entry(root, state=DISABLED)entry5.pack()edit1=Text(root, selectbackground='red', selectforeground='gray')edit1.pack()root.mainloop()</span>
标签:Label
菜单:
<span style="font-size:14px;"># -*- coding:utf-8 -*-# file: pyLearningtkinter.py#from tkinter import *root=Tk()menu=Menu(root)submenu=Menu(menu, tearoff=0)submenu.add_command(label="Open")submenu.add_command(label="Save")submenu.add_command(label="Close")menu.add_cascade(label="File", menu=submenu)submenu=Menu(menu, tearoff=0)submenu.add_command(label="Copy")submenu.add_command(label="Paste")submenu.add_separator()submenu.add_command(label="Cut")def popupmenu(event): menu.post(event.x_root, event.y_root)root.bind("<Button-3>", popupmenu)menu.add_cascade(label="Edit", menu=submenu)submenu=Menu(menu, tearoff=0)submenu.add_command(label="About")menu.add_cascade(label="Help", menu=submenu)root.config(menu=menu)root.mainloop()</span>
单选框和复选框:
关键参数variable,其指定的变量应使用tkinter.IntVar或者tkinter.StringVar生成。可以用set方法设置初始值。如果初始值与组件value值一样,则该组件处于被选中状态。
若用了参数indicatoron传递值为0时,组件为按钮的样式。
绘制图形:Canvas
事件处理:
用组件的bind方法或者bind_class方法
bind(sequence, func, add)
bind_class(className, sequence, func, add)
bind_all(sequence, func, add)
对话框:
消息框需要使用tkinter的messagebox模块
另有simpledialog模块,filedialog模块,colorchooser模块
Toplevel组件来创建自定义对话框
使用PyQT编写GUI
编写GUI脚本,应首先创建一个QtGui.QApplication对象,并向其传递命令行参数。
脚本的最后调用QtGui.QApplication对象的exec_方法进入消息循环。
可以使用QMainWindow的setCentralWidget方法添加组件到窗口。
<span style="font-size:14px;"># -*- coding:utf-8 -*-# file: pyLearningPyQT.py#import sysfrom PyQt4 import QtCore, QtGuiclass MyWindow(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.setWindowTitle('PyQT') self.resize(300,200) label=QtGui.QLabel("python\nlabel") label.setAlignment(QtCore.Qt.AlignCenter) self.setCentralWidget(label)app=QtGui.QApplication(sys.argv)mywindow=MyWindow()mywindow.show()app.exec_()</span>
但是setCentralWidget只能添加一个组件。添加多个组件,需要使用布局组件来组织这些组件。
布局组件可以容纳多个组件,还可以设置组件位置。
常用布局组件:
- QLayout
- QHBoxLayout
- QVBoxLayout
- QGridLayout
共有的方法:
- addWidget()
- addLayout()
PyQt中的空白项可以占据位置,这样可以更好的控制其他组件位置。
使用QtGui.QSpacerItem创建空白项,创建时可以使用宽度和高度设置大小。
创建后,使用布局组件的additem方法将空白项添加的布局组件中。
按钮:
使用PyQt的QtGui.QPushButton,按钮事件是通过信号/插槽的形式将按钮事件绑定到类的方法上。
QT的组件是使用信号和插槽的形式来进行通信的。Qt的组件有很多预定义的信号,当事件激发时,信号被发送到插槽进行处理。
插槽实际上是处理特点信号的函数。
PyQt也是如此,使用组件的connect方法将组件的信号绑定到其处理插槽上。
connect (QObject, SIGNAL(), SLOT(). Qt.ConnectionType)
# -*- coding:utf-8 -*-# file: pyLearningPyQt.py#import sysfrom PyQt4 import QtCore, QtGuiclass MyWindow(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) self.setWindowTitle('PyQt') self.resize(300,200) gridlayout=QtGui.QGridLayout() self.button1=QtGui.QPushButton('Button1') gridlayout.addWidget(self.button1, 1,1,1,3) self.button2=QtGui.QPushButton('Button2') self.button2.setFlat(True) gridlayout.addWidget(self.button2,2,2) self.setLayout(gridlayout) self.connect(self.button1, QtCore.SIGNAL('clicked()'),self.OnButton1) self.connect(self.button2, QtCore.SIGNAL('clicked()'),self.OnButton2) def OnButton1(self): self.button1.setText('clicked') def OnButton2(self): self.button2.setText('clicked')app=QtGui.QApplication(sys.argv)mywindow=MyWindow()mywindow.show()app.exec_()
文本框,单选框,复选框类似按钮的创建。
菜单:
使用QMenuBar创建菜单条,QMenu创建菜单。addMenu方法向菜单条添加菜单。
addAction方法向菜单中添加菜单命令。对于QtGui.QMainWindow可以直接使用其menuBar方法获得菜单条。
Qt中,资源文件是以ui为后缀名的文件。Qt提供了Qt Designer用于创建资源文件。
该资源文件可以在PyQt中使用,简化界面设计,也可以将界面和代码分离,提供程序的可维护性。
# -*- coding:utf-8 -*-# file: pyLearningPyQt.py#import sysfrom PyQt4 import QtCore, QtGui, uicclass MyDialog(QtGui.QDialog): def __init__(self): QtGui.QWidget.__init__(self) uic.loadUi("F:\\rantom\\python3.4\\Lib\\site-packages\\PyQt4\\res.ui", self)class MyWindow(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) self.setWindowTitle('PyQt') self.resize(300,200) gridlayout=QtGui.QGridLayout() self.button=QtGui.QPushButton('CreateDialog') gridlayout.addWidget(self.button, 1,1) self.setLayout(gridlayout) self.connect(self.button, QtCore.SIGNAL('clicked()'),self.OnButton) def OnButton(self): dialog=MyDialog() r=dialog.exec_() if r: self.button.setText(dialog.lineEdit.text())app=QtGui.QApplication(sys.argv)mywindow=MyWindow()mywindow.show()app.exec_()
0 0
- Python宝典第11-15章:GUI编写
- Python宝典第21章:科学计算
- Python宝典第23章:多线程编程
- python编写GUI
- 求职宝典 第11章
- Python宝典第16章:Python与数据库
- Python宝典第17章:Python Web应用
- Python宝典第18章:Python网络编程
- Python宝典第22章:Python扩展和嵌入
- python使用Tkinter编写GUI
- Python宝典第19章:处理HTML与XML
- Python宝典第20章:功能强大的正则表达式
- 第11章 GUI 01 GUI 初步 Frame and Panel1
- 第11章 GUI 02 GUI 初步 Frame and Panel2
- 使用 Python 编写 KVM 脚本,第 2 部分: 添加 GUI 来使用 libvirt 和 Python 管理 KVM
- python shell GUI编写切换工作路径
- Python学习实例:编写一个记事本GUI
- 第11章 GUI 11 Paint 方法
- 海明码编码示例
- PyCon 2014:机器学习应用占据Python的半壁江山
- Java基础-->面向对象与类之概述
- 大话NoSql
- 高效代码管理--本地svn环境搭建 .
- Python宝典第11-15章:GUI编写
- vs2010+opencv2.4.8配置 .
- INTERSECT
- POJ2431 Expedition(排序+优先队列)
- MAC地址和IP地址的关系 .
- Ural 1119 Metro(DP) .
- 计算字符个数——来自华为OJ平台测试基础篇
- 1.二分加速法(很容易遇到此类题)
- nyoj 164&&poj2084 Game of Connections 【卡特兰