当前位置:首页 » 编程语言 » pythongui编程

pythongui编程

发布时间: 2023-02-12 16:40:11

1. python gui是什么意思

PYTHON是一门编程语言啊,
图形用户界面(Graphical User Interface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。

只是说用python开发gui的程序很方便吧

2. Python GTK 3 GUI 编程 -- 005 容器#1 盒子(box)

默认的Gtk.Window是继承自Gtk.Bin的, 只能放置一个控件, 如果想要放置多个控件就需要容器container, 常用的容器有 盒子, 网格, 笔记本, 固定板 等, 下面的文章会慢慢讲解

首先, 来说盒子容器

self.box = Gtk.Box() 可以实例化一个盒子, 默认是水平盒子
垂直盒子可以 self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)

或者 self.box = Gtk.VBox()

Gtk.Box().pack_start(sub_widget, expand, fill, padding)
Gtk.Box().pack_end(sub_widget, expand, fill, padding)

第一个方法是从开始放置, 第二个从末尾
sub_widget 是被放置的控件
expand(bool) 是否分配额外的空间
fill (bool) 是否填充额外的空间, 当expand = False时, fill 无效
padding(int) 向外扩展的像素

例如

下篇文章讲grid 网格容器
欢迎大家留言

3. Python GUI库大汇总

所有程序都是基于命令行的,这些程序可能只有一些“专业”的计算机人士才会使用。例如前面编写的五子棋等程序,恐怕只有程序员自己才愿意玩这么“糟糕”的游戏,很少有最终用户愿意对着黑乎乎的命令行界面敲命令。
相反,如果为程序提供直观的图形用户界面(Graphics User Interface, GUI),最终用户通过拖动鼠标、单击等动作就可以操作整个应用,这样的应用程序就会很受政迎(实际上,Windows 之所以广为人知,其最初的吸引力就是来自它所提供的图形用户界面)。
作为一个程序设计者,必须优先考虑用户的感受,一定要让用户感到“爽”,程序才会被需要、被使用,这样的程序才有价值。
在真正开始介绍 Python 图形界面编程之前,首先简单介绍一下 Python 的图形用户界面库。
1) PyGObject
PyGObject 库为基于 GObject 的 C 函数库提供了内省绑定,这些库可以支持 GTK+3 图形界面工具集,因此时 GObject 提供了丰富的图形界面组件。
2) PyGTK
PyGTK 基于老版本的 GTK+2 的库提供绑定,借助于底层 GTK+2 所提供的各种可视化元素和组件,同样可以开发出在 GNOME 桌面系统上运行的软件,因此它主要适用于 Linux/UNIX 系统。PyGTK 对 GTK+2 的 C 语言进行了简单封装,提供了面向对象的编程接口。其官方网址是http://www.pygtk.org/。
3) PyQt
PyQt 是 Python 编程语言和 Qt 库的成功融合。Qt 本身是一个扩展的 C++ GUI 应用开发框架,Qt 可以在 UNIX、Windows 和 Mac OS X 上完美运行,因此 PyQt 是建立在 Qt 基础上的 Python 包装。所以 PyQt 也能跨平台使用。
4) PySide
PySide 是由 Nokia 提供的对 Qt 工具集的新的包装库,目前成熟度不如 PyQt。
5) wxPython
wxPython 是一个跨平台的 GUI 工具集,wxPython 以流行的 wxWidgets(原名 wxWindows)为基础,提供了良好的跨平台外观。简单来说,wxPython 在 Windows上调用 Windows 的本地组件、在 Mac OS 上调用 Mac OS X 的本地组件、在 Linux 上调用 Linux 的本地组件,这样可以让 GUI 程序在不同的平台上显示平台对应的风格。wxPython 是一个非常流行的跨平台的 GUI 库。
如果读者有需要,则完全可以选择上面这些 Python GUI 库来开发图形用户界面。如果考虑开发跨平台的图形用户界面,则推荐使用 PyQt 或 wsPython。

4. Python入门系列(十二)——GUI+多进程

话说,python做图形界面并不明智,效率并不高。但在某些特殊需求下还是需要我们去使用,所以python拥有多个第三方库用以实现GUI,本章我们使用python基本模块tkinter进行学习,因为需求并不大,所以不做太多拓展。
继续改写上一章的IP查询系统(= =,要玩烂了),首先略改下IpWhere.py以备调用~

然后使用tkinter模块进行图形界面的实现,调用预编译的IpWhere模块 :

额,太丑了,但基本实现我们小小的需求,在以后的py学习中,我们再涉及其他的第三方模块,此处就当是入门了解吧。

十分抱歉把这么重要的内容放在最后,要不是大佬指点,此次学习可能就要错过多进程的问题了。
Unix系统提供了forx,python可借助os模块调用,从而实现多进程,然而windows系统并不具备,所以我们选择python内置的multiprocessing多进程模块进行学习。

首先我们借助直接调用多进程来改写下我们在多线程章节用到的例子!

显然,这么写实在太蠢了,如果我们的任务量巨大,这并不合适。所以我们引入了进程池的概念,使用进程池进行改写:

在此,我们可以看到所有进程是并发执行的,同样,我们在多线程章节就讲过,主进程的结束意味着程序退出,所以我们需要借助join()方法堵塞进程。

我们知道线程共享内存空间,而进程的内存是独立的,同一个进程的线程之间可以直接交流,也就带来了线程同步的苦恼,这个我们在多线程章节已经讲过了;而两个进程想通信,则必须通过一个中间代理来实现,即我们接下来的内容:进程间通信。

进程之间肯定是需要通信的,操作系统提供了很多机制来实现进程间的通信。Python的multiprocessing模块包装了底层的机制,提供了Queue、Pipes等多种方式来交换数据。我们接下来就以Queue的方式进行学习。

Queue.Queue是进程内非阻塞队列,multiprocess.Queue是跨进程通信队列,前者是各自私有,后者是各子进程共有。

还有一个在后者基础上进行封装的multiprocess.Manager.Queue()方法,如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否则会得到一条如下的错误信息: RuntimeError: Queue objects should only be shared between processes through inheritance.

接下来我们就借助进程池来进行多进程操作的改写,感谢大佬一路辅导。

我们可以看到两个子线程先执行,然后一个子线程单独执行,此处有意而为之,让大家更清晰的了解队列的使用。期间有一处我们放弃使用jion()方法堵塞,而是自己写了个循环堵塞,大家根据自己习惯来就好。

话说,真的没人吐槽么?上面的例子从需求上来讲,完全就不需要多线程好不好!emmmm,我们来点实力拓展,写一个有智商的多线程脚本,顺便结合上一节的web来一个综合篇,随便找个现实需求吧!

emmm,比如我们来到当当网买书,搜一下我们想要的书籍,发现!!太多了!!真J2乱!!看不过来!!不想翻页!!直接告诉我哪个便宜、哪个牛逼好不好!!

简单看下这个url:
http://search.dangdang.com/?key=渗透测试&ddsale=1&page_index=2
其中ddsale参数代表当当自营,page_index代表页数,key代表搜索内容,我们本次的变量只有页数。

所以我们构造请求的url为:
'http://search.dangdang.com/?key=渗透测试&ddsale=1&page_index='+str(page)
如果修改的内容不使用str字符串转化,会收到如下报错:
TypeError: can only concatenate str (not "int") to str
然后我们看一下页面内容的分布情况,本次我们关心卖什么书,卖多少钱?

对应的编写我们的正则匹配规则,当然了,有更简便的第三方库可以帮我们处理,但为了更好的形成流程性认识,我们这里依然使用正则。
我们对应我们需要的书籍名称和当前价格匹配如下:
<a title=" (.*?)" ddclick=
<span class="search_now_price">¥(.*?)</span>
那么,思路理清了,我们就开始使用多线程来写我们的小系统~

然后我们去查看一下我们的结果文件~

现在这个小系统具备的功能就是根据用户需要选择要检索的书籍,然后整理下名称和价格,开了10个线程,如果小伙伴pc给力的话可以继续加。简单的异常处理机制和界面交互,基本满足日常所需。

5. Python 中用 Tkinter GUI编程

可以使用sqlite,下面是使用方法。

  1. 导入PythonSQLITE数据库模块

Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~

importsqlite3


2.创建/打开数据库


在调用connect函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。


cx=sqlite3.connect("E:/test.db")

也可以创建数据库在内存中。

con=sqlite3.connect(":memory:")

3.数据库连接对象


打开数据库时返回的对象cx就是一个数据库连接对象,它可以有以下操作:


commit()--事务提交


rollback()--事务回滚

close()--关闭一个数据库连接

cursor()--创建一个游标


关于commit(),如果isolation_level隔离级别默认,那么每次对数据库的操作,都需要使用该命令,你也可以设置isolation_level=None,这样就变为自动提交模式。

4.使用游标查询数据库


我们需要使用游标对象SQL语句查询数据库,获得查询对象。通过以下方法来定义一个游标。


cu=cx.cursor()

游标对象有以下的操作:

execute()--执行sql语句

executemany--执行多条sql语句

close()--关闭游标

fetchone()--从结果中取一条记录,并将游标指向下一条记录

fetchmany()--从结果中取多条记录

fetchall()--从结果中取出所有记录

scroll()--游标滚动


1.建表

cu.execute("createtablecatalog(idintegerprimarykey,pidinteger,namevarchar(10)UNIQUE,nicknametextNULL)")


上面语句创建了一个叫catalog的表,它有一个主键id,一个pid,和一个name,name是不可以重复的,以及一个nickname默认为NULL。


2.插入数据


请注意避免以下写法:


#Neverdothis--insecure会导致注入攻击


pid=200

c.execute("...wherepid='%s'"%pid)

正确的做法如下,如果t只是单个数值,也要采用t=(n,)的形式,因为元组是不可变的。

fortin[(0,10,'abc','Yu'),(1,20,'cba','Xu')]:

cx.execute("insertintocatalogvalues(?,?,?,?)",t)

简单的插入两行数据,不过需要提醒的是,只有提交了之后,才能生效.我们使用数据库连接对象cx来进行提交commit和回滚rollback操作.

cx.commit()


3.查询

cu.execute("select*fromcatalog")


要提取查询到的数据,使用游标的fetch函数,如:


In[10]:cu.fetchall()

Out[10]:[(0,10,u'abc',u'Yu'),(1,20,u'cba',u'Xu')]

如果我们使用cu.fetchone(),则首先返回列表中的第一项,再次使用,则返回第二项,依次下去.


4.修改

In[12]:cu.execute("updatecatalogsetname='Boy'whereid=0")

In[13]:cx.commit()

注意,修改数据以后提交


5.删除


cu.execute("deletefromcatalogwhereid=1")

cx.commit()


6.使用中文

请先确定你的IDE或者系统默认编码是utf-8,并且在中文前加上u


x=u'鱼'

cu.execute("updatecatalogsetname=?whereid=0",x)

cu.execute("select*fromcatalog")

cu.fetchall()

[(0,10,u'u9c7c',u'Yu'),(1,20,u'cba',u'Xu')]

如果要显示出中文字体,那需要依次打印出每个字符串


In[26]:foritemincu.fetchall():

....:forelementinitem:

....:printelement,

....:print

....:

010鱼Yu

120cbaXu


7.Row类型

Row提供了基于索引和基于名字大小写敏感的方式来访问列而几乎没有内存开销。原文如下:

sqlite3.Rowprovidesbothindex-basedandcase-insensitivename-.-basedapproachorevenadb_rowbasedsolution.

Row对象的详细介绍


classsqlite3.Row

_factoryforConnectionobjects..


,iteration,representation,equalitytestingandlen().


,theycompareequal.


Changedinversion2.6:Addediterationandequality(hashability).


keys()

.Immediatelyafteraquery,.description.


Newinversion2.6.


下面举例说明


In[30]:cx.row_factory=sqlite3.Row


In[31]:c=cx.cursor()


In[32]:c.execute('select*fromcatalog')

Out[32]:<sqlite3.Cursorobjectat0x05666680>


In[33]:r=c.fetchone()


In[34]:type(r)

Out[34]:<type'sqlite3.Row'>


In[35]:r

Out[35]:<sqlite3.Rowobjectat0x05348980>


In[36]:printr

(0,10,u'u9c7c',u'Yu')


In[37]:len(r)

Out[37]:4


In[39]:r[2]#使用索引查询

Out[39]:u'u9c7c'


In[41]:r.keys()

Out[41]:['id','pid','name','nickname']


In[42]:foreinr:

....:printe,

....:

010鱼Yu


使用列的关键词查询

In[43]:r['id']

Out[43]:0


In[44]:r['name']

Out[44]:u'u9c7c'

6. python的GUI设计用什么软件

pyqt还不错,它是Python语言的GUI编程解决方案之一。可以用来代替Python内置的Tkinter。其它替代者还有PyGTK、wxPython等

优点:
PyQt的API与Qt类似,Qt的文档通常仍然可以应用于PyQt。因此,PyQt的文档比PyGTK、wxPython、Tkinter等GUI编程库的文档丰富得多。
如果程序员具备使用Qt的经验,一般很快就可以过渡到PyQt上。而使用PyQt的程序员,如果同时精通C++的话,也可以很快地过渡到Qt平台上。
利用SIP,大多数为Qt开发的控件可以方便地port到PyQt。——然而,SIP也需要一些学习成本。
有方便的周边工具支持PyQt。如QtDesigner,可以使用拖拉式的方法来设计界面,简单易用。Eric4,一个使用PyQt设计的Python IDE,对PyQt有特殊的支持。

缺点:
由于PyQt同时使用Qt以及Python的两种内存管理方法,所以在使用PyQt的过程中要注意避免内存泄露以及悬挂指针[4]。
运行时庞大,在Windows平台,只使用PyQt.QtCore与PyQt.QtGui两个子模块时,压缩后至少需要4.09M
需要学习一些C++知识,主要是C++类型、内存管理两个方面,以便于阅读Qt文档和理解PyQt的行为

热点内容
python对齐打印 发布:2024-11-09 01:46:07 浏览:174
编译vbox61 发布:2024-11-09 01:42:12 浏览:915
超声波存储环境 发布:2024-11-09 01:41:33 浏览:284
国外访问学者研修计划 发布:2024-11-09 01:36:38 浏览:384
如何上传动态头像 发布:2024-11-09 01:33:52 浏览:935
怎么购买云存储空间 发布:2024-11-09 01:23:37 浏览:782
如何把安卓机上的图片备份 发布:2024-11-09 00:49:58 浏览:263
android分享微信 发布:2024-11-09 00:49:14 浏览:977
数列极限运算法则 发布:2024-11-09 00:48:37 浏览:896
k线公式源码 发布:2024-11-09 00:35:24 浏览:785