python:图形用户界面GUI(模拟登录、计算器...)

news2024/12/23 20:45:27

文章目录

  • 一、Tkinter简介
    • 1、第一个tkinter窗口
    • 2、在窗口内加入组件
      • 2.1 思考题(问题与答案)
    • 3、坐标管理器
  • 二、Tkinter组件及其属性
    • 1、Label组件和Entry组件
    • 2、计算器代码

引言:我们以QQ为例,当我们点击QQ图标时候,它会 跳出一个登录界面,界面上面显示又两个 文本框,一个是账号,另一个是密码,如果 登录错误,会显示账号与密码错误; 登陆成功后, 进入了另一个界面,而登录界面就 消失了,上面有许多 列表框(联系人,消息等等),通过点击这些,可以实现想要达到的界面,之后就可以发信息等等(这个涉及到了通信等等技术,不讲),本章以实现界面为主,包括了从一个界面 跳转到另一个界面的功能。

一、Tkinter简介

上面所提到的功能,需要利用python中默认的GUI库——Tkinter,这个库在python安装好时候,就已经带有了,不需要利用pop工具手动下载。

Label
Entry
Button
Listbox
Tkinter
标签
文本框
按钮
列表
...

主要会用到以上几种功能来实现。

1、第一个tkinter窗口

来看代码以及注释

import tkinter as tk #为tkinter来起一个别名
top=tk.Tk() 
top.title("This is my first GUI.") #设置标题
top.mainloop() #进入主事件循环

在这里插入图片描述
解释
(1)先引入python中的tkinter库
(2)第二步调用TK()创建窗口对象,GUI可以有多个界面,但根窗口只能有一个。

2、在窗口内加入组件

我们通过之前的列子里面创建了一个简单的窗口,要想实现一些功能,巴西在窗口里面加上组件。
加入一个按钮(button)组件。

import tkinter as tk #为tkinter来起一个别名
top=tk.Tk()
top.title("This is my first GUI.")
btn=tk.Button(top,text="first button") #创建一个按钮对象
btn.pack() #设置按钮位置
top.mainloop()

在这里插入图片描述
这里的窗口大小是我放大的,不是一开始就这样子的
我来解释一下tk.button()里面的参数意义,第一个top是我们要将按钮所放在的窗口,而第二葛text是按钮内容。通过创建bnt按钮对象,来通过bnt.pack()来确定位置。

2.1 思考题(问题与答案)

思考
(1)我们这个按钮里面可不可以加一个功能在里面呢,每当我们点击按钮时候,标题就会变成另一个提前设置好的标题内容。代码答案在图片下面
提示:可以先定义一个函数,里面放入修改后的标题,并且在原来按钮位置,添加command=【函数名】)
在这里插入图片描述

答案:

import tkinter as tk #为tkinter来起一个别名
top=tk.Tk()
top.title("This is my first GUI.")
def button1():
    top.title("This is my second GUI.")
btn=tk.Button(top,text="first button",command=button1) #创建一个按钮对象
btn.pack() #设置按钮位置
top.mainloop()

(2)我们在此基础上面,是否可以再加点难度,每次点击按钮时候,标题就会显示点击次数;
在这里插入图片描述

import tkinter as tk #为tkinter来起一个别名
top=tk.Tk()
top.title("This is my first GUI.")
count=0
def button1():
    global count
    count+=1
    top.title("click {}.".format(count))
btn=tk.Button(top,text="first button",command=button1) #创建一个按钮对象
btn.pack() #设置按钮位置
top.mainloop()

在这里插入图片描述

3、坐标管理器

Tkinter库里面有三个坐标管理器:分别是包(packer)、Grid(网格)和Place(位置),其中packer和grid是最常用的。
(1)packer管理器是通过pack()来实现的,如果有多个组件来调用此方法,则会按照先后顺序来插入(来看代码)。
在这里插入图片描述

(2)Grid坐标管理器来通过grid(row= x,column=x)方法排版;
在这里插入图片描述

二、Tkinter组件及其属性

主要组件名功能描述
Button按钮组件,在程序中显示按钮
Entry输入组件,用于显示简单的文本内容
Label标签组件,用来显示文本和位图
Listbox列表框组件,用来显示一个字符串列表给用户
Text用于显示多行文本

各个组件都有自己的属性,比如label和button有text属性,而entry没有,属性可以在创建组件时候赋值。

下面给出Tkinter中公共属性

属性名属性描述
Dimension组建的大小
Color组建的颜色
Font组建的字体
Anchor组件包含的锚点
Relief组建的样式
Bitmap组件中的位图

1、Label组件和Entry组件

import tkinter as tk
top=tk.Tk()
top.title("login")
label1=tk.Label(top,text="请输入姓名:")  #创建第一个标签
label2=tk.Label(top,text="请输入姓名:")  #创建第二个标签
entry1=tk.Entry(top) #创建第一个文本框
entry2=tk.Entry(top)  #创建第二个文本框
label1.pack() #这里我们之前讲过,按照顺序依次调用
entry1.pack()
label2.pack()
entry2.pack()
def button_clicked():
    entry2.delete(0,tk.END) #先将2框清空
    text=entry1.get()  #获得1框内容
    entry2.insert(0,text) #将1框内容插入2框
btn=tk.Button(top,text="copy",command=button_clicked) #动作
btn.pack()
top.mainloop()  #显示

在这里插入图片描述

在这里插入图片描述
这里通过一个函数实现了赋值功能。

2、计算器代码

#  *_* coding:utf8 *_*
import tkinter
from functools import partial
 
# 按钮输入调用
def get_input(entry, argu):
    # 从entry窗口展示中获取输入的内容
    input_data = entry.get()
    # 出现连续+,则第二个+为无效输入,不做任何处理
    if (input_data[-1:] == '+') and (argu == '+'):
        return
    # 出现连续+--,则第三个-为无效输入,不做任何处理
    if (input_data[-2:] == '+-') and (argu == '-'):
        return
    # 窗口已经有--后面字符不能为+或-
    if (input_data[-2:] == '--') and (argu in ['-', '+']):
        return
    # 窗口已经有 ** 后面字符不能为 * 或 /
    if (input_data[-2:] == '**') and (argu in ['*', '/']):
        return
 
    # 输入合法将字符插入到entry窗口结尾
    entry.insert("end", argu)
 
# 退格(撤销输入)
def backspace(entry):
    input_len = len(entry.get())
    # 删除entry窗口中最后的字符
    entry.delete(input_len - 1)
 
# 清空entry内容(清空窗口)
def clear(entry):
    entry.delete(0, "end")
 
# 计算
def calc(entry):
    input_data = entry.get()
    # 计算前判断输入内容是否为空;首字符不能为*/;*/不能连续出现3次;
    if not input_data:
        return
 
    clear(entry)
    try:
        # eval() 函数用来执行一个字符串表达式,并返回表达式的值;并将执行结果转换为字符串
        output_data = str(eval(input_data))
    except Exception:
        # 将提示信息输出到窗口
        entry.insert("end", "Calculation error")
    else:
        # 将计算结果显示在窗口中
        if len(output_data) > 20:
            entry.insert("end", "Value overflow")
        else:
            entry.insert("end", output_data)
 
 
if __name__ == '__main__':
 
    root = tkinter.Tk()
    root.title("Yummy")
 
    # 框体大小可调性,分别表示x,y方向的可变性;
    root.resizable(0, 0)
 
    button_bg = 'pink'
    math_sign_bg = 'DarkTurquoise'
    cal_output_bg = 'Yellow'
    button_active_bg = 'gray'
    entry = tkinter.Entry(root, justify="right", font=1)
    entry.grid(row=0, column=0, columnspan=4, padx=10, pady=10)
 
    def place_button(text, func, func_params, bg=button_bg, **place_params):
        my_button = partial(tkinter.Button, root, bg=button_bg, padx=10, pady=3, activebackground=button_active_bg)
        button = my_button(text=text, bg=bg, command=lambda: func(*func_params))
        button.grid(**place_params)
 
    # 文本输入类按钮
    place_button('7', get_input, (entry, '7'), row=1, column=0, ipadx=5, pady=5)
    place_button('8', get_input, (entry, '8'), row=1, column=1, ipadx=5, pady=5)
    place_button('9', get_input, (entry, '9'), row=1, column=2, ipadx=5, pady=5)
    place_button('4', get_input, (entry, '4'), row=2, column=0, ipadx=5, pady=5)
    place_button('5', get_input, (entry, '5'), row=2, column=1, ipadx=5, pady=5)
    place_button('6', get_input, (entry, '6'), row=2, column=2, ipadx=5, pady=5)
    place_button('1', get_input, (entry, '1'), row=3, column=0, ipadx=5, pady=5)
    place_button('2', get_input, (entry, '2'), row=3, column=1, ipadx=5, pady=5)
    place_button('3', get_input, (entry, '3'), row=3, column=2, ipadx=5, pady=5)
    place_button('0', get_input, (entry, '0'), row=4, column=0, padx=8, pady=5,
                 columnspan=2, sticky=tkinter.E + tkinter.W + tkinter.N + tkinter.S)
    place_button('.', get_input, (entry, '.'), row=4, column=2, ipadx=7, padx=5, pady=5)
 
    # 运算输入类按钮(只是背景色不同)
    # 字符大小('+','-'宽度不一样,使用ipadx进行修正)
    place_button('+', get_input, (entry, '+'), bg=math_sign_bg, row=1, column=3, ipadx=5, pady=5)
    place_button('-', get_input, (entry, '-'), bg=math_sign_bg, row=2, column=3, ipadx=5, pady=5)
    place_button('*', get_input, (entry, '*'), bg=math_sign_bg, row=3, column=3, ipadx=5, pady=5)
    place_button('/', get_input, (entry, '/'), bg=math_sign_bg, row=4, column=3, ipadx=5, pady=5)
 
    # 功能输入类按钮(背景色、触发功能不同)
    place_button('<-', backspace, (entry,), row=5, column=0, ipadx=5, padx=5, pady=5)
    place_button('C', clear, (entry,), row=5, column=1, pady=5, ipadx=5)
    place_button('=', calc, (entry,), bg=cal_output_bg, row=5, column=2, ipadx=5, padx=5, pady=5,
                 columnspan=2, sticky=tkinter.E + tkinter.W + tkinter.N + tkinter.S)
 
    root.mainloop()
 

在这里插入图片描述

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

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

相关文章

SpringBoot整合MyBatis-Plus实现增删改查

简介 MyBatis-Plus (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 特性 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xff0c;如丝般顺滑损耗小&#xff1a;启…

一个有趣的avs编码器(注意,是avs,而不是avs2噢)

本章附件是一个清华大学写的关于avs编解码器: https://download.csdn.net/download/weixin_43360707/87793302 该编码器遵循了stuffing bit: 打开文件夹后&#xff0c;如下&#xff1a; 可以看出这个是个跨平台的工程&#xff0c;提供了windows vs2015的工程文件sln&#x…

【数据结构】栈的详解

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C语言和数据结构 &#x1f33c;博客专栏&#xff1a;数据结构 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&…

pom里加依赖和把jar包放到lib文件夹下的区别

首先,什么是jar包,jar包其实就是一个a项目打成了a.jar包,然后b项目引入了a.jar包,然后b项目就能用到a项目里面的工具类了. b项目怎么引入a.jar包呢. 第一种:直接把a.jar包放到lib文件夹下(不推荐) 第二种:在pom里添加maven依赖,把a.jar包引过来(推荐) 在pom里加的依赖跟直接…

小学妹刚毕业没地方住想来借宿,于是我连夜用Python给她找了个好房子,我真是太机智了

事情是这样的&#xff0c;小学妹刚毕业参加工作&#xff0c;人生地不熟的&#xff0c;因为就在我附近上班&#xff0c;所以想找我借宿。。。 想什么呢&#xff0c;都不给住宿费&#xff0c;想免费住&#xff1f;于是我用Python连夜给她找了个单间&#xff0c;自己去住吧&#…

解决Linux普通用户无法使用Docker

目录 1.问题描述 2.解决方法 2.1 添加docker用户组 2.2 把当前用户加入docker用户组 2.3 查看是否添加成功 2.4 重启docker 2.5 更新用户组 2.6 测试docker命令是否可以使用 1.问题描述 当使用普通用户的时候&#xff0c;无法对Docker进行操作 [howlongbogon ~]$ dock…

性能优化的大致策略

平时多多少少在工作中会遇到性能问题相关的工作&#xff0c;记录一下大致的思路以及方法。 1. 指导思想 抓大放小&#xff0c;可以采用两种方向&#xff1a; 一种是自底向上&#xff0c;先从操作系统发现某一现象&#xff0c;例如内存过高&#xff0c;负载过高&#xff0c;i…

python值得学习么

python值得学习么&#xff0c;答案当然是毋庸置疑的~ 目前几乎所有大中型互联网企业都在使用 Python 完成各种各样的工作&#xff0c;比如Web应用开发、自动化运维、人工智能领域、网路爬虫、科学计算、游戏开发等领域均已离不开Python。 特别是在和数据相关的领域&#xff0…

【ArcGIS Pro二次开发】(29):村庄规划生成空间功能结构调整表

根据现在村规成果要求&#xff0c;【空间功能结构调整表】是必需的。 以福建省为例&#xff0c;它长这样&#xff1a; 下面就来实现从现状用地和规划用地导出这样的Excel表格。 一、要实现的功能 如上图所示&#xff0c;点击【汇总村庄空间功能结构调整表】工具&#xff0c;选…

Day1--ARM1

用for循环实现1~100相加

百度翻译可以翻译页面

百度翻译可以翻译页面 例如&#xff1a;输入网址 https://www.baidu.com&#xff0c;点击翻译即可。

ChatGPT背后的核心技术报告(附下载)

输入几个简单的关键词&#xff0c;AI能帮你生成一篇短篇小说甚至是专业论文。最近大火的ChatGPT在邮件撰写、文本翻译、代码编写等任务上强大表现&#xff0c;让埃隆马斯克都声称感受到了AI的“危险”。ChatGPT的计算逻辑来自于一个名为transformer的算法&#xff0c;它来源于2…

穿透技术及Apache教学

首先在这里因为很多人没学过内网穿透以及虚拟ip&#xff0c;因此给大家出一套小白网络隧道教学&#xff08;Sunny-Ngrok&#xff09;如下&#xff1a; Sunny-Ngrok内网转发内网穿透 - 国内内网映射服务器 进入文档第一步&#xff1a;注册账号&#xff0c;并登录进入 第二步&a…

Eye of the Temple:在4平米玩出大空间VR效果的秘诀

卧室只有4平米&#xff0c;能在VR中模拟森林等大空间场景吗&#xff1f;仅依靠视觉也许可以&#xff0c;但显然你很难走到森林尽头。不过&#xff0c;通过重定向等视觉欺骗&#xff0c;也许你可以通过在房间内“绕圈”&#xff0c;来模拟在虚拟空间中无尽行走的效果。比如热门大…

企业工程管理系统源码之提高工程项目管理软件的效率

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中&#xff0c;管理不畅以及不良的项目执行&#xff0c;往往会导致项目延期、成本上升、回款拖后&#xff0c;最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统&#xff0c;确保…

全景 I 0基础学习VR全景制作,第25章热点功能-接入无为

本期为大家带来蛙色VR平台&#xff0c;热点功能—接入类型为&#xff1a;无功能操作。 功能位置示意 热点&#xff0c;指在全景作品中添加各种类型图标的按钮&#xff0c;引导用户通过按钮产生更多的交互&#xff0c;增加用户的多元化体验。 热点接入类型为&#xff1a;无&…

【安全知识】——LInux的shell反弹姿势合集(更新中)

作者名&#xff1a;白昼安全 主页面链接&#xff1a; 主页传送门 座右铭&#xff1a; 不要让时代的悲哀成为你的悲哀专研方向&#xff1a; web安全&#xff0c;后渗透技术每日鸡汤&#xff1a; 宇宙有宇宙的规律&#xff0c;我也有我的坚持 当我们拿到一台LINUX主机的权限时&am…

java版企业工程项目管理系统源码+spring cloud 系统管理+java 系统设置+二次开发

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

线下沙龙丨瑞云“遇·建”-上海站建筑可视化技术沙龙活动圆满落幕!

艺术挑战技术&#xff0c;技术启发艺术&#xff0c;视觉行业的技术日新月异&#xff0c;实时渲染、云制作/云协作以及AIGC等创新技术&#xff0c;不仅能够帮助视觉行业同仁落实愿景&#xff0c;也实现了更加精简的工作流程。 2023年4月26日&#xff0c;深圳市瑞云科技股份有限公…

ChatGPT对健康医疗意味着什么?

ChatGPT可能是有史以来增长最快的消费者互联网应用程序。OpenAI开发的人工智能聊天机器人于11月推出&#xff0c;仅两个月就达到了1亿用户。它空前的流行可归因于其令人印象深刻的功能。 ChatGPT可以做什么&#xff0c;为什么如此受欢迎&#xff1f; 人工智能曾经是科幻小说中…