ttk python_python GUI ttk库 -- Apple的学习笔记
python socket通信--Apple的学习笔记
之后,我还需要为python制作界面。就先拿我之前的一个python工具,当时做的配置信息是手工填写到settings文件中,然后调用bat后通过python生成代码。那么我就为它做个界面练练手,主要是把基本控件都用下。摸底后,感觉方案可行,ttk的API还是比较友好的。之后还需要添加treeview控件,用来进行数据实时更新。
入门学习了下tinker和ttk的基本控件后,制作界面如下,感觉布局不灵活。
如下源码功能说明:从json文件中读取原来的配置信息,然后在界面中修改原来的配置信息,通过按钮可以保存为新的配置信息。其实按钮回调函数中我再添加直接call bat文件,即可通过配置文件直接生成c代码了,和之前的工具可以无缝链接~
image.png
动态演示
ttk界面.gif
from tkinter import *
from tkinter.ttk import *
from tkinter.messagebox import *
import json
class HMIFrame(Tk): #HMIFrame is the sub class of Tk
def __init__(self, parent):
self.infolist = ["Author", "ToolVer", "NameOfDBC1","TestNode","ByteOrder1", "ChannelNum","NameOfDBC2",
"ByteOrder2", "RXNMID", "TXNMID", "MappingFile"]
self.txtTag = [] # save
self.save_dict = {}
self.data_dict = {}
self.v = IntVar()
self.v2 = IntVar()
self.row=0
def SaveAndGencode(self,event):
for index, item in enumerate(self.infolist[:4]):
self.save_dict[item] = self.txtTag[index].get()
self.save_dict[self.infolist[6]] = self.txtTag[4].get() # NameOfDBC2
#print(self.save_dict)
self.savefile()
def readfile(self):
global data_dict
with open('setting_cfg.json', 'r', encoding='utf-8') as f:
self.data_dict = json.load(f)
self.save_dict = self.data_dict.copy() # deep copy
def savefile(self):
with open('setting_cfg.json', 'w') as file_obj:
json.dump(self.save_dict, file_obj)
showinfo(title='Info', message="Done!")
def change(self):
self.save_dict['ByteOrder1'] = self.v.get()
def change2(self):
self.save_dict['ByteOrder2'] = self.v2.get()
def setchm(self,parent):
self.save_dict['ChannelNum'] = self.c.get()
if(self.c.get() == "1"):
self.rdIntel2['state'] = 'disabled'
self.rdMotorola2['state'] = 'disabled'
self.txtTag[4]['state'] = 'disabled'
else:
self.rdIntel2['state'] = 'enable'
self.rdMotorola2['state'] = 'enable'
self.txtTag[4]['state'] = 'enable'
def setupWindow(self,parent):
parent.title("Apple Tools")
parent.geometry('600x350')
self.row = 6
# label settings
for index, lbitme in enumerate(self.infolist[:self.row+2]):
self.tag = "lb_" + lbitme # temp obj
self.tag = Label(parent, text=lbitme + ":", font=("Arial", 12), width=15)
self.tag.grid(row=index, sticky=W, padx=10)
# text settings
for index, txtitme in enumerate(self.infolist[:4]):
self.txtTag.append("txt_" + txtitme) # save obj name to list
self.txtTag[index] = Entry(parent,width=60)
self.txtTag[index].grid(row=index, column=1, sticky=E,pady=5) # position
self.txtTag[index].insert(0, self.data_dict[txtitme]) # default value
if(self.row == 6):
self.txtTag.append("txt_NameOfDBC2") # save obj name to list
self.txtTag[4] = Entry(parent,width=60)
self.txtTag[4].grid(row=6, column=1, sticky=E,pady=5) # position of NameOfDBC2
self.txtTag[4].insert(0, self.data_dict['NameOfDBC2']) # default value
# radio settings
self.rdIntel2 = Radiobutton(parent, text='Intel ', variable=self.v2, value=0, command=self.change2)
self.rdIntel2.grid(row=7, column=1, pady=5) # position of ByteOrder2
self.rdMotorola2 = Radiobutton(parent, text='Motorola', variable=self.v2, value=1, command=self.change2)
self.rdMotorola2.grid(row=7, column=1, sticky=W, pady=5)
self.v2.set(self.data_dict['ByteOrder2']) # add default value
# radio settings
self.rdIntel = Radiobutton(parent, text='Intel ', variable=self.v, value=0, command=self.change)
self.rdIntel.grid(row = 4,column=1,pady=5) # position of ByteOrder1
self.rdMotorola = Radiobutton(parent, text='Motorola', variable=self.v, value=1, command=self.change)
self.rdMotorola.grid(row = 4,column=1,sticky=W,pady=5)
self.v.set(self.data_dict['ByteOrder1']) # add default value
# button settings
self.btn = Button(parent, text="Generate Code", width=20)
self.btn.grid(row=10, column=1,pady=25,padx=15,sticky=E)
self.btn.bind("", self.SaveAndGencode)
# combo
self.c = Combobox(parent)
self.c.bind('<>', self.setchm)
self.c['value'] = ("1", "2")
self.c.current(int(self.data_dict['ChannelNum'])-1) # add default value
self.c.grid(row=5, column=1,sticky=W,pady=5) # position of ChannelNum
# "RXNMID", "TXNMID", "MappingFile" use default value
def HMI():
root = Tk()
HMIfm = HMIFrame(root)
HMIfm.readfile()
HMIfm.setupWindow(root)
root.mainloop()
if __name__ == '__main__':
HMI()
ttk python_python GUI ttk库 -- Apple的学习笔记相关推荐
- 日志库 winston 的学习笔记 - logger.info 的实现原理单步调试
按照这篇文章日志库 winston 的学习笔记 - 创建一个使用 winston 的 Node.js 应用里的代码,对下列方法进行单步调试: 因为我们调用的是 info 方法,所以生成的日志,leve ...
- linux的can通信busoff,socketCAN内核源码分析是否支持busoff自恢复--Apple的学习笔记
大总结:诊断小系统搭建步骤总结--Apple的学习笔记的剩余问题2中,我说过要深入下socketCAN内核源码学习.因为这个小项目关于驱动开发太顺利了,导致学习不到什么东东.最主要我一开始走了捷径,看 ...
- linux 应用层gpio中断_linux下GPIO中断驱动US100传感器--Apple的学习笔记
一,前言 资源就的利用起来.linux下串口raw驱动(US100超声波)--Apple的学习笔记已经用US100玩了串口,US100还可以用GPIO和中断来玩.原理就是triq发送大于10us的高电 ...
- Matlab gui用户图形设计界面学习笔记(一)——单个界面的菜单设计
Matlab gui用户图形设计界面学习笔记(一)--单个界面的菜单设计 弹出式菜单(pop-up menu)和下拉列表框(listbox) 实现功能:pop menu最初为 "请选择省份& ...
- OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十
OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...
- 【C#】跨平台UI库Avalonia的学习笔记(上)
目的 因为有这种需求,希望开发一个上位机软件,可以在Windows和Linux上同时运行,而且这个Linux很可能是arm平台的板子,其实就是可以代替一部分工控机的功能,省钱也节约设备占用的体积,鉴于 ...
- python re库函数_python re库的正则表达式学习笔记
1. 安装 默认已经安装好了python环境了 re库是python3的核心库,不需要pip install,直接import就行 2. 最简单的模式 字符本身就是最简单的模式 比如:'A', 'I ...
- 配置库用户_GEE学习笔记 六十八:【GEE之Python版教程二】配置Python开发环境
这一篇内容主要讲解两部分内容,第一部分是本地python开发环境的配置,第二部分是GEE的python开发环境配置.我这里做的所有的操作都是在我的Mac电脑上做的,Windows上操作类似,如果有不清 ...
- STM32F429HAL库时钟系统学习笔记
文章部分图片来自于正点原子开发手册.纯属学习用途. F4的系统的时钟和F1基本相同,和F1 不同的就是锁相环倍频系数提高,就是系统时钟PLL的时钟频率高达180M(做完电赛控制组,感觉100M以下的单 ...
- FFmpeg基础库编程开发学习笔记——音频常见格式及字幕格式
声明一下:这些关于ffmpeg的文章仅仅是用于记录我的学习历程和以便于以后查阅,文章中的一些文字可能是直接摘自于其它文章.书籍或者文献,学习ffmpeg相关知识是为了使用在Android上,我也才是刚 ...
最新文章
- 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag
- mongodb 开启身份认证_Yum安装mongodb及开启用户认证远程登录
- 利用sql报错帮助进行sql注入
- 7、linux网络编程--广播
- [RHEL5企业级Linux服务攻略]--第9季 Squid服务全攻略之高级配置
- python用户界面导入图片_python学习笔记之11:图像用户界面
- sqlserver 运行正則表達式,调用c# 函数、代码
- 用nodejs 替换文件中所有图片的url
- spring security:基于MongoDB的认证
- 【转载】android客服端+eps8266+单片机+路由器之远程控制系统
- Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
- 语音识别技术准确率早已超过人类平均水平
- TF ckpt转pb脚本
- docker-compose 布署应用nginx中的react应用获取环境变量
- Mysql统计同一字段不同值的个数
- 《计算机技术领域当前的主流技术及其社会需求调查报告》
- 杂记 - 0002 - 衣服 - 尺寸表与跳码
- 播布客小布老师所有视频
- ArrayList源码解读
- 美国国防部的电子邮箱系统
热门文章
- php 服务端埋点,客户端埋点方案总结
- linux dd 错,dd命令错误写入设备上没有剩余空间[关闭](dd command error writing No space left on device [closed])...
- java控制台五子棋工程_java控制台实现五子棋小游戏
- iOS中JPG PNG GIF格式图片的区分
- 设置linux kernel 日志打印方法
- 图片灯箱插件-lightBox
- 端到端语音识别 ESPnet ASR脚本流程(asr.sh)
- java引用类型内存_Java的引用类型的内存分析
- css表格文字超数量就竖排_CSS奇特技巧:控制文字竖排
- B/S系统界面设计与开发详解