python学习笔记第12章:图形界面编程
12.1 PysimpleGUI
1.示例
import PySimpleGUI as sg
import tools
'''
'''
#0.数据定义
#一.相关函数
def gui():
#sg.theme_previewer() #所有主题预览
#sg.preview_all_look_and_feel_themes() #所有主题预览
sg.theme('SystemDefault')
menu_def = [
['&File', ['&Open', '&Save', '---', 'Exit']], # '---',分隔符
['Edit', ['Paste', '新窗口', '次级菜单',['次级一', '次级二', ], 'Undo'], ]
]
t1 = sg.Text('表名', key='t',size=(40,1)) #文本组件名t
t2 = sg.Text('角色名称/手机号/option',justification='center',size=(40,1)) #居中
t3 = sg.Text('部门名称/_id')
c_table = sg.Combo(tools.table_name, key = 'table_name', default_value='g_baitan_node_plan') #Combo下拉框,,占用一个values,
i1 = sg.Input('aloha', key='input1') #输入框,如果有默认值写在最前
i2 = sg.Input(key='input2')
layout = [
[sg.Menu( menu_def, key='menu', tearoff=False, pad=(20, 1))], #菜单栏,有菜单栏时,菜单栏也占用一个values,菜单项必须第一位,wx用不了菜单
[t1, t2, t3],
[c_table, i1, i2],
[sg.Input(key='cmd_input', background_color='#FBFBFF', size=(135,1))], #执行Mongo命令的输入框
[sg.Button('角色部门'), sg.Button('用户信息'),sg.Button('ObjectId'), sg.Button('执行命令'), sg.Button('源码查询')],
[sg.Output(key='out1', size=(135, 20), tooltip='查询结果输出框', text_color='blue', background_color='#F0F0F0', font='Courier 10')], #输出框,key=起名,用于后续调用
[sg.ColorChooserButton('color',key = 'color') ]
]
window = sg.Window('查询工具', layout,alpha_channel=0.95, return_keyboard_events=True, font=("宋体", 11), grab_anywhere=False) #打开一个窗口,透明度95%,获取键盘按键
win2_status = 0 #新窗口标志
while True:
event, values = window() #监听按钮和文本框,,values列表,values[0]是第一个文本框,如果前面有菜单栏,菜单栏是values[0]
if event in (sg.WIN_CLOSED, 'Delete:46', menu_def[0][1][3]) and sg.popup_yes_no('确定要退出吗') == 'Yes': #event单击事件,或键盘事件,单击红叉或者菜单里的Exit时退出,'Delete:46'删除键,获取用户弹窗点击的按钮,如果yes
break
elif event == '角色部门':
window["out1"].update('')
tools.get_phone(values["input1"],values['input2'])
elif event == '用户信息':
window["out1"]('') #清空,更新控件的内容,window["out1"]根据名字获取控件,已省略update
tools.find_sysuser1(values["input1"])
elif event == 'ObjectId':
window["out1"].update('')
tools.get_id(values["table_name"],values['input2'])
elif event == '执行命令':
if not values['input2'] or not values['cmd_input']: #指定输入框没有值时
sg.popup('请输入要执行的操作') #弹窗
else: #如果不用else,将导致下面的函数被执行,空值时会报错
window["out1"].update('')
tools.execute(values["table_name"], values["input1"], values['cmd_input'])
elif event == '源码查询':
window["out1"].update('')
print("查询中")
tools.query_code(values["input1"])
#打开新窗口
if not win2_status and event == menu_def[1][1][1]:
win2_status = 1
img = sg.Image(r'C:\Users\zx\Desktop\abc.gif')
layout2 = [[sg.Text('Window 2')],
[sg.Ok(), sg.Button('Exit')],
[img]]
window2 = sg.Window('New Window', layout2) #打开一个窗口
if win2_status:
events2, values2 = window2.Read(timeout=100) #监听窗口2
if events2 is None or events2 == 'Exit':
win2_status = 0
window2.close()
window.close()
#二.执行
if __name__ == '__main__':
gui()
1. 控件
tab1_layout = [[sg.T('This is inside tab 1')]]
tab2_layout = [[sg.T('This is inside tab 2')], #Text简写
[sg.In(key='in')]] #Input简写
[sg.TabGroup([[sg.Tab('Tab 1', tab1_layout), sg.Tab('Tab 2', tab2_layout)]])], #标签页标签组
[sg.ButtonMenu('ButtonMenu', key='-BMENU-', menu_def=menu_def[0])], #菜单按钮
[sg.InputText(), sg.FolderBrowse()], #文件夹选择框,选择文件夹后,路径会展示在输入框中,sg.FileBrowse()文件选择,sg.FilesBrowse()文件多选
[sg.InputText(), sg.FileSaveAs()], #保存/覆盖文件
sg.Checkbox(‘My second checkbox!’, default=True) #多选框
sg.Radio(‘My second Radio!’, “RADIO1”) #单选框
sg.Multiline(default_text=‘default Text’,scale=(2, 10)) #多行文本框
sg.Listbox(values=sg.theme_list(), size=(20, 12), key='list', enable_events=True) #列表框,展示多行的下拉框
sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85) #拖动条,拖动方向 ‘h’ :横向 ‘v’:竖向,default_value=85默认值
sg.OptionMenu #另一种下拉框,滚动条不好用
sg.popup_get_text('This is {}'.format(values['列表框'][0])) #弹窗另一种
column1 = [[sg.Spin(values=('Spin Box 1', 'Spin Box 2', 'Spin Box 3'), initial_value='Spin Box 1')]] #列表标签
sg.Column(column1, background_color='#F7F3EC') #列表选择框什么的
tray = sg.SystemTray(menu=['menu', ['Open', ['&Save::KEY', '---', 'Issues', '!Disabled'], 'E&xit']]) #托盘wx能用
tray.ShowMessage('My Message', 'The tray icon is up and runnning!') #鼠标放在托盘时显示的文字
sg.Frame #框架,块,不知道怎么用
sg.ProgressBar(1000, orientation='h', size=(140, 20), key='progbar') #进度条,要配合for循环之类的用,‘h’ :横向 ‘v’:竖向
window['progbar'].UpdateBar() #更新进度条
sg.CalendarButton( '日历',key='calendar') #日历
sg.ColorChooserButton('color',key = 'color') #颜色选择
sg.Image('C:/Users/zx/Desktop/abc.gif') #图片
sg.popup_yes_no('确定要退出吗') == 'Yes' #弹窗不能自定义按钮,要获取用户的按键,需使用弹窗的返回值
window['input2']('haha') #更新输入框
'''
'''方法
set_size(size=(None, None))
set_tooltip #提示
SetFocus #焦点
if event == 'Control_L:17': #按键,左ctrl
12.2wxPython
1. 示例
import wx
class MyFrame(wx.Frame):
def __init__(self):
super().__init__(parent=None, title='Hello World') #框架
panel = wx.Panel(self)
#面板
my_sizer = wx.BoxSizer(wx.VERTICAL) #动态布局器,VERTICAL垂直添加,HORIZONTAL横向添加
#1输入文本框
self.text_ctrl = wx.TextCtrl(panel) #文本框
my_sizer.Add(self.text_ctrl, 0, wx.ALL | wx.EXPAND, 5) #文本框添加到动态布局器,0大小为默认比例,wx.ALL边框,wx.EXPAND自动扩展,高度5,
#2获取用户信息
user_btn = wx.Button(panel, label='用户信息') #按钮
user_btn.Bind(wx.EVT_BUTTON, self.on_click_user) #按钮绑定单击事件,第一个参数wx.EVT_BUTTON单击,第二个参数调用的函数
my_sizer.Add(user_btn, 0, wx.ALL | wx.CENTER, 5) #按钮添加到动态布局器,|右侧,居中,高度5,
# 3.标签
self.st = wx.StaticText(panel, label="Old Label.")
#添加一个标签
my_sizer.Add(self.st, 0, wx.ALL | wx.CENTER, 5)
self.st.SetLabel('new') #修改标签内容
panel.SetSizer(my_sizer) #面板关联布局管理器
self.Show()
#4. #定义单击后调用的函数
def on_click_user(self,event): #定义单击后调用的函数
value = self.text_ctrl.GetValue() #获取文本框的输入内容
self.st.SetLabel('new') #修改标签内容
if value:
tools.user_find(value)
if __name__ == '__main__':
app = wx.App(True) #True,输出内容到窗口,缺省输出到控制台
frame = MyFrame()
app.MainLoop()
原文地址:https://www.cnblogs.com/wakevol/p/15113257.html
- 1054: [HAOI2008]移动玩具
- MatrixTree速成
- 1元搭建自己的云服务器&解析域名
- 洛谷P4180 [Beijing2010组队]次小生成树Tree
- 携程开源数据库访问框架
- LOJ #108. 多项式乘法
- 【作业】HansBug的前三次OO作业分析与小结
- 【备忘】Idea的那些事
- 洛谷P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
- win10下vagrant+centos7 rails虚拟开发机配置流程
- 再免费多看一章--k-means++
- 面向对象先导课感想
- 【LATEX】个人版latex论文模板
- 【前端】wangEditor(富文本编辑器) 简易使用示例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ng-template和ng-container的嵌套使用
- SAP Spartacus pageSlot一览
- Angular @Hostbinding工作原理
- Python干货 | 遥感影像拼接
- SAP Spartacus 自定义指令的实现以及通过@HostBinding实现属性绑定
- Python气象绘图教程—(十九)剖面图
- Angular DefaultDomRenderer2.setProperty
- 在pandas中利用hdf5高效存储数据
- AMS机器学习课程:Keras深度学习 - 卷积神经网络
- python教程 | 最标准的地图调用方式(国家测绘局提供数据)
- 「万物生长」一个APK从诞生到活跃在Android手机上
- webpack实战——生产环境配置【下】
- R语言作图——Violin plot with dot
- AkShare-中国宏观-全社会用电分类情况表
- Angular应用从Component到Html的数据绑定是如何实现的