ttk python_python GUI ttk库 -- Apple的学习笔记

这篇博客介绍了如何使用Python的ttk库创建GUI界面,包括从json文件读取和保存配置信息,以及实现界面元素如Entry、Radiobutton、Combobox等。作者通过实例展示了界面设计,并讨论了ttk库的API友好性。
摘要由CSDN通过智能技术生成

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值