python-tkinter 自定义tkinter风格的提示框

博客园的密码终于找回了

前言

偶尔使用python要绘制个简单输入提示框或者复选框窗体,使用tkinter的话绘制窗体也是很麻烦的,想着能不能把它自定义一个简单可复用的提示框。然后便动手写了一下,效果还可以

python;gutter:true; import tkinter as tk from tkinter import ttk,messagebox</p> <p>class Dialog(): def <strong>init</strong>(self): self.master=tk.Toplevel() self.master.withdraw() self.style=ttk.Style() self.master["background"]="#ffffff" self.style.configure("G.TLabel",font=('微软雅黑',11),foreground='#00bbcc',background="#ffffff") self.style.configure('G.TFrame',background='#ffffff') self.style.configure("G.TCheckbutton",background="#ffffff") self.style.configure("G.TButton",background="#2b6e99",borderwidth=4) self.top=ttk.Frame(self.master,style="G.TFrame") self.middle=ttk.Frame(self.master,style="G.TFrame") self.bottom=ttk.Frame(self.master) self.top.pack(padx=10,fill="x") self.middle.pack(padx=10,pady=5,fill="x") self.bottom.pack(fill="both") self.result=None</p> <pre><code>def show(self): self.master.update() self.width,self.height=self.master.winfo_reqwidth(),self.master.winfo_reqheight() self.x,self.y=(self.master.winfo_screenwidth()-self.width)/2,(self.master.winfo_screenheight()-self.height)/2 self.master.resizable(False,False) self.master.wm_attributes("-topmost",1) self.master.geometry('%dx%d+%d+%d' % (self.width, self.height, self.x, self.y)) self.master.deiconify() self.master.grab_set() self.master.wait_window() return self.result def builder(self): return self def exit(self): self.master.destroy() def addConfirmCancelBtn(self): self.confirmBtn=ttk.Button(self.bottom,text="提交",style="G.TButton",command=self.confirm) self.confirmBtn.grid(row=0,column=0,padx=10,pady=10) self.cancelBtn=ttk.Button(self.bottom,text="取消",style="G.TButton",command=self.cancel) self.cancelBtn.grid(row=0,column=1,padx=10,pady=10) def addYesNoBtn(self): self.confirmBtn=ttk.Button(self.bottom,text="是",style="G.TButton",command=self.yes) self.confirmBtn.grid(row=0,column=0,padx=10,pady=10) self.cancelBtn=ttk.Button(self.bottom,text="否",style="G.TButton",command=self.no) self.cancelBtn.grid(row=0,column=1,padx=10,pady=10) def addOkBtn(self): tk.Label(self.bottom,width=10).grid(row=0,column=0,padx=5,pady=5) self.cancelBtn=ttk.Button(self.bottom,text="确定",style="G.TButton",command=self.ok) self.cancelBtn.grid(row=0,column=1,padx=5,pady=5) def confirm(self): pass def cancel(self): pass def ok(self): pass def yes(self): pass def no(self): pass </code></pre> <p>class InputDialog(Dialog): def <strong>init</strong>(self,title,dic): super().<strong>init</strong>() self.master.title(title) self.title=ttk.Label(self.top,text=title,style="G.TLabel") self.title.pack(fill="x") self.dic=dic</p> <pre><code>def builder(self): keys=list(self.dic.keys()) for i in range(0,len(keys)): key=keys[i] val=self.dic[key] self.dic[key+"-k"]=tk.Label(self.middle,text=key,font=('微软雅黑',10),bg="#ffffff") self.dic[key+"-k"].grid(row=i,column=0,sticky="w") self.dic[key+"-v"]=tk.StringVar() self.dic[key+'-v'].set(val['text']) if val['type']=='password': ttk.Entry(self.middle,width=20,textvariable=self.dic[key+'-v'],show='*').grid(row=i,column=1,columnspan=2) else: ttk.Entry(self.middle,width=20,textvariable=self.dic[key+'-v']).grid(row=i,column=1,columnspan=2) self.addConfirmCancelBtn() return self def confirm(self): keys=list(self.dic.keys()) for key in keys: if "-k" in key: del self.dic[key] if '-v' in key: val=self.dic[key].get() self.dic[str(key).strip("-v")]['text']=val del self.dic[key] self.result=self.dic self.exit() def cancel(self): self.result=None self.exit() </code></pre> <p>class AlertDialog(Dialog): def <strong>init</strong>(self,title,text): super().<strong>init</strong>() self.title=title self.text=text def show(self): return messagebox.showinfo(self.title,self.text)</p> <p>class CheckButtonDialog(Dialog): def <strong>init</strong>(self,title,dic): super().<strong>init</strong>() self.master.title(title) self.title = ttk.Label(self.top, text=title,style="G.TLabel") self.title.pack(fill="x") self.dic=dic def builder(self): self.keys=list(self.dic.keys()) for key in self.keys: self.dic[key+"-c"]=tk.IntVar() self.dic[key+"-c"].set(self.dic[key]["state"]) ttk.Checkbutton(self.middle,text=key,variable=self.dic[key+"-c"],style="G.TCheckbutton").pack(pady=2,anchor="w",padx=10) self.addOkBtn() return self</p> <pre><code>def ok(self): for key in self.keys: state=self.dic[key+"-c"].get() self.dic[key]["state"]=state del self.dic[key+"-c"] self.result=self.dic self.exit() </code></pre> <p>if <strong>name</strong> =="<strong>main</strong>": root = tk.Tk() tk.Button(root, text='对话框', command=lambda:print(AlertDialog("对话框举例","hello world").builder().show())).pack(pady=5) tk.Button(root,text="输入框",command=lambda:print(InputDialog("输入框举例",{"用户名":{"text":"零度热冰","type":"text"},"密码":{"text":"123456","type":"password"}}).builder().show())).pack(pady=5) tk.Button(root,text="多选框",command=lambda :print(CheckButtonDialog("多选框举例",{"CSDNCSDNCSDN":{"state":1},"博客园":{"state":0},"CSDN1":{"state":1},"博客园2":{"state":0}}).builder().show())).pack(pady=5) root.mainloop()

看看输入框效果

python-tkinter 自定义tkinter风格的提示框

基本和tkinter提示框的风格差不多,但是唯一不好的是ttk button 的boderwidth属性好像不起作用

python-tkinter 自定义tkinter风格的提示框

show()之后会返回最终的结果

多选框效果

python-tkinter 自定义tkinter风格的提示框

Original: https://www.cnblogs.com/lingdurebing/p/python-tkiner.html
Author: 零度热冰
Title: python-tkinter 自定义tkinter风格的提示框

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/599294/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 设计模式之适配器模式

    一、适配器模式:把两个不匹配的接口通过一个中间层变成可匹配的,这个中间层叫适配器,比如两脚插头+三脚插座无法进行匹配,可使用一个转接头来结合使用,这个转接头就是适配器。 二、实现思…

    数据库 2023年6月14日
    071
  • Fork/Join框架

    我们要使用ForkJoin框架,必须首先创建一个ForkJoin任务。它提供在任务中执行 fork()和 join() 操作的机制,通常情况下我们不需要直接继承ForkJoinTa…

    数据库 2023年6月14日
    082
  • MySQL8新增降序索引

    MySQL8新增降序索引 桃花坞里桃花庵,桃花庵里桃花仙。桃花仙人种桃树,又摘桃花卖酒钱。 一、MySQL5.7 降序索引 MySQL 在语法上很早就已经支持降序索引,但实际上创建…

    数据库 2023年5月24日
    082
  • 自然语言处理NLP与深度学习(学习笔记)

    自然语言处理NLP与深度学习(学习笔记) 字母转有声调的字母 Jieba词性标注集 a 形容词 ad 副形词 an 名形词 ag 形容词性语素 al 形容词性惯用语 区别词(1个一…

    数据库 2023年6月15日
    077
  • 此计算机缺少”vc2005_spl_with_atl_fix_redist”解决问题

    1、安装loadrunner提示:此计算机缺少 vc2005_spl_with_atl_fix_redist 2、进入目录,点击vcredist_x86.exe,对组件进行安装:E…

    数据库 2023年6月14日
    0104
  • 10、RestTemplate方式实现远程调用Client

    一、JSONObject类详解: JSONobject是FastJson提供的对象,在API中是用一个私有的常量map进行封装的,实际就是一个map,只不过 FastJson对其进…

    数据库 2023年6月6日
    090
  • 记一次血淋淋的MySQL崩溃修复案例

    摘要:今天给大家带来一篇MySQL数据库崩溃的修复案例 问题描述 研究MySQL源代码,调试并压测MySQL源代码时,MySQL崩溃了!问题是它竟然崩溃了!而且还损坏了InnoDB…

    数据库 2023年5月24日
    0114
  • JVM-方法区

    方法区 JAVA技术交流群:737698533 方法区是运行时数据区的最后一个内容,Method Area 栈,堆,方法区中的交互关系 方法区简述 方法区(Method Area)…

    数据库 2023年6月16日
    086
  • Redis缓存穿透 缓存击穿 解析

    先解析一下Redis中什么叫做 缓存穿透 和 缓存击穿: 缓存穿透:首先我们要明确概念,缓存穿透是 在查询数据时 查询的数据在 redis 和 DB中都没有的 叫做缓穿透,解决方案…

    数据库 2023年6月9日
    084
  • MySQL特性:ICP,Index Condition Pushdown

    ICP,Index Condition Pushdown 理解ICP特性前,先去前面理解MRR特性,了解where条件中的三阶段提取: index key、index filter…

    数据库 2023年6月16日
    078
  • SQL的约束

    概念:约束是作用于表中的字段以限制表中数据存储的规则 [En] concept: constraints are rules that act on fields in a tab…

    数据库 2023年5月24日
    099
  • SpringCloudAlibaba 实战

    SpringCloudAlibaba 实战 服务发现Nacos 服务发现原理 负载均衡Ribbon 细粒度修改Ribbon负载均衡规则 指定Ribbon全局负载均衡规则 配置Rib…

    数据库 2023年6月6日
    0109
  • 2022-8-15 数据库 mysql 第一天

    Mysql数据库 数据库 数据库[根据数据结构组织、存储和管理数据的仓库]。它是有组织的、可共享的、统一管理的大量数据的集合,这些数据长期存储在计算机中。 [En] Databas…

    数据库 2023年5月24日
    064
  • mybatis SelectKey解析

    1.selectKey介绍及作用 resultType:sql返回的java类型 statementType:STATEMENT|PREPARED|CALLABLE三种默认PREP…

    数据库 2023年6月16日
    099
  • Python–模块Module

    1、定义模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件,(文件名:test.py,对应的模块名test)包:用来…

    数据库 2023年6月9日
    084
  • linux-centos常用命令

    01-centos-常用命令 1.centos防火墙 关闭 systemctl stop firewalld 禁止开机启动防火墙 systemctl disable firewal…

    数据库 2023年6月11日
    098
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球