python socket通信--Apple的学习笔记

之后,我还需要为python制作界面。就先拿我之前的一个python工具,当时做的配置信息是手工填写到settings文件中,然后调用bat后通过python生成代码。那么我就为它做个界面练练手,主要是把基本控件都用下。摸底后,感觉方案可行,ttk的API还是比较友好的。之后还需要添加treeview控件,用来进行数据实时更新。

入门学习了下tinker和ttk的基本控件后,制作界面如下,感觉布局不灵活。

如下源码功能说明:从json文件中读取原来的配置信息,然后在界面中修改原来的配置信息,通过按钮可以保存为新的配置信息。其实按钮回调函数中我再添加直接call bat文件,即可通过配置文件直接生成c代码了,和之前的工具可以无缝链接~

4c0926160d42

image.png

动态演示

4c0926160d42

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的学习笔记相关推荐

  1. 日志库 winston 的学习笔记 - logger.info 的实现原理单步调试

    按照这篇文章日志库 winston 的学习笔记 - 创建一个使用 winston 的 Node.js 应用里的代码,对下列方法进行单步调试: 因为我们调用的是 info 方法,所以生成的日志,leve ...

  2. linux的can通信busoff,socketCAN内核源码分析是否支持busoff自恢复--Apple的学习笔记

    大总结:诊断小系统搭建步骤总结--Apple的学习笔记的剩余问题2中,我说过要深入下socketCAN内核源码学习.因为这个小项目关于驱动开发太顺利了,导致学习不到什么东东.最主要我一开始走了捷径,看 ...

  3. linux 应用层gpio中断_linux下GPIO中断驱动US100传感器--Apple的学习笔记

    一,前言 资源就的利用起来.linux下串口raw驱动(US100超声波)--Apple的学习笔记已经用US100玩了串口,US100还可以用GPIO和中断来玩.原理就是triq发送大于10us的高电 ...

  4. Matlab gui用户图形设计界面学习笔记(一)——单个界面的菜单设计

    Matlab gui用户图形设计界面学习笔记(一)--单个界面的菜单设计 弹出式菜单(pop-up menu)和下拉列表框(listbox) 实现功能:pop menu最初为 "请选择省份& ...

  5. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  6. 【C#】跨平台UI库Avalonia的学习笔记(上)

    目的 因为有这种需求,希望开发一个上位机软件,可以在Windows和Linux上同时运行,而且这个Linux很可能是arm平台的板子,其实就是可以代替一部分工控机的功能,省钱也节约设备占用的体积,鉴于 ...

  7. python re库函数_python re库的正则表达式学习笔记

    1. 安装 默认已经安装好了python环境了 re库是python3的核心库,不需要pip install,直接import就行 2. 最简单的模式 字符本身就是最简单的模式 比如:'A', 'I ...

  8. 配置库用户_GEE学习笔记 六十八:【GEE之Python版教程二】配置Python开发环境

    这一篇内容主要讲解两部分内容,第一部分是本地python开发环境的配置,第二部分是GEE的python开发环境配置.我这里做的所有的操作都是在我的Mac电脑上做的,Windows上操作类似,如果有不清 ...

  9. STM32F429HAL库时钟系统学习笔记

    文章部分图片来自于正点原子开发手册.纯属学习用途. F4的系统的时钟和F1基本相同,和F1 不同的就是锁相环倍频系数提高,就是系统时钟PLL的时钟频率高达180M(做完电赛控制组,感觉100M以下的单 ...

  10. FFmpeg基础库编程开发学习笔记——音频常见格式及字幕格式

    声明一下:这些关于ffmpeg的文章仅仅是用于记录我的学习历程和以便于以后查阅,文章中的一些文字可能是直接摘自于其它文章.书籍或者文献,学习ffmpeg相关知识是为了使用在Android上,我也才是刚 ...

最新文章

  1. 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag
  2. mongodb 开启身份认证_Yum安装mongodb及开启用户认证远程登录
  3. 利用sql报错帮助进行sql注入
  4. 7、linux网络编程--广播
  5. [RHEL5企业级Linux服务攻略]--第9季 Squid服务全攻略之高级配置
  6. python用户界面导入图片_python学习笔记之11:图像用户界面
  7. sqlserver 运行正則表達式,调用c# 函数、代码
  8. 用nodejs 替换文件中所有图片的url
  9. spring security:基于MongoDB的认证
  10. 【转载】android客服端+eps8266+单片机+路由器之远程控制系统
  11. Java7中的ForkJoin并发框架初探(中)——JDK中实现简要分析
  12. 语音识别技术准确率早已超过人类平均水平
  13. TF ckpt转pb脚本
  14. docker-compose 布署应用nginx中的react应用获取环境变量
  15. Mysql统计同一字段不同值的个数
  16. 《计算机技术领域当前的主流技术及其社会需求调查报告》
  17. 杂记 - 0002 - 衣服 - 尺寸表与跳码
  18. 播布客小布老师所有视频
  19. ArrayList源码解读
  20. 美国国防部的电子邮箱系统

热门文章

  1. php 服务端埋点,客户端埋点方案总结
  2. linux dd 错,dd命令错误写入设备上没有剩余空间[关闭](dd command error writing No space left on device [closed])...
  3. java控制台五子棋工程_java控制台实现五子棋小游戏
  4. iOS中JPG PNG GIF格式图片的区分
  5. 设置linux kernel 日志打印方法
  6. 图片灯箱插件-lightBox
  7. 端到端语音识别 ESPnet ASR脚本流程(asr.sh)
  8. java引用类型内存_Java的引用类型的内存分析
  9. css表格文字超数量就竖排_CSS奇特技巧:控制文字竖排
  10. B/S系统界面设计与开发详解