精华内容
下载资源
问答
  • python gui界面实例_python爬取电影数据(含GUI界面版)
  • 简单的说,GUI编程就是给程序加上图形化界面.python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱.如果给程序加一个图形化界面,那么普通的用户也就能用上...

    2019071910554134.png

    简单的说,GUI编程就是给程序加上图形化界面.

    python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱.

    如果给程序加一个图形化界面,那么普通的用户也就能用上python的脚本,极大提升工作效率,所以给python程序加上图形化界面,把自己写的脚本,提供给普通用户,的确是一件激动人心的事!

    如何给python脚本加图形化界面?

    作者首先考虑了通过浏览器运行python的图形化界面,为了理想的效果,python需要借助javascript实现一些功能,而且python需要额外安装pyv8模块,我折腾了一下,发现pyv8模块安装很麻烦,而且依赖的库很多,编译安装也根据不同的操作系统,存在各种坑,pyv8不适合普通用户,于是就暂时搁置了pyv8模块.

    2019071910554235.png

    软件界面

    随后我又比较了pyqt5与tkinter两个模块: pyqt5功能很强,界面也漂亮,但语法比较复杂,pyqt5模块需要单独安装,不适合新手入门;

    tkinter是python3自带的模块,能满足基本的功能需求,语法也简单,基本上5分钟就能上手,所以最终选择了tkinter.

    网上当前的python GUI教程存在的问题:

    1.功能太简单,基本功能就是"花式"显示"Hello World";

    2.注释不明了,复制粘贴别人写的博客代码,代码残缺

    3.版本老旧,都是针对python2.7的程序,导入方式如 import Tkinter ,python3应为 import tkinter

    这次作者选择了一个 "根据ip地址定位地理位置"的脚本,作为本次教程的素材,比较好玩,也比较容易实现:

    解释的内容都放到了注释里,上代码:

    import tkinter

    import pygeoip

    class FindLocation(object):

    def __init__(self):

    self.gi = pygeoip.GeoIP("./GeoLiteCity.dat")

    # 创建主窗口,用于容纳其它组件

    self.root = tkinter.Tk()

    # 给主窗口设置标题内容

    self.root.title("全球定位ip位置(离线版)")

    # 创建一个输入框,并设置尺寸

    self.ip_input = tkinter.Entry(self.root,width=30)

    # 创建一个回显列表

    self.display_info = tkinter.Listbox(self.root, width=50)

    # 创建一个查询结果的按钮

    self.result_button = tkinter.Button(self.root, command = self.find_position, text = "查询")

    # 完成布局

    def gui_arrang(self):

    self.ip_input.pack()

    self.display_info.pack()

    self.result_button.pack()

    # 根据ip查找地理位置

    def find_position(self):

    # 获取输入信息

    self.ip_addr = self.ip_input.get()

    aim = self.gi.record_by_name(self.ip_addr)

    # 为了避免非法值,导致程序崩溃,有兴趣可以用正则写一下具体的规则,我为了便于新手理解,减少代码量,就直接粗放的过滤了

    try:

    # 获取目标城市

    city = aim["city"]

    # 获取目标国家

    country = aim["country_name"]

    # 获取目标地区

    region_code = aim["region_code"]

    # 获取目标经度

    longitude = aim["longitude"]

    # 获取目标纬度

    latitude = aim["latitude"]

    except:

    pass

    # 创建临时列表

    the_ip_info = ["所在纬度:"+str(latitude),"所在经度:"+str(longitude),"地域代号:"+str(region_code),"所在城市:"+str(city), "所在国家或地区:"+str(country), "需要查询的ip:"+str(self.ip_addr)]

    #清空回显列表可见部分,类似clear命令

    for item in range(10):

    self.display_info.insert(0,"")

    # 为回显列表赋值

    for item in the_ip_info:

    self.display_info.insert(0,item)

    # 这里的返回值,没啥用,就是为了好看

    return the_ip_info

    def main():

    # 初始化对象

    FL = FindLocation()

    # 进行布局

    FL.gui_arrang()

    # 主程序执行

    tkinter.mainloop()

    pass

    if __name__ == "__main__":

    main()

    运行效果(为了更好的演示效果,使用了gif图,图片尺寸较大,建议在wifi环境下观看,土豪随意~):

    2019071910554336.gif

    一张很有尺寸的演示图!

    由于离线查询ip需要全球IP的分布数据,所以我直接选择了一个免费离线查询ip的数据包,为了读取这个包的数据还需要安装一个模块: pip install pygeoip ,极少数人的当年安装python3的时候,选了不含tkinter的python3安装包,为了学习,还是要把这个模块补上: pip install tkinter

    如果想将示例程序转为windows下的可执行文件(.exe),参考这篇

    教程涉及到的资源我都通过百度网盘分享给大家,为了便于大家的下载,资源整合到了一张独立的帖子里,链接如下:

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 本文实例讲述了Python GUI编程。分享给大家供大家参考,具体如下:import osfrom time import sleepfrom tkinter import *from tkinter.messagebox import showinfoclass DirList(object):def __init__(self, ...

    本文实例讲述了Python GUI编程。分享给大家供大家参考,具体如下:

    import os

    from time import sleep

    from tkinter import *

    from tkinter.messagebox import showinfo

    class DirList(object):

    def __init__(self, initdir=None):

    self.top = Tk()

    self.label = Label(master=self.top, text='Directory Lister V1.0')

    self.label.pack()

    self.cwd = StringVar(master=self.top)

    self.dirl = Label(self.top, fg='blue', font=('Helvetica', 14, 'bold'))

    self.dirl.pack()

    self.dirfm = Frame(master=self.top)

    self.dirsb = Scrollbar(master=self.dirfm)

    self.dirsb.pack(side=RIGHT,fill=Y)    # fill=Y,垂直填充空间排列

    self.dirs = Listbox(master=self.dirfm, height=15, width=50, yscrollcommand=self.dirsb.set)

    self.dirs.bind('', func=self.setDirAndGo)   # ,双击显示路径列表

    self.dirsb.config(command=self.dirs.yview)

    self.dirs.pack(side=LEFT, fill=BOTH)

    self.dirfm.pack()

    self.dirn = Entry(master=self.top, width=50, textvariable=self.cwd)

    self.dirn.bind('', func=self.doLS)

    self.dirn.pack()

    self.bfm = Frame(master=self.top)

    self.cleer = Button(master=self.bfm, text='清除', command=self.clrDir, activeforeground='white',

    activebackground='blue')

    self.ls = Button(master=self.bfm, text='显示列表', command=self.doLS, activeforeground='white',

    activebackground='green')

    self.quit = Button(master=self.bfm, text='退出', command=self.top.quit, activeforeground='white',

    activebackground='red')

    self.cleer.pack(side=LEFT)

    self.ls.pack(side=LEFT)

    self.quit.pack(side=LEFT)

    self.bfm.pack()

    if initdir:

    self.cwd.set(os.curdir)

    self.doLS()

    def setDirAndGo(self, ev=None):

    self.last = self.cwd.get()

    self.dirs.config(selectbackground='red')

    chek = self.dirs.get(self.dirs.curselection())

    if not chek:

    chek = os.curdir

    self.cwd.set(chek)

    self.doLS()

    def doLS(self, ev=None):

    error = ''

    tdir = self.cwd.get()

    if not tdir:

    tdir = os.curdir

    if not os.path.exists(tdir):

    error = tdir + ':未找到文件,请检查路径!'

    elif not os.path.isdir(tdir):

    error = tdir + ':不是一个路径!'

    if error:

    # self.cwd.set(error)

    showinfo(title='提示',message=error)

    self.top.update()

    # sleep(2)

    if not (hasattr(self, 'last') and self.last):

    self.last = os.curdir

    self.cwd.set(self.last)

    self.dirs.config(selectbackground='LightSkyBlue')

    self.top.update()

    return

    if not os.path.isdir(tdir):

    self.cwd.set('')

    else:

    self.cwd.set('获取目录内容中...')

    self.top.update()

    dirlist = os.listdir(tdir)

    dirlist.sort()

    os.chdir(tdir)

    self.dirl.config(text=os.getcwd())

    self.dirs.delete(0, END)

    self.dirs.insert(END, os.curdir)

    self.dirs.insert(END, os.pardir)

    for eachfile in dirlist:

    self.dirs.insert(END, eachfile)

    self.cwd.set(os.curdir)

    self.dirs.config(selectbackground='LightSkyBlue')

    def clrDir(self, ev=None):

    self.cwd.set('')

    if __name__ == '__main__':

    dir = DirList(os.curdir)

    mainloop()

    效果如下:

    201944104108704.png?20193410422

    希望本文所述对大家Python程序设计有所帮助。

    展开全文
  • python3.6.5这里我选择的GUI编程包是:tkintertkinker在python2.5以后就是自带包了,所以我们不需要另外安装tkinker相对与其他python GUI编程的包而已,是相对容易入手的代码篇:#这是系统的登录界面import tkinter...

    导言篇:

    我的python环境是:python3.6.5

    这里我选择的GUI编程包是:tkinter

    tkinker在python2.5以后就是自带包了,所以我们不需要另外安装

    tkinker相对与其他python GUI编程的包而已,是相对容易入手的

    代码篇:

    #这是系统的登录界面

    import tkinter

    from tkinter import messagebox

    class Login(object):

    def __init__(self):

    # 创建主窗口,用于容纳其它组件

    self.root = tkinter.Tk()

    # 给主窗口设置标题内容

    self.root.title("影视资源管理系统(离线版)")

    self.root.geometry('450x300')

    #运行代码时记得添加一个gif图片文件,不然是会出错的

    self.canvas = tkinter.Canvas(self.root, height=200, width=500)#创建画布

    self.image_file = tkinter.PhotoImage(file='welcome_1.gif')#加载图片文件

    self.image = self.canvas.create_image(0,0, anchor='nw', image=self.image_file)#将图片置于画布上

    self.canvas.pack(side='top')#放置画布(为上端)

    #创建一个`label`名为`Account: `

    self.label_account = tkinter.Label(self.root, text='Account: ')

    #创建一个`label`名为`Password: `

    self.label_password = tkinter.Label(self.root, text='Password: ')

    # 创建一个账号输入框,并设置尺寸

    self.input_account = tkinter.Entry(self.root, width=30)

    # 创建一个密码输入框,并设置尺寸

    self.input_password = tkinter.Entry(self.root, show='*', width=30)

    # 创建一个登录系统的按钮

    self.login_button = tkinter.Button(self.root, command = self.backstage_interface, text = "Login", width=10)

    # 创建一个注册系统的按钮

    self.siginUp_button = tkinter.Button(self.root, command = self.siginUp_interface, text = "Sign up", width=10)

    # 完成布局

    def gui_arrang(self):

    self.label_account.place(x=60, y= 170)

    self.label_password.place(x=60, y= 195)

    self.input_account.place(x=135, y=170)

    self.input_password.place(x=135, y=195)

    self.login_button.place(x=140, y=235)

    self.siginUp_button.place(x=240, y=235)

    # 进入注册界面

    def siginUp_interface(self):

    # self.root.destroy()

    tkinter.messagebox.showinfo(title='影视资源管理系统', message='进入注册界面')

    # 进行登录信息验证

    def backstage_interface(self):

    account = self.input_account.get().ljust(10," ")

    password = self.input_password.get().ljust(10," ")

    #对账户信息进行验证,普通用户返回user,管理员返回master,账户错误返回noAccount,密码错误返回noPassword

    verifyResult = verifyAccount.verifyAccountData(account,password)

    if verifyResult=='master':

    self.root.destroy()

    tkinter.messagebox.showinfo(title='影视资源管理系统', message='进入管理界面')

    elif verifyResult=='user':

    self.root.destroy()

    tkinter.messagebox.showinfo(title='影视资源管理系统', message='进入用户界面')

    elif verifyResult=='noAccount':

    tkinter.messagebox.showinfo(title='影视资源管理系统', message='该账号不存在请重新输入!')

    elif verifyResult=='noPassword':

    tkinter.messagebox.showinfo(title='影视资源管理系统', message='账号/密码错误请重新输入!')

    def main():

    # 初始化对象

    L = Login()

    # 进行布局

    L.gui_arrang()

    # 主程序执行

    tkinter.mainloop()

    if __name__ == '__main__':

    main()

    效果篇:

    语法介绍:环境配置:

    Python3.6.5,前往官网下载

    tkinker包:Python2.5之后,tkinker包是自带的,我们直接导入就好了

    基本语法:

    self.root = tkinter.Tk()

    创建一个窗口对象root,root前面的self.是面向对象里面的内容,不明白的童鞋可以去Google一下面向对象

    self.root.title("影视资源管理系统(离线版)")

    self.root.geometry('450x300')

    给窗口root设置标题,并设置窗口

    self.canvas = tkinter.Canvas(self.root, height=200, width=500)#创建画布

    self.image_file = tkinter.PhotoImage(file='welcome_1.gif')#加载图片文件

    self.image = self.canvas.create_image(0,0, anchor='nw', image=self.image_file)#将图片置于画布上

    self.canvas.pack(side='top')#放置画布(为上端)

    如果我们需要让自己的界面在美观上加分,大可以试试创建一个画布,也就是下面这个东西

    我这里是先对图片背景进行了透明化处理,需要的小伙伴可以去

    #创建一个`label`名为`Account: `

    self.label_account = tkinter.Label(self.root, text='Account: ')

    #创建一个`label`名为`Password: `

    self.label_password = tkinter.Label(self.root, text='Password: ')

    这里创建的是一个label,label是什么不明白可以参考上面贴图的"Account:”与"Password:”

    .Label(A, B):参数A代表Lable依赖窗口,参数B即用户可见的Lable的名字了(text="LableName")

    .Button(A, B, text='', [width='', height='']):参数A是按钮依赖的窗口主体,参数B是按钮的相应事件(command = self.siginUp_interface)这里的响应事件的进行注册/登录进入后台,command后接响应函数。

    .Entry(A):输入框,参照前面的.Label(),有疑问的可以在下方留言

    .place(x="", y=""):这个是设置窗口部件的函数

    额。。。。登录界面就介绍到这里了,后面我会继续更新登录界面的响应机制,有不明的地方可以在下方留言,我看到会回复的

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 一、项目说明:本次通过实现一个小的功能模块对Python GUI进行实践学习。项目来源于软件制造工程的作业。记录在这里以复习下思路和总结编码过程。所有的源代码和文件放在这里:链接: ...

    一、项目说明:

    本次通过实现一个小的功能模块对Python GUI进行实践学习。项目来源于软件制造工程的作业。记录在这里以复习下思路和总结编码过程。所有的源代码和文件放在这里:

    链接: https://pan.baidu.com/s/1qXGVRB2 密码: 4a4r

    内置四个文件,分别是ora.sql, dataBaseOpr.py, guiPy.py, test.py

    二、效果预览:

    828214-20171007083032318-501050226.png

    主界面

    828214-20171007083211021-1022688715.png

    新增界面(更新界面一致)

    功能很简单,就是做一张表的增删改查,借此简单的熟悉下python,前几天才看了看相关的语法。

    三、环境说明:

    数据库采用oracle12c,使用命令行进行操作。Python版本为3.6.2,命令行+Pycharm社区版2017.1.4。Python库使用了

    cx_Oracle: 连接oracle数据库

    tkinter: 简单入门的GUI库

    cx_Oracle库的安装我直接使用IDE自带的包管理进行下载安装的,tkinter是Python3.2以后自带的标准库,后面会讲。

    四、编码过程实现:

    1、数据库表实现(ora.sql):

    828214-20171007084646724-565141838.png

    conn username/pass 根据本机的用户名和密码修改,后面的数据库连接统一都用我自己密码,不再赘述。

    828214-20171007084938818-323644796.png

    828214-20171007084909036-1204279914.png

    为了简化Python代码和实践sql能力,写了两个简单的存储过程,分别是插入和更新,成功创建后只需调用存储过程和传递参数列表即可。代码详情在ora.sql中。

    代码折叠:

    ContractedBlock.gif

    ExpandedBlockStart.gif

    1 conn c##bai/bai1232 --建表

    3 create or replace tablegroupinfo (4 no varchar(12) not null,5 name varchar(20),6 headername varchar(20),7 tel varchar(15),8 constraint pk_groupinfo primary key(no));9

    10 --创建过程,直接传入参数即可插入

    11 create or replace procedureinsert_groupinfo12 (no groupinfo.no%type,13 name groupinfo.name%type,14 headername groupinfo.headername%type,15 tel groupinfo.tel%type16 )17 is

    18 begin

    19 insert into groupinfo values(no,name,headername,tel);20 commit;21 end;22

    23 --创建过程,直接传入参数即可完成更新,第一个字段为原纪录no。必须有。

    24 create or replace procedureupdate_groupinfo25 (oldno groupinfo.no%type,26 no groupinfo.no%type,27 name groupinfo.name%type,28 headername groupinfo.headername%type,29 tel groupinfo.tel%type30 )31 is

    32 n_no groupinfo.no%type;33 n_name groupinfo.name%type;34 n_headername groupinfo.headername%type;35 n_tel groupinfo.tel%type;36 grow groupinfo%rowtype;37 ex_oldnoisnull exception;38 begin

    39 select * into grow from groupinfo g where g.no=oldno;40 if oldno is null or grow.no is null then

    41 raise ex_oldnoisnull;42 end if;43 if no is null then

    44 n_no:=oldno;45 else

    46 n_no:=no;47 end if;48 if name is null then

    49 n_name:=grow.name;50 else

    51 n_name:=name;52 end if;53 if headername is null then

    54 n_headername:=grow.headername;55 else

    56 n_headername:=headername;57 end if;58 if tel is null then

    59 n_tel:=grow.tel;60 else

    61 n_tel:=tel;62 end if;63 --dbms_output.put_line(n_no||n_name||n_headername||n_tel);

    64 update groupinfo g set g.no = n_no, g.name = n_name, g.headername = n_headername, g.tel = n_tel where g.no =oldno;65 commit;66 exception67 when ex_oldnoisnull then

    68 dbms_output.out_line('选择的行不存在')69 end;

    ora.sql

    2、数据库操作类(dataBaseOpr.py):

    先贴源码,折叠起来:

    ContractedBlock.gif

    ExpandedBlockStart.gif

    1 #!/usr/bin/env python

    2 #encoding: utf-8

    3 """

    4 :author: xiaoxiaobai5

    6 :contact: 865816863@qq.com7

    8 :file: dataBaseOpr.py9

    10 :time: 2017/10/3 12:0411

    12 :@Software: PyCharm Community Edition13

    14 :desc: 连接oracle数据库,并封装了增删改查全部操作。15

    16 """

    17 importcx_Oracle18

    19

    20 classOracleOpr:21

    22 def __init__(self, username='c##bai', passname='bai123', ip='localhost', datebasename='orcl', ipport='1521'):23 """

    24 :param username: 连接数据库的用户名25 :param passname: 连接数据库的密码26 :param ip: 数据库ip27 :param datebasename:数据库名28 :param ipport: 数据库端口29 :desc: 初始化函数用于完成数据库连接,可以通过self.connStatus判断是否连接成功,成功则参数为0,不成功则返回错误详情30 """

    31 try:32 self.connStatus = '未连接' #连接状态

    33 self.queryStatus = 0 #查询状态

    34 self.updateStatus = 0 #更新状态

    35 self.deleteStatus = 0 #删除状态

    36 self.insertStatus = 0 #插入状态

    37 self.__conn = ''

    38 self.__conStr = username+'/'+passname+'@'+ip+':'+ipport+'/'+datebasename39 self.__conn = cx_Oracle.connect(self.__conStr)40 self.connStatus =041 exceptcx_Oracle.Error as e:42 self.connStatus =e43

    44 defcloseconnection(self):45 try:46 if self.__conn:47 self.__conn.close()48 self.connStatus = '连接已断开'

    49 exceptcx_Oracle.Error as e:50 self.connStatus =e51

    52 def query(self, table='groupinfo', queryby=''):53 """

    54 :param table: 查询表名55 :param queryby: 查询条件,支持完整where, order by, group by 字句56 :return:返回数据集,列名57 """

    58 self.queryStatus =059 result = ''

    60 cursor = ''

    61 title = ''

    62 try:63 sql = 'select * from'+table+' '+queryby64 print(sql)65 cursor = self.__conn.cursor()66 cursor.execute(sql)67 result =cursor.fetchall()68 title = [i[0] for i incursor.description]69 cursor.close()70 cursor = ''

    71 exceptcx_Oracle.Error as e:72 self.queryStatus =e73 finally:74 ifcursor:75 cursor.close()76 returnresult, title77

    78 def insert(self, proc='insert_groupinfo', insertlist=[]):79 """

    80 :param proc: 过程名81 :param insertlist: 参数集合,主键不能为空,参数必须与列对应,数量一致82 :desc: 此方法通过调用过程完成插入,需要在sql上完成存储过程,可以通过insertstatus的值判断是否成功83 """

    84 self.insertStatus =085 cursor = ''

    86 try:87 cursor = self.__conn.cursor()88 cursor.callproc(proc, insertlist)89 cursor.close()90 cursor = ''

    91 exceptcx_Oracle.Error as e:92 self.insertStatus =e93 finally:94 ifcursor:95 cursor.close()96

    97 def update(self, proc='update_groupinfo', updatelist=[]):98 """

    99 :param proc: 存储过程名100 :param updatelist: 更新的集合,第一个为查询主键,后面的参数为对应的列,可以更新主键。101 :desc: 此方法通过调用存储过程完成更新操作,可以通过updatestatus的值判断是否成功102 """

    103 self.updateStatus =0104 cursor = ''

    105 try:106 cursor = self.__conn.cursor()107 cursor.callproc(proc, updatelist)108 cursor.close()109 cursor = ''

    110 exceptcx_Oracle.Error as e:111 self.updateStatus =e112 finally:113 ifcursor:114 cursor.close()115

    116 def delete(self, deleteby: '删除条件,where关键词后面的内容,即列名=列值(可多个组合)', table='groupinfo'):117 """

    118 :param deleteby: 删除的条件,除where关键字以外的内容119 :param table: 要删除的表名120 :desc:可以通过deletestatus判断是否成功删除121 """

    122 self.deleteStatus =0123 cursor = ''

    124 try:125 sql = 'delete' + table + 'where' +deleteby126 cursor = self.__conn.cursor()127 cursor.execute(sql)128 cursor.close()129 cursor = ''

    130 exceptcx_Oracle.Error as e:131 self.deleteStatus =e132 finally:133 ifcursor:134 cursor.close()

    dataBaseOpr.py

    源码注释基本很清晰了,对关键点进行说明:数据库连接的数据全部用默认参数的形式给出了,可根据实际情况进行移植。关于调用存储过程,只需要使用connect(**).cursor.callproc(存储过程名, 参数列表)即可,方便高效。

    3、GUI界面搭建(tkinter):

    因为界面和逻辑我都写在guiPy.py中的,没有使用特别的设计模式。所以这一部分主要讲tkinter的用法,下一部分说明具体的实现。

    关于安装:Python3.2后自带本库,若引用没有,很可能是安装的时候没有选。解决方案嘛找到安装文件修改安装

    loading.gif即可,如下图:

    828214-20171007091735896-2077764038.png

    828214-20171007091802005-412817258.png

    下一步打上勾即可,完成安装就能引用tkinter了。

    使用教程简单介绍:

    我这次用的时候就是在网上随便搜了一下教程,发现内容都很浅显,而且不系统,当然我也没法系统的讲清楚,但官方文档可以啊,提醒自己,以后一定先看官方文档!

    http://effbot.org/tkinterbook/tkinter-index.htm

    4、逻辑实现(guiPy.py):

    先上代码,基本注释都有:

    ContractedBlock.gif

    ExpandedBlockStart.gif

    1 #!/usr/bin/env python

    2 #encoding: utf-8

    3 """

    4 :author: xiaoxiaobai5

    6 :contact: 865816863@qq.com7

    8 :file: guiPy.py9

    10 :time: 2017/10/3 19:4211

    12 :@Software: PyCharm Community Edition13

    14 :desc: 该文件完成了主要窗体设计,和数据获取,呈现等操作。调用时,运行主类MainWindow即可15

    16 """

    17 importtkinter as tk18 from tkinter importttk19 from dataBaseOpr import *

    20 importtkinter.messagebox21

    22

    23 classMainWindow(tk.Tk):24 def __init__(self):25 super().__init__()26

    27 #变量定义

    28 self.opr =OracleOpr()29 self.list =self.init_data()30 self.item_selection = ''

    31 self.data =[]32

    33 #定义区域,把全局分为上中下三部分

    34 self.frame_top = tk.Frame(width=600, height=90)35 self.frame_center = tk.Frame(width=600, height=180)36 self.frame_bottom = tk.Frame(width=600, height=90)37

    38 #定义上部分区域

    39 self.lb_tip = tk.Label(self.frame_top, text="评议小组名称")40 self.string =tk.StringVar()41 self.string.set('')42 self.ent_find_name = tk.Entry(self.frame_top, textvariable=self.string)43 self.btn_query = tk.Button(self.frame_top, text="查询", command=self.query)44 self.lb_tip.grid(row=0, column=0, padx=15, pady=30)45 self.ent_find_name.grid(row=0, column=1, padx=45, pady=30)46 self.btn_query.grid(row=0, column=2, padx=45, pady=30)47

    48 #定义下部分区域

    49 self.btn_delete = tk.Button(self.frame_bottom, text="删除", command=self.delete)50 self.btn_update = tk.Button(self.frame_bottom, text="修改", command=self.update)51 self.btn_add = tk.Button(self.frame_bottom, text="添加", command=self.add)52 self.btn_delete.grid(row=0, column=0, padx=20, pady=30)53 self.btn_update.grid(row=0, column=1, padx=120, pady=30)54 self.btn_add.grid(row=0, column=2, padx=30, pady=30)55

    56 #定义中心列表区域

    57 self.tree = ttk.Treeview(self.frame_center, show="headings", height=8, columns=("a", "b", "c", "d"))58 self.vbar = ttk.Scrollbar(self.frame_center, orient=tk.VERTICAL, command=self.tree.yview)59 #定义树形结构与滚动条

    60 self.tree.configure(yscrollcommand=self.vbar.set)61 #表格的标题

    62 self.tree.column("a", width=80, anchor="center")63 self.tree.column("b", width=120, anchor="center")64 self.tree.column("c", width=120, anchor="center")65 self.tree.column("d", width=120, anchor="center")66 self.tree.heading("a", text="小组编号")67 self.tree.heading("b", text="小组名称")68 self.tree.heading("c", text="负责人")69 self.tree.heading("d", text="联系方式")70 #调用方法获取表格内容插入及树基本属性设置

    71 self.tree["selectmode"] = "browse"

    72 self.get_tree()73 self.tree.grid(row=0, column=0, sticky=tk.NSEW, ipadx=10)74 self.vbar.grid(row=0, column=1, sticky=tk.NS)75

    76 #定义整体区域

    77 self.frame_top.grid(row=0, column=0, padx=60)78 self.frame_center.grid(row=1, column=0, padx=60, ipady=1)79 self.frame_bottom.grid(row=2, column=0, padx=60)80 self.frame_top.grid_propagate(0)81 self.frame_center.grid_propagate(0)82 self.frame_bottom.grid_propagate(0)83

    84 #窗体设置

    85 self.center_window(600, 360)86 self.title('评议小组管理')87 self.resizable(False, False)88 self.mainloop()89

    90 #窗体居中

    91 defcenter_window(self, width, height):92 screenwidth =self.winfo_screenwidth()93 screenheight =self.winfo_screenheight()94 #宽高及宽高的初始点坐标

    95 size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)96 self.geometry(size)97

    98 #数据初始化获取

    99 definit_data(self):100 result, _ =self.opr.query()101 ifself.opr.queryStatus:102 return0103 else:104 returnresult105

    106 #表格内容插入

    107 defget_tree(self):108 if self.list ==0:109 tkinter.messagebox.showinfo("错误提示", "数据获取失败")110 else:111 #删除原节点

    112 for _ in map(self.tree.delete, self.tree.get_children("")):113 pass

    114 #更新插入新节点

    115 for i inrange(len(self.list)):116 group =self.list[i]117 self.tree.insert("", "end", values=(group[0],118 group[1],119 group[2],120 group[3]), text=group[0])121 #TODO 此处需解决因主程序自动刷新引起的列表项选中后重置的情况,我采用的折中方法是:把选中时的数据保存下来,作为记录

    122

    123 #绑定列表项单击事件

    124 self.tree.bind("", self.tree_item_click)125 self.tree.after(500, self.get_tree)126

    127 #单击查询按钮触发的事件方法

    128 defquery(self):129 query_info =self.ent_find_name.get()130 self.string.set('')131 #print(query_info)

    132 if query_info is None or query_info == '':133 tkinter.messagebox.showinfo("警告", "查询条件不能为空!")134 self.get_tree()135 else:136 result, _ = self.opr.query(queryby="where name like '%" + query_info + "%'")137 self.get_tree()138 ifself.opr.queryStatus:139 tkinter.messagebox.showinfo("警告", "查询出错,请检查数据库服务是否正常")140 elif notresult:141 tkinter.messagebox.showinfo("查询结果", "该查询条件没有匹配项!")142 else:143 self.list =result144 #TODO 此处需要解决弹框后代码列表刷新无法执行的问题

    145

    146 #单击删除按钮触发的事件方法

    147 defdelete(self):148 if self.item_selection is None or self.item_selection == '':149 tkinter.messagebox.showinfo("删除警告", "未选中待删除值")150 else:151 #TODO: 删除提示

    152 self.opr.delete(deleteby="no = '"+self.item_selection+"'")153 ifself.opr.deleteStatus:154 tkinter.messagebox.showinfo("删除警告", "删除异常,可能是数据库服务意外关闭了。。。")155 else:156 self.list =self.init_data()157 self.get_tree()158

    159 #为解决窗体自动刷新的问题,记录下单击项的内容

    160 deftree_item_click(self, event):161 try:162 selection =self.tree.selection()[0]163 self.data = self.tree.item(selection, "values")164 self.item_selection =self.data[0]165 exceptIndexError:166 tkinter.messagebox.showinfo("单击警告", "单击结果范围异常,请重新选择!")167

    168 #单击更新按钮触发的事件方法

    169 defupdate(self):170 if self.item_selection is None or self.item_selection == '':171 tkinter.messagebox.showinfo("更新警告", "未选中待更新项")172 else:173 data =[self.item_selection]174 self.data = self.set_info(2)175 if self.data is None or notself.data:176 return

    177 #更改参数

    178 data = data +self.data179 self.opr.update(updatelist=data)180 ifself.opr.insertStatus:181 tkinter.messagebox.showinfo("更新小组信息警告", "数据异常库连接异常,可能是服务关闭啦~")182 #更新界面,刷新数据

    183 self.list =self.init_data()184 self.get_tree()185

    186 #单击新增按钮触发的事件方法

    187 defadd(self):188 #接收弹窗的数据

    189 self.data = self.set_info(1)190 if self.data is None or notself.data:191 return

    192 #更改参数

    193 self.opr.insert(insertlist=self.data)194 ifself.opr.insertStatus:195 tkinter.messagebox.showinfo("新增小组信息警告", "数据异常库连接异常,可能是服务关闭啦~")196 #更新界面,刷新数据

    197 self.list =self.init_data()198 self.get_tree()199

    200 #此方法调用弹窗传递参数,并返回弹窗的结果

    201 defset_info(self, dia_type):202 """

    203 :param dia_type:表示打开的是新增窗口还是更新窗口,新增则参数为1,其余参数为更新204 :return: 返回用户填写的数据内容,出现异常则为None205 """

    206 dialog = MyDialog(data=self.data, dia_type=dia_type)207 #self.withdraw()

    208 self.wait_window(dialog) #这一句很重要!!!

    209 returndialog.group_info210

    211

    212 #新增窗口或者更新窗口

    213 classMyDialog(tk.Toplevel):214 def __init__(self, data, dia_type):215 super().__init__()216

    217 #窗口初始化设置,设置大小,置顶等

    218 self.center_window(600, 360)219 self.wm_attributes("-topmost", 1)220 self.resizable(False, False)221 self.protocol("WM_DELETE_WINDOW", self.donothing) #此语句用于捕获关闭窗口事件,用一个空方法禁止其窗口关闭。

    222

    223 #根据参数类别进行初始化

    224 if dia_type == 1:225 self.title('新增小组信息')226 else:227 self.title('更新小组信息')228

    229 #数据变量定义

    230 self.no =tk.StringVar()231 self.name =tk.StringVar()232 self.pname =tk.StringVar()233 self.pnum =tk.StringVar()234 if not data or dia_type == 1:235 self.no.set('')236 self.name.set('')237 self.pname.set('')238 self.pnum.set('')239 else:240 self.no.set(data[0])241 self.name.set(data[1])242 self.pname.set(data[2])243 self.pnum.set(data[3])244

    245 #错误提示定义

    246 self.text_error_no =tk.StringVar()247 self.text_error_name =tk.StringVar()248 self.text_error_pname =tk.StringVar()249 self.text_error_pnum =tk.StringVar()250 self.error_null = '该项内容不能为空!'

    251 self.error_exsit = '该小组编号已存在!'

    252

    253 self.group_info =[]254 #弹窗界面布局

    255 self.setup_ui()256

    257 #窗体布局设置

    258 defsetup_ui(self):259 #第一行(两列)

    260 row1 =tk.Frame(self)261 row1.grid(row=0, column=0, padx=160, pady=20)262 tk.Label(row1, text='小组编号:', width=8).pack(side=tk.LEFT)263 tk.Entry(row1, textvariable=self.no, width=20).pack(side=tk.LEFT)264 tk.Label(row1, textvariable=self.text_error_no, width=20, fg='red').pack(side=tk.LEFT)265 #第二行

    266 row2 =tk.Frame(self)267 row2.grid(row=1, column=0, padx=160, pady=20)268 tk.Label(row2, text='小组名称:', width=8).pack(side=tk.LEFT)269 tk.Entry(row2, textvariable=self.name, width=20).pack(side=tk.LEFT)270 tk.Label(row2, textvariable=self.text_error_name, width=20, fg='red').pack(side=tk.LEFT)271 #第三行

    272 row3 =tk.Frame(self)273 row3.grid(row=2, column=0, padx=160, pady=20)274 tk.Label(row3, text='负责人姓名:', width=10).pack(side=tk.LEFT)275 tk.Entry(row3, textvariable=self.pname, width=18).pack(side=tk.LEFT)276 tk.Label(row3, textvariable=self.text_error_pname, width=20, fg='red').pack(side=tk.LEFT)277 #第四行

    278 row4 =tk.Frame(self)279 row4.grid(row=3, column=0, padx=160, pady=20)280 tk.Label(row4, text='手机号码:', width=8).pack(side=tk.LEFT)281 tk.Entry(row4, textvariable=self.pnum, width=20).pack(side=tk.LEFT)282 tk.Label(row4, textvariable=self.text_error_pnum, width=20, fg='red').pack(side=tk.LEFT)283 #第五行

    284 row5 =tk.Frame(self)285 row5.grid(row=4, column=0, padx=160, pady=20)286 tk.Button(row5, text="取消", command=self.cancel).grid(row=0, column=0, padx=60)287 tk.Button(row5, text="确定", command=self.ok).grid(row=0, column=1, padx=60)288

    289 defcenter_window(self, width, height):290 screenwidth =self.winfo_screenwidth()291 screenheight =self.winfo_screenheight()292 size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)293 self.geometry(size)294

    295 #点击确认按钮绑定事件方法

    296 defok(self):297

    298 self.group_info = [self.no.get(), self.name.get(), self.pname.get(), self.pnum.get()] #设置数据

    299 if self.check_info() == 1: #进行数据校验,失败则不关闭窗口

    300 return

    301 self.destroy() #销毁窗口

    302

    303 #点击取消按钮绑定事件方法

    304 defcancel(self):305 self.group_info = None #空!

    306 self.destroy()307

    308 #数据校验和用户友好性提示,校验失败返回1,成功返回0

    309 defcheck_info(self):310 is_null =0311 str_tmp =self.group_info312 if str_tmp[0] == '':313 self.text_error_no.set(self.error_null)314 is_null = 1

    315 if str_tmp[1] == '':316 self.text_error_name.set(self.error_null)317 is_null = 1

    318 if str_tmp[2] == '':319 self.text_error_pname.set(self.error_null)320 is_null = 1

    321 if str_tmp[3] == '':322 self.text_error_pnum.set(self.error_null)323 is_null = 1

    324

    325 if is_null == 1:326 return 1

    327 res, _ = OracleOpr().query(queryby="where no = '"+str_tmp[0]+"'")328 print(res)329 ifres:330 self.text_error_no.set(self.error_exsit)331 return 1

    332 return0333

    334 #空函数

    335 defdonothing(self):336 pass

    guiPy.py

    可以看的出,窗体类继承自tkinter.TK()可以直接通过self.x对主窗体添加控件和修改属性。然后在初始化函数中需要声明需要的成员变量,完成整体布局以及控件的事件绑定,以及数据初始化,最后self.mainloop()使窗体完成自动刷新。我们所有的逻辑处理都是在事件绑定方法中完成的,这样感觉就像是针对用户的每一个操作做出对应的逻辑处理和反应,同时需要考虑可能出现的异常以及所有的可能性,达到用户友好的设计要求。

    运行此实例,可以使用test,py中的测试方法,也可以把guiPy.py和dataBaseOpr.py两个类放在同一个文件夹,在本机安装好上述两个库和完成数据库创建的情况下,直接在py解释器下导入guiPy.py文件下所有的包,MainWindow()即可。

    展开全文
  • 字符串转 md5 工具(Python.../usr/bin/env python# -*- coding: utf-8 -*-from tkinter import *import hashlibimport timeLOG_LINE_NUM = 0class MY_GUI():def __init__(self,init_window_name):self.init_window_n...
  • PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成。PyQt5本身拥有超过620个类和6000函数及方法。在可以运行于多个平台,包括:Unix, Windows, and Mac OS。代码如下from PyQt5.Qt...
  • Python支持多种图形界面的第三方库,包括:TkwxWidgetsQtGTK等等。但是Python自带的库是支持Tk的Tkinter,使用Tkinter,无需安装任何包,就可以直接使用。本章简单介绍如何使用Tkinter进行GUI编程。Tkinter我们来...
  • 用tkinter写的python GUI注册界面实例,包括注册和登录。使用pickle库来序列化用户名和密码
  • 简单的说,GUI编程就是给程序加上图形化界面.python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱.如果给程序加一个图形化界面,那么普通的用户也就能用上...
  • image.png简单的说,GUI编程就是给程序加上图形化界面.python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱.如果给程序加一个图形化界面,那么普通的用户也就...
  • 简单的说,GUI编程就是给程序加上图形化界面.python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱.如果给程序加一个图形化界面,那么普通的用户也就能用上...
  • 这可能是最好玩的python GUI入门实例! image.png 简单的说,GUI编程就是给程序加上图形化界面. python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的...
  • 这可能是最好玩的python GUI入门实例! 简单的说,GUI编程就是给程序加上图形化界面. python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱. 如果给程序...
  • 简单的说,GUI编程就是给程序加上图形化界面. python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱. 如果给程序加一个图形化界面,那么普通的用户也就能用上...
  • image.png简单的说,GUI编程就是给程序加上图形化界面.python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱.如果给程序加一个图形化界面,那么普通的用户也就...
  • 一、基础from tkinter import *from tkinter.ttk import *import osclass MainWindow(Tk):def __init__(self):super().__init__()self.title("显示效果:注意:tkinter在Mac上Panedwindow不支持修改前景色背景...
  • Python 图形界面 GUI Tkinter 实例

    千次阅读 2017-05-23 15:53:16
    Python 实现图形化界面  # -*- coding: cp936 -*- from Tkinter import * import tkMessageBox class Application(Frame): def __init__(self, master=None): Frame.__init__(self, master) se
  • 前言上一节我们介绍了登录窗体的GUI设计与功能实现,用户的账号和密码校验完成后应当跳转到主窗体内容,这一节我们将具体介绍主窗体界面的设计与功能实现!一、基础界面设计我们新建一个900x640的窗口,顶部加入图片...
  • python GUI实例学习

    2020-12-25 10:41:43
    在学习本篇之前,如果你对Python下进行GUI编程基础内容还有不明白,推荐一篇相关文章:简单介绍利用TK在Python下进行GUI编程的教程 写一个简单的界面很容易,即使是什么都不了解的情况下,这个文本转载了最简单的...
  • image.png简单的说,GUI编程就是给程序加上图形化界面.python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱.如果给程序加一个图形化界面,那么普通的用户也就...
  • 简单的说,GUI编程就是给程序加上图形化界面. 本期推送整理了初学者可能会用到的Python资料,含有书籍/视频/在线文档和编辑器/源 代码,关于Python的安装qun:850973621 如果给程序加一个图形化界面,那么普通的...
  • Python这门编程语言越来越火爆有碾压其他所有编程语言比如JavaCC#之势python代码简洁入门容易但是由于pythongui界面不能直接拖动实现所以学好tkinter是成为python高手的关键下面是我整理的tkinter最重要的一些实例...
  • image.png简单的说,GUI编程就是给程序加上图形化界面.python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱.如果给程序加一个图形化界面,那么普通的用户也就...
  • image.png简单的说,GUI编程就是给程序加上图形化界面.python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱.如果给程序加一个图形化界面,那么普通的用户也就...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 333
精华内容 133
关键字:

pythongui界面实例

python 订阅