PyQt4 模拟记事本基本功能(保存,打开文件)

完成功能:
1. 默认【保存】按钮enable
2. 修改文本的内容后,【enable】
3. 解决字符乱码问题:utf-8
4. 提示:如果修改了文件没有保存的时候,又尝试打开新的文件,给出相关的提示信息
操作步骤:
1. 在Designer中设计,生产**.ui文件
2. 切换到.ui文件所在目录,运行如下命令,生成.py文件
pyuic4 **.ui > **.py
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui
from edytor import Ui_notepad
from os.path import isfile
import codecs class StartQt4(QtGui.QMainWindow):
def __init__(self, parent=None, flags=0):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_notepad()
self.ui.setupUi(self)
''' click点击 button_open 执行file_dialog'''
QtCore.QObject.connect(self.ui.button_open, QtCore.SIGNAL("clicked()"), self.file_dialog)
''' click点击 button_save 执行file_save保存'''
QtCore.QObject.connect(self.ui.button_save, QtCore.SIGNAL("clicked()"), self.file_save)
''' editor_window的内容发送改变时,执行enable_save函数,enable = true'''
QtCore.QObject.connect(self.ui.editor_window, QtCore.SIGNAL("textChanged()"),self.enable_save ) def file_dialog(self):
response = False
# buttton texts
SAVE = 'Save'
DISCARD = 'Discard'
CANCEL = 'Cancel' # if we have changes then ask about them
if self.ui.button_save.isEnabled() and self.filename:
message = QtGui.QMessageBox(self)
message.setText('What to do about unsaved changes ?')
message.setWindowTitle('Notpad')
message.setIcon(QtGui.QMessageBox.Question)
message.addButton(SAVE, QtGui.QMessageBox.AcceptRole)
message.addButton(DISCARD, QtGui.QMessageBox.DestructiveRole)
message.addButton(CANCEL, QtGui.QMessageBox.RejectRole)
message.setDetailedText('Unsaved changes in file: '+ str(self.filename))
message.exec_()
response = message.clickedButton().text() # save file
if response == SAVE:
self.file_save()
self.ui.button_save.setEnabled(False) # descard changes
elif response == DISCARD:
self.ui.button_save.setEnabled(False) # if we didn't cancelled show the file dialogue if response != CANCEL:
''' 使用QFileDialog来选择文件'''
fd = QtGui.QFileDialog(self)
''' 使用getOpenFileName()弹出一个文件选择框
fd.getOpenFileName()用于返回我们选择文件的名字。如果没有选择文件的话,会得打一个空的文件名
'''
self.filename = fd.getOpenFileName()
if isfile(self.filename):
text = codecs.open(self.filename, 'r', 'utf-8').read()
self.ui.editor_window.setPlainText(text)
self.ui.button_save.setEnabled(False)
'''文本没有被保存的时候,显示提示消息 —— 通过save是否被禁用得到文本是否被保存''' def file_save(self):
if isfile(self.filename):
file = codecs.open(self.filename, 'w', 'utf-8')
file.write(unicode(self.ui.editor_window.toPlainText()))
file.close()
self.ui.button_save.setEnabled(False) def enable_save(self):
self.ui.button_save.setEnabled(True) if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = StartQt4()
myapp.show()
sys.exit(app.exec_())
PyQt4 模拟记事本基本功能(保存,打开文件)的更多相关文章
- python2.7+pyqt4实现记事本基本功能
记事本程序: # coding:utf-8 import sys from PyQt4.QtGui import QMainWindow from PyQt4.QtGui import QApplic ...
- Xftp设置指定记事本(notepad++)打开文件
右键
- Linux内核分析:打开文件描述符实现
在Linux中每一个进程的数据是存储在一个task_struct结构(定义在sched.h中)中的. struct task_struct { volatile long state; /* -1 u ...
- WebBrowser自动填充打开文件对话框
WebBrowser自动填充打开文件对话框 在使用WebBrowser编写自动表单填写软件的时候,不知道大家是否遇到国填写文件选择表单的情况.遇到这种情况的时候,无法直接队Html元素赋值,必须模 ...
- linux 文件描述符表 打开文件表 inode vnode
在Linux中,进程是通过文件描述符(file descriptors,简称fd)而不是文件名来访问文件的,文件描述符实际上是一个整数.Linux中规定每个进程能最多能同时使用NR_OPEN个文件 ...
- C#打开文件
C#中经常用到的功能,打开文件: /// <summary> /// 打开文件,可选择多个文件 /// </summary> /// <param name=" ...
- 用汇编语言给XP记事本添加“自动保存”功能 good
[文章标题]: 用汇编语言给XP记事本添加“自动保存”功能 [文章作者]: newjueqi [作者邮箱]:zengjiansheng1@126.com [作者QQ]:190678908 [使用工具] ...
- java中文件保存、打开文件对话框
package com.soft.test; //AWT: FileDialog类 + FilenameFilter类 可以实现本功能 //Swing: JFileChooser类 + FileFil ...
- CFileDialog 打开文件夹文件 保存文件夹文件
格式说明: explicit CFileDialog( BOOL bOpenFileDialog, //TRUE 为打开, FALSE 为保存 L ...
随机推荐
- linux_Mysql导入数据基本操作
创建数据库:Databases 数据库名字;导入数据: mysql -uroot -proot use 数据库名字 source < sql文件名.sql
- Lucene41PostingWriter源代码分析
原来看lucene4.0的posting格式(http://blog.csdn.net/jollyjumper/article/details/30017581),发现这还是比較简单的VInt格式,据 ...
- 解决Unable to find setter method for attribute: [commandName]
最近学习springmvc的表单标签库,其中form标签主要用于渲染HTML表单,而form标签有很多属性,可供选择,其中一般来说(以前)最重要的是commandName属性,因为它定义了模型属性的名 ...
- 关于signal和fork的思考
fork可以在linux中创建子进程.先看man手册里面的东西: SYNOPSIS #include <unistd.h> pid_t fork(void);DES ...
- 【转载】解决refreshing gradle project 和Building gradle project info 一直卡住\速度慢
转载: http://blog.csdn.net/xx326664162/article/details/52002616 文章出自:薛瑄的博客 分析原因: 更改Gradle的版本后,或者更新AS后, ...
- Lvs+keepAlived实现负载均衡高可用集群(DR实现)
第1章 LVS 简介 1.1 LVS介绍 LVS是Linux Virtual Server的简写,意为Linux虚拟服务器,是虚拟的服务器集群系统,可在UNIX/LINUX平台下实现负载均衡集群功能. ...
- 从初识Maven到使用Maven进行依赖管理和项目构建
前些天就安装了Maven,以备自己以后整合项目用,尤其是我们的ssh,ssm项目.想必好多人在开始的时候并不清楚Maven是什么,它能够帮助我们干什么. 所以在学习Maven之前我们一定要知道它是什么 ...
- android中的五大布局(控件的容器,可以放button等控件)
一.android中五大布局相当于是容器,这些容器里可以放控件也可以放另一个容器,子控件和布局都需要制定属性. 1.相对布局:RelativeLayout @1控件默认堆叠排列,需要制定控件的相对位置 ...
- geoserver发布地图服务WMS
wms服务发布: 1.打开geoserver管理首页(网址为http://localhost:8080/geoserver/web/),并使用安装时设置的帐户名和密码登录(这里是admin/geose ...
- Java8函数之旅 (五) -- Java8中的排序
前言 对数据进行排序是平常经常会用到的操作之一,使用Jav8排序可以减少你在排序这方面的代码量,优化你的代码. 测试用例代码 定义个实体类User,拥有姓名name,年龄age,积分credit ...