tkinter: 基本+Button+Layout

news2025/1/18 11:57:45

简介

简介

  • 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 sys

if sys.version_info[0] < 3:
    import Tkinter as tk     ## Python 2.x
    import tkFont as tk_font
    import tkMessageBox as tk_messagebox
else:
    import tkinter as tk     ## Python 3.x
    import tkinter.font as tk_font
    import tkinter.messagebox as tk_messagebox


class 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.8
		screen_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 random

if sys.version_info[0] < 3:
    import Tkinter as tk     ## Python 2.x
    import tkMessageBox as tk_messagebox
else:
    import tkinter as tk     ## Python 3.x
    import tkinter.messagebox as tk_messagebox


class 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 random

if sys.version_info[0] < 3:
    import Tkinter as tk     ## Python 2.x
    import tkMessageBox as tk_messagebox
else:
    import tkinter as tk     ## Python 3.x
    import tkinter.messagebox as tk_messagebox


class 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 random

if sys.version_info[0] < 3:
    import Tkinter as tk     ## Python 2.x
    import tkMessageBox as tk_messagebox
else:
    import tkinter as tk     ## Python 3.x
    import tkinter.messagebox as tk_messagebox


class 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 random

if sys.version_info[0] < 3:
    import Tkinter as tk     ## Python 2.x
    import tkMessageBox as tk_messagebox
else:
    import tkinter as tk     ## Python 3.x
    import tkinter.messagebox as tk_messagebox


class 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.coloradmin.cn/o/93426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

未来5年,Python发展前景如何?什么方向最吃香?

有同学提问——请问就未来3到5年来讲&#xff0c;python的发展趋势如何&#xff1f;我要不要深学下去&#xff1f;如果学建议从事python的哪个方向&#xff1f; 今天我们就来看一下一线技术人员的分析与解答。 因为一直在开发一线工作&#xff0c;经历了好些环节&#xff0c;…

PyTorch可视化工具Visdom教程

文章目录什么是visdom安装和启动安装启动可视化折线图Line什么是visdom visdom是Facebook为PyTorch开发可视化工具,支持numpy和tensor&#xff0c;功能和Tensorboard差不多&#xff0c;在三维空间数据展示十分出色&#xff0c;其次可以远程访问&#xff0c;随时随地观察训练效…

Linux 网络流量监控工具

Linux 网络流量监控 Linux 网络流量监控是捕获和分析企业的 Linux 网络流量的过程。 为什么要监控 Linux 网络流量 深入了解网络流量对于测量和管理带宽使用情况非常重要。分析 Linux 网络流量有助于识别带宽瓶颈、最高用量者和其他可能影响网络性能的网络问题。 Linux 网络…

Java+MySQL基于SSM的物流公司物流订单管理系统 毕业设计

随着我国经济的高速增长,物流快递的数量也在不断的增加,同时面临的就是如何更加方便快捷和高效的管理物流订单的问题,传统模式的物流订单管理模式明显已经不能够满足当下的需求,于是我们提出了基于B/S的贴心物流公司物流订单管理系统的设计与开发。 用户登录界面 本课题是一个…

vue框架甘特图控件(dhtmlxGantt)

官网JavaScript UI Framework - HTML5 Controls Library - DHTMLXJavaScript UI framework for high-speed web and mobile app development with customizable HTML5 UI controls. Free trial version available.https://dhtmlx.comGit及实例 GitHub - DHTMLX/gantt: GPL ver…

LC-1751. 最多可以参加的会议数目 II(动态规划)

1751. 最多可以参加的会议数目 II 难度困难69 给你一个 events 数组&#xff0c;其中 events[i] [startDayi, endDayi, valuei] &#xff0c;表示第 i 个会议在 startDayi 天开始&#xff0c;第 endDayi 天结束&#xff0c;如果你参加这个会议&#xff0c;你能得到价值 valu…

用 Pandas 处理结构不佳的 Excel 文件

简介 用pandas很容易读取Excel文件并将数据转换为DataFrame。然而现实世界中的Excel文件往往构造不佳&#xff0c;在那些数据散落在工作表中的情况下&#xff0c;你可能需要定制读取数据的方式。本文将讨论如何使用pandas和openpyxl来读取这些类型的Excel文件&#xff0c;并干…

手机视频怎么裁剪时长?教你三招快速搞定

大家知道手机视频怎么裁剪时长吗&#xff1f;现如今&#xff0c;新媒体行业发达&#xff0c;因为很多地方都需要用到视频文件&#xff0c;所以对视频处理的相关操作是免不了的。那么当你因为视频时长过长&#xff0c;导致视频无法发布的时候&#xff0c;你是怎么做的呢&#xf…

第六章JDBC基础详解

文章目录什么是JDBC数据库编程的必要条件JDBC工作原理JDBC如何建立数据库连接JBDC的基本操作添加操作修改操作删除操作查询操作JDBC使用的步骤JDBC的批处理操作JDBC数据源连接池关于执行sql语句的对象什么是JDBC 数据库编程的必要条件 编程语言&#xff0c;如Java&#xff0c…

靶向药物丨艾美捷西妥昔单抗Cetuximab方案

西妥昔单抗Cetuximab基本信息&#xff1a; 中文名 西妥昔单抗 英文名 Cetuximab 别名 西妥昔单抗 EGFR抑制剂 西妥昔单抗对照品 6-二氨基庚二酸 英文别名 IMC 225 Hsdb 7454 CETUXIMAB EGFR antibody CetuxiMab(C225) Cetuximab - Buffer solution CAS 205923-56-…

【图像增强】暗通道图像去雾【含GUI Matlab源码 740期】

⛄一、简介 1 暗通道先验图像去雾方法 1.1 光线透射率模型 光在传播中由于散射使得从光源发出的辐射只有部分能到达接收传感器&#xff0c;其他则被散射到传播介质中。假设距离较小时散射光强与距离是线性关系&#xff0c;当光源距离传感器无限接近时&#xff0c;光的衰减值可…

定期执行命令、脚本之Linux

在linux下&#xff0c;如果想要在未来的某个时刻执行某个任务&#xff0c;并且在未来的每一个这样的时刻里都要执行这个任务&#xff0c;举个简单的例子&#xff0c;比如说想要在将来&#xff0c;每天的十二点都重启路由器&#xff0c;大多数发行版都自带一个守护进程&#xff…

【敏捷转型,效能提升】万字长文敏捷转型实践系列分享

作者&#xff1a;王先科、田野、王锁、刘双、马越、刘思琪 摘要&#xff1a;本文总结了近4年以来部门实施敏捷转型的实践及经验教训&#xff0c;从5个方面进行了阐述&#xff1a; 1. 文化建设下好先手棋 2. 持续敏捷实践祭出连环招 3. 沉淀实践指引把牢定盘星 4. 效能度量…

英飞凌-AURIX-TC3XX-内核架构:AURIX TriCore 1.6P

目录英飞凌-AURIX-TC3XX-内核架构&#xff1a;AURIX TriCore 1.6P1、AURIX TC1.6P内核简介及特点2、AURIX TC1.6P系统组成及框架2.1、AURIX TC1.6P CPU 具体实现图如下&#xff1a;2.2、AURIX TC1.6P CPU 系统框架2.2.1、指令获取单元- Instruction Fetch Unit2.2.2、执行单元-…

SpringSession+Redis实现【分布式Session】

1. 什么是Spring Session SpringBoot整合Spring-Session的自动配置可谓是开箱即用&#xff0c;极其简洁和方便。这篇文章即介绍SpringBoot整合Spring-Session&#xff0c;这里只介绍基于RedisSession的实战。 Spring Session 是Spring家族中的一个子项目&#xff0c;Spring S…

公务员考试要求及流程梳理

背景 虽然我不考, 但考公这么热门, 在信息层面不能落伍. 本文以 浙江2023省考 (考试时间在2022年12月) 为例, 主要梳理 怎么报名, 选职位, 考试科目与题型, 录用流程等. 为什么考公/考编这么热 因为当下的社会环境对员工太不友好了: 工作强度大, 精神压力大, 还有硬性比例淘…

频率调优(调频)

文章目录 前言 1 频率调优步骤 1.1 准备工作 1.2 串行模式微调 1.3 PPM模式微调 2 高级用户 前言 某些协议需要调优以获得最佳性能。在某些情况下&#xff0c;需要调优才能绑定协议。频率调优是每个 MULTI 模块所特有的&#xff0c;是由于射频组件的微小变化引起的。 &#xf…

物联网通信技术 第6章 电信网络

6.5 多网融合 从通信网络来讲&#xff0c;多网融合主要是指固定网络、移动网络、互联网、广电网融合于一体&#xff0c;满足通信业务融合、网络融合、终端融合、产业融合的需求。 “多网融合”技术有两个层面的含义&#xff0c;一是基于IP协议的控制网与信息网的“接入融合”…

电巢:千亿美金砸向半导体,印度能否实现“赶中超美”的野心?

前言 印度&#xff0c;又一次开始向半导体产业进军。 近日&#xff0c;印度最大集团公司塔塔集团&#xff08;Tata Group&#xff09;旗下子公司塔塔之子董事长纳塔拉詹钱德拉塞卡兰(Natarajan Chandrasekaran)&#xff0c;在接受媒体采访时表示&#xff0c;塔塔集团将开始在印…

戴尔电脑录屏怎么录?这3个方法,教你轻松录屏

随着互联网的发展&#xff0c;电脑已经成为我们学习、工作和娱乐中不可或缺的工具。很多人在使用戴尔电脑的时候&#xff0c;经常会遇到需要进行录屏的情况。戴尔电脑录屏怎么录&#xff1f;小伙伴还在担心自己不会使用戴尔电脑录屏而烦恼吗&#xff1f;今天小编给大家带来了3个…