tkinter: 基本+Button+Layout

news/2024/5/10 14:25:44/文章来源:https://blog.csdn.net/xiangsimoyinjiu/article/details/128339691

简介

简介

  • Tcl
    • 动态解释型编程语言
    • 可独立执行,多嵌入C程序中作为脚本引擎,或者作为使用Tk工具包的接口
    • Tcl库可以创建一个或多个Tcl解释器实例,然后在这些实例上运行C或Tcl命令和脚本
    • 每个解释器有一个事件队列,接受事件并处理他们
  • Tk
    • 用C语言实现的一个Tcl包
    • 添加了自定义命令创建和操作GUI组件
    • 是唯一一个专门为高级动态语言(如 Python、 Tcl、 Ruby、 Perl 等)设计的跨平台(Windows、 Mac、 Unix)图形用户界面工具包
    • Tk的组件可以支持丰富的自定义,但风格比较过时
    • 使用Tcl的事件队列生成和处理GUI事件
  • Ttk
    • 主体化Tk(Themed Tk)
    • 相比经典Tk,提供更新的Tk组件,提供更好的样式
  • Tkinter是Python 的标准 Tk GUI 工具包的接口,可以实现简单的跨平台GUI程序
  • Tkinter 是 Python 内置的标准 GUI 库,无需额外安装
  • Python2.x 版本使用的库名为 Tkinter
  • Python3.x 版本使用的库名为 tkinter

参考

Python GUI编程(Tkinter) 菜鸟教程
TkDocs
TkDocs Tutorial
TkDocs reference
Python interface to Tcl/Tk
Tk Commands

Button

Python2.x vs Python3.x

Python2.xPython3.x
Tkintertkinter
ScrolledTexttkinter.scrolledtext
ttktkinter.ttk
tkMesageBoxtkinter.messagebox
tkAxxBxxtkinter.axxbxx
  • 导入tkinter,处理下python2和python3的差异
  • 继承Frame Class,初始化Frame,初始化其他参数
  • 获取屏幕大小,设置App大小为屏幕大小的百分之80
  • 设置App标题
  • 以自身为master创建控件,配置控件,监听处理控件事件
  • 放置控件,pack()或grid()或place()
  • 程序进入主循环,显示程序mainloop()

在这里插入图片描述

#!/usr/bin/env python
# -*- coding: utf-8 -*-import sysif sys.version_info[0] < 3:import Tkinter as tk     ## Python 2.ximport tkFont as tk_fontimport tkMessageBox as tk_messagebox
else:import tkinter as tk     ## Python 3.ximport tkinter.font as tk_fontimport tkinter.messagebox as tk_messageboxclass App(tk.Frame):def __init__(self, master=None):tk.Frame.__init__(self, master)self.font = tk_font.Font(family='Helvetica', size=36, weight='bold')self.config(bg='black')self.setScreenSize()# self        = tk.Frame()# self.master = tk.Tk()self.master.title("ButtonTest")self.createWidgets()def setScreenSize(self):ratio = 0.8screen_h = self.master.winfo_screenheight()screen_w = self.master.winfo_screenwidth()# print(screen_h, screen_w)app_h = round(screen_h * ratio)app_w = round(screen_w * ratio)y = round(screen_h * (1 - ratio) / 2.0)x = round(screen_w * (1 - ratio) / 2.0)geometry = '' + str(app_w) + 'x' + str(app_h) + '+' + str(x) + '+' + str(y)# print(geometry)self.master.geometry(geometry)def createWidgets(self):self.button = tk.Button(self, text="hello", bg="red", fg="#0000FF", font=self.font, command=self.helloCallBack)self.draw()def helloCallBack(self):tk_messagebox.showinfo("Title", "Message")def draw(self):self.pack(padx=50, pady=50)self.button.pack(padx=50, pady=50)self.mainloop()if __name__ == '__main__':App()

Layout

我们尝试实现一个如下的布局来学习tkinter的布局

在这里插入图片描述

pack

pack CMD
anchor + side定位

  • anchor
    • 组件放在父组件的什么位置,上下左右搭配8个方向,然后还有中间
    • s要搭配side=bottom,不然跟n效果一样
  • side
    • 放在上一个组件的上下左右,比如left,就是放在上一个组件左边

在这里插入图片描述

#!/usr/bin/env python
# -*- coding: utf-8 -*-import sys
import randomif sys.version_info[0] < 3:import Tkinter as tk     ## Python 2.ximport tkMessageBox as tk_messagebox
else:import tkinter as tk     ## Python 3.ximport tkinter.messagebox as tk_messageboxclass App(tk.Frame):def __init__(self, master=None):tk.Frame.__init__(self, master)self.master.title("pack")self.font = 'Times 20 bold'self.config(height=600, width=600)self.createWidgets()def createWidgets(self):self.createFrame1()self.createFrame2()self.createFrame3()self.draw()def createFrame1(self):frame = tk.Frame(self, height=200, width=800)self.createBtn(frame, anchor='NW')self.createBtn(frame, anchor='N')self.createBtn(frame, anchor='NE')frame.pack()frame.pack_propagate(0)def createFrame2(self):frame = tk.Frame(self, height=200, width=800)self.createBtn(frame, anchor='W', side='left')self.createBtn(frame, anchor='CENTER', side=None)self.createBtn(frame, anchor='E', side='right')frame.pack()frame.pack_propagate(0)def createFrame3(self):frame = tk.Frame(self, height=200, width=800)self.createBtn(frame, anchor='SW', side='bottom')self.createBtn(frame, anchor='S', side='bottom')self.createBtn(frame, anchor='SE', side='bottom')frame.pack(side='bottom')frame.pack_propagate(0)def createBtn(self, parent, anchor, side='top'):bg = self.getRandColor()frame = tk.Frame(parent, height=200, width=200, bg=bg)button = tk.Button(frame, text=anchor)frame.pack(side='left')frame.pack_propagate(0)if(anchor == 'CENTER'):button.pack(padx=50, pady=50, expand=True)else:button.pack(anchor=anchor.lower(), side=side)def getRandColor(self):return '#' + self.getRandRGB() + self.getRandRGB() + self.getRandRGB()def getRandRGB(self):return '{:02X}'.format(random.randint(0, 255))def helloCallBack(self):tk_messagebox.showinfo("Title", "Message")def draw(self):self.pack()self.pack_propagate(0)self.mainloop()if __name__ == '__main__':App()

假设我只想用一个Frame,就会显得很奇怪

在这里插入图片描述

#!/usr/bin/env python
# -*- coding: utf-8 -*-import sys
import randomif sys.version_info[0] < 3:import Tkinter as tk     ## Python 2.ximport tkMessageBox as tk_messagebox
else:import tkinter as tk     ## Python 3.ximport tkinter.messagebox as tk_messageboxclass App(tk.Frame):def __init__(self, master=None):tk.Frame.__init__(self, master)self.master.title("pack")self.font = 'Times 20 bold'self.config(height=600, width=600)self.createWidgets()def createWidgets(self):self.createBtn(self, anchor='W', side='left')self.createBtn(self, anchor='NW', side='top')self.createBtn(self, anchor='N', side='top')self.createBtn(self, anchor='NE', side='top')self.createBtn(self, anchor='CENTER', side='bottom')self.createBtn(self, anchor='SW', side='bottom')self.createBtn(self, anchor='S', side='bottom')self.createBtn(self, anchor='SE', side='bottom')self.createBtn(self, anchor='E', side='right')self.draw()def createBtn(self, parent, anchor, side='top'):bg = self.getRandColor()button = tk.Button(parent, text=anchor, bg=self.getRandColor())if(anchor == 'CENTER'):button.pack(padx=50, pady=50, expand=True)else:button.pack(anchor=anchor.lower(), side=side)def getRandColor(self):return '#' + self.getRandRGB() + self.getRandRGB() + self.getRandRGB()def getRandRGB(self):return '{:02X}'.format(random.randint(0, 255))def helloCallBack(self):tk_messagebox.showinfo("Title", "Message")def draw(self):self.pack()self.pack_propagate(0)self.mainloop()if __name__ == '__main__':App()

place

  • x,y
    • 绝对定位
  • relx,rely
    • 相对定义,relx=0就是最左,relx=1就是最右

在这里插入图片描述

#!/usr/bin/env python
# -*- coding: utf-8 -*-import sys
import randomif sys.version_info[0] < 3:import Tkinter as tk     ## Python 2.ximport tkMessageBox as tk_messagebox
else:import tkinter as tk     ## Python 3.ximport tkinter.messagebox as tk_messageboxclass App(tk.Frame):def __init__(self, master=None):tk.Frame.__init__(self, master)self.master.title("pack")self.font = 'Times 20 bold'self.config(height=600, width=600)self.createWidgets()def createWidgets(self):self.createBtn(0, 0, 'nw')self.createBtn(0.5, 0, 'n')self.createBtn(1, 0, 'ne')self.createBtn(0, 0.5, 'w')self.createBtn(0.5, 0.5, 'center')self.createBtn(1, 0.5, 'e')self.createBtn(0, 1, 'sw')self.createBtn(0.5, 1, 's')self.createBtn(1, 1, 'se')self.draw()def createBtn(self, x, y, anchor):button = tk.Button(self, text='(' + str(x) + ', ' + str(y) + ')', bg=self.getRandColor())button.place(relx=x, rely=y, anchor=anchor)def getRandColor(self):return '#' + self.getRandRGB() + self.getRandRGB() + self.getRandRGB()def getRandRGB(self):return '{:02X}'.format(random.randint(0, 255))def draw(self):self.pack()self.pack_propagate(0)self.mainloop()if __name__ == '__main__':App()

grid

这个就是css中的table,比较简单了

  • row,rowspan
  • column,columnspan
  • sticky
    • 组件大小小于父组件时怎么填充父组件
    • nesw:水平垂直都拉伸填充
    • ns:垂直填充
    • ew:水平填充

在这里插入图片描述

#!/usr/bin/env python
# -*- coding: utf-8 -*-import sys
import randomif sys.version_info[0] < 3:import Tkinter as tk     ## Python 2.ximport tkMessageBox as tk_messagebox
else:import tkinter as tk     ## Python 3.ximport tkinter.messagebox as tk_messageboxclass App(tk.Frame):def __init__(self, master=None):tk.Frame.__init__(self, master)self.master.title("pack")self.font = 'Times 20 bold'# self.config(height=600, width=600)self.createWidgets()def createWidgets(self):self.createBtn(0, 0, 1, 2)self.createBtn(0, 2, 2, 1)self.createBtn(1, 0, 2, 1)self.createBtn(1, 1)self.createBtn(2, 1, 1, 2)self.draw()def createBtn(self, row, col, rowspan = 1, colspan = 1):button = tk.Button(self, text='(' + str(row) + ', ' + str(col) + ')', bg=self.getRandColor(), width=20, height=8)button.grid(row=row, column=col, rowspan=rowspan, columnspan=colspan, sticky="nesw")def getRandColor(self):return '#' + self.getRandRGB() + self.getRandRGB() + self.getRandRGB()def getRandRGB(self):return '{:02X}'.format(random.randint(0, 255))def draw(self):self.pack()self.pack_propagate(0)self.mainloop()if __name__ == '__main__':App()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_236311.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享10个比B站更刺激的网站,千万别轻易点开

作为一个码龄8年程序员&#xff0c;到现在还能保持着浓密的头发和健壮的身体&#xff0c;全靠这10个网站让我健&#xff08;偷&#xff09;康&#xff08;偷&#xff09;生&#xff08;摸&#xff09;活&#xff08;鱼&#xff09;&#xff0c;今天就把我收藏夹里的网站无私分享…

【实时数仓】在Hbase建立维度表、保存维度数据到Hbase、保存业务数据到kafka主题

文章目录一 分流Sink之建立维度表到HBase(Phoenix)1 拼接建表语句&#xff08;1&#xff09;定义配置常量类&#xff08;2&#xff09;引入依赖&#xff08;3&#xff09;hbase-site.xml&#xff08;4&#xff09;在phoenix中执行&#xff08;5&#xff09;增加代码a TableProc…

用Python写一个模拟qq聊天小程序的代码实例

前言 今天小编就为大家分享一篇关于用Python写一个模拟qq聊天小程序的代码实例&#xff0c;小编觉得内容挺不错的&#xff0c;现在分享给大家&#xff0c;具有很好的参考价值&#xff0c;需要的朋友一起跟随小编来看看吧 Python 超简单的聊天程序 客户端: 服务器: 模拟qq聊…

张驰咨询:快速提高流程效率的5个关键精益生产工具

精益&#xff0c;又称“精益制造”或“精益生产”&#xff0c;注重通过消除浪费、消除缺陷&#xff0c;实现客户价值最大化。精益工具是关于理解过程&#xff0c;发现浪费&#xff0c;防止错误和记录你所做的事情。 让我们来看看流程改进中使用的五种精益工具&#xff0c;它们…

对 CSS 工程化的理解

CSS 工程化是为了解决以下问题&#xff1a; 宏观设计&#xff1a;CSS 代码如何组织、如何拆分、模块结构怎样设计&#xff1f;编码优化&#xff1a;怎样写出更好的 CSS&#xff1f;构建&#xff1a;如何处理我的 CSS&#xff0c;才能让它的打包结果最优&#xff1f;可维护性&a…

ReplicaSet和Deployment

ReplicaSet和Deployment 写在前面 语雀原文阅读效果更佳&#xff1a;198 ReplicaSet和Deployment 语雀 《198 ReplicaSet和Deployment》 1、ReplicaSet 假如我们现在有一个 Pod 正在提供线上的服务&#xff0c;我们来想想一下我们可能会遇到的一些场景&#xff1a; 某次运营…

计算机毕业设计django基于python大学生多媒体学习系统

项目介绍 随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的大学生多媒体学习系统的平台,这样可以有效地解决数据学习系统混乱的局面。 本文首先介绍了大学生多媒体学习系统的发…

加密与认证技术

加密与认证技术密码技术概述密码算法与密码体制的基本概念加密算法与解密算法秘钥的作用什么是密码密钥长度对称密码体系对称加密的基本概念典型的对称加密算法DES加密算法3DES加密算法非对称密码体系非对称加密基本概念密码技术概述 密码技术是保证网络安全的核心技术之一&am…

Jmeter(十六):jmeter场景的运行架构(本地运行和远程运行)配置远程负载机

jmeter场景的运行架构(本地运行和远程运行) 运行方式&#xff1a; GUI运行&#xff1a;通过图形界面方式运行&#xff0c;该运行方式的可视化界面及监听器动态展示 结果都比较消耗负载机资源&#xff0c;建议大并发时不用&#xff0c;一般进行脚本调试&#xff1b; 命令行运行…

Jina 开箱即用的云原生多模态系统解决方案

Jina 是一个基于云原生的多模态应用框架&#xff0c;开发者使用 Jina 可以轻松构建、部署和维护高性能的云原生应用。你可能认为这些都只是空泛的营销口号&#xff0c;甚至产生疑问&#xff0c;到底什么是云原生&#xff1f;对构建多模态应用有什么帮助&#xff1f;它是否只是 …

2022年总结:道阻且长,行则将至

前言 今年是第四个年头写总结了&#xff0c;直到这个时候&#xff0c;我仍未想出今年的标题是什么。 2019年总结&#xff0c;平凡的我仍在平凡的生活 2020年总结&#xff0c;所有努力只为一份期待 2021年总结&#xff1a;前路有光&#xff0c;初心莫忘 如果非得用一句话来…

Spark 3.0 - 12.ML GBDT 梯度提升树理论与实战

目录 一.引言 二.GBDT 理论 1.集成学习 2.分类 & 回归问题 3.梯度提升 4.GBDT 生成 三.GBDT 实战 1.数据准备 2.构建 GBDT Pipeline 3.预测与评估 四.总结 一.引言 关于决策树前面已经介绍了常规决策树与随机森林两种类型的知识&#xff0c;本文主要介绍梯度提…

微服务调用工具

微服务调用工具目录概述需求&#xff1a;设计思路实现思路分析1.A2.B3.C参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive…

华为二面,原来是我对自动化测试的理解太肤浅了..

如何使用Python实现自动化测试 如果你入职一家新的公司&#xff0c;领导让你开展自动化测试&#xff0c;作为一个新人&#xff0c;你肯定会手忙脚乱&#xff0c;你会如何落地自动化测试呢&#xff1f;资深测试架构师沉醉将告诉你如何落地自动kan化测试&#xff0c;本次话题主要…

事业编招聘:南方科技大学附属实验学校2022年·面向应届毕业生招聘在编教师公告

南方科技大学是在中国高等教育改革发展背景下创建的一所高起点公办创新型大学&#xff0c;2022年2月14日&#xff0c;教育部等三部委公布第二轮“双一流”建设高校及建设学科名单&#xff0c;南方科技大学入选“双一流”建设高校名单。 南方科技大学附属实验学校&#xff0c;地…

大学生静态HTML网页源码 我的校园网页设计成品 学校班级网页制作模板 web课程设计 dreamweaver网页作业

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)

&#x1f4cc; 博客主页&#xff1a; 程序员二黑 &#x1f4cc; 专注于软件测试领域相关技术实践和思考&#xff0c;持续分享自动化软件测试开发干货知识&#xff01; &#x1f4cc; 公号同名&#xff0c;欢迎加入我的测试交流群&#xff0c;我们一起交流学习&#xff01; 目录…

艾美捷CpG ODN——ODN 1720 (TLRGRADE)说明书

艾美捷CpG ODN系列——ODN 1720 (TLRGRADE)&#xff1a;具有硫代磷酸酯骨架的GpC寡脱氧核苷酸。 艾美捷CpG ODN 丨ODN 1720 (TLRGRADE)化学性质&#xff1a; 序列&#xff1a;5-tccatgagcttcctgatgct-3&#xff08;小写字母表示硫代磷酸酯键&#xff09;。 MW&#xff1a;638…

MySQL -2 指令

客户端SQL指令记录&#xff1a; -- 针对 数据库和针对数据表 &#xff08;一&#xff09;数据库 1. 查看当前所有数据库&#xff1a;show databases; 2. 创建数据库&#xff1a;create database 数据库名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 3. 删除数据库&#…

微信公众号开发——实现用户微信网页授权流程

&#x1f60a; 作者&#xff1a; 一恍过去&#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390&#x1f38a; 社区&#xff1a; Java技术栈交流&#x1f389; 主题&#xff1a; 微信公众号开发——实现用户微信网页授权流程⏱️ 创作时间&#xff1a; …