#!/usr/bin/env python # -*- coding: utf-8 -*- from tkinter import * import hashlib import time LOG_LINE_NUM = 0 class MainGUI(object): def __init__(self, init_window_name): self.init_window_name = init_window_name self.init_datas() #################################数据定义############################################################# def init_datas(self): self.light_list = ["1000Lux_SME_D65_EV_0", "1000Lux_SME_D65_EV_10", "1000Lux_SME_D65_EV_20", "100Lux_SME_A_EV_0", "20Lux_SME_A_EV_0", "5Lux_SME_A_EV_0", "1Lux_SME_H_EV_0"] self.right_list = ["1000Lux_SME_D65_EV_01", "1000Lux_SME_D65_EV_10", "1000Lux_SME_D65_EV_01"] #############################################GUI设置########################################### # 设置窗口 def set_init_window(self): self.winTitle() self._centerWindow(400, 500) self._setWindowStyle() # menu self.menu() # 全局标志 self.golbalInit() # title self.clientTitle() # 布局 self.initFrame() # 日志 self.initLog() def winTitle(self): self.init_window_name.title("标题") # 窗口名 def _centerWindow(self, width, height): sw = self.init_window_name.winfo_screenwidth() # 得到屏幕宽度 sh = self.init_window_name.winfo_screenheight() # 得到屏幕高度 x = (sw - width) / 2 y = (sh - height) / 2 self.init_window_name.geometry("%dx%d+%d+%d" % (width, height, x, y)) def _setWindowStyle(self): self.init_window_name["bg"] = "gray" # 窗口背景色,其他背景色见:blog.csdn.net/chl0000/article/details/7657887 self.init_window_name.attributes("-alpha", 0.9) # 虚化,值越小虚化程度越高 def golbalInit(self): self.RadioList = IntVar() # IntVar 是tkinter的一个类,可以管理单选按钮 self.CheckList = IntVar() def clientTitle(self): ###定义一个`label`显示`on the window` self.fm1 = Frame(self.init_window_name) self.titleLabel = Label(self.fm1, text='video-captioning system') self.titleLabel.pack() self.fm1.pack(side=TOP) # 菜单 def menu(self): ##创建一个菜单栏,这里我们可以把他理解成一个容器,在窗口的上方 menubar = Menu(self.init_window_name) # 菜单一 filemenu = Menu(menubar, tearoff=0) # 一级菜单 menubar.add_cascade(label='File', menu=filemenu) # 二级菜单 filemenu.add_command(label='New', command=self.do_job) filemenu.add_command(label='Open', command=self.do_job) filemenu.add_separator() # 分割线 filemenu.add_command(label='Exit', command=self.init_window_name.quit) # 菜单二 editmenu = Menu(menubar, tearoff=0) # 一级菜单 menubar.add_cascade(label='Edit', menu=editmenu) # 二级菜单 editmenu.add_command(label='Cut', command=self.do_job) editmenu.add_command(label='Paste', command=self.do_job) # # 菜单一子菜单 submenu = Menu(filemenu) # 一级菜单 filemenu.add_cascade(label='Import', menu=submenu, underline=0) # 二级菜单 submenu.add_command(label='Submeau1', command=self.do_job) submenu.add_command(label='Submeau1', command=self.do_job) self.init_window_name.config(menu=menubar) # 日志 def initLog(self): self.frame2 = Frame(self.init_window_name, width=1068) self.log_data_Text = Text(self.frame2, width=1068, height=9) self.log_data_Text.pack(side=TOP) # 日志框 self.frame2.pack(side=TOP) # 布局 def initFrame(self): # 左右Frame self.fm2 = Frame(self.init_window_name) self.fm2_left = Frame(self.fm2) self.fm2_right = Frame(self.fm2) self.fm2_left_top = Frame(self.fm2_left) self.fm2_left_bottom = Frame(self.fm2_left) self.v = [] for i in range(0, len(self.light_list)): self.v.append(IntVar()) checkbox = Checkbutton(self.fm2_left_top, text=self.light_list[i], variable=self.v[-1], onvalue=i + 1, command=self.showSelection) checkbox.pack(side=TOP) self.fm2_left_top.pack(side=TOP) self.fm2_left.pack(side=LEFT) for m in range(0, len(self.right_list)): radiobutton = Radiobutton(self.fm2_right, text=self.right_list[m], variable=self.RadioList, value=m, command=self.do_job) radiobutton.pack(side=TOP) self.nextVideoButton = Button(self.fm2_right, text='Run', command=self.run) self.nextVideoButton.pack() self.fm2_right.pack(side=LEFT) self.fm2.pack(side=TOP) # variable=从属的“管理类” value=索引/ID self.RadioList.set(0) # self.CheckList.set(0) ##################################功能函数###################################################################### def str_trans_to_md5(self): src = self.init_data_Text.get(1.0, END).strip().replace("\n", "").encode() # print("src =",src) if src: try: myMd5 = hashlib.md5() myMd5.update(src) myMd5_Digest = myMd5.hexdigest() # print(myMd5_Digest) # 输出到界面 self.result_data_Text.delete(1.0, END) self.result_data_Text.insert(1.0, myMd5_Digest) self.write_log_to_Text("INFO:str_trans_to_md5 success") except: self.result_data_Text.delete(1.0, END) self.result_data_Text.insert(1.0, "字符串转MD5失败") else: self.write_log_to_Text("ERROR:str_trans_to_md5 failed") def do_job(self): # global counter # l.config(text='do ' + str(counter)) # counter += 1 choice = "你的选择是: " + self.right_list[self.RadioList.get()] self.write_log_to_Text("INFO:{} success".format(choice)) def showSelection(self): seleds = [] for i in self.v: if i.get() > 0: seleds.append(self.light_list[i.get() - 1]) for seld in seleds: self.write_log_to_Text("INFO:{} success".format(seld)) def run(self): self.write_log_to_Text("INFO:{} success".format("RUN")) # 获取当前时间 def get_current_time(self): current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) return current_time # 日志动态打印 def write_log_to_Text(self, logmsg): global LOG_LINE_NUM current_time = self.get_current_time() logmsg_in = str(current_time) + " " + str(logmsg) + "\n" # 换行 if LOG_LINE_NUM <= 8: self.log_data_Text.insert(END, logmsg_in) LOG_LINE_NUM = LOG_LINE_NUM + 1 else: self.log_data_Text.delete(1.0, 2.0) self.log_data_Text.insert(END, logmsg_in) #############################################启动函数########################################## def gui_start(): init_window = Tk() # 实例化出一个父窗口 ZMJ_PORTAL = MainGUI(init_window) # 设置根窗口默认属性 ZMJ_PORTAL.set_init_window() init_window.mainloop() # 父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示 #################################主函数################################################ if __name__ == '__main__': gui_start()
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
· 全程使用 AI 从 0 到 1 写了个小工具