【python】制作一个简单的界面,有手就行的界面~

news/2024/11/28 8:25:51/

目录

      • 前言
      • 准备工作
      • 试手小案例
      • 开始我们今天的案例教学
      • 尾语 💝

前言

嗨喽~大家好呀,这里是魔王呐 ❤ ~!

ttkbootstrap 是一个基于 tkinter 的界面美化库,

使用这个工具可以开发出类似前端 bootstrap 风格的 tkinter 桌面程序。

ttkbootstrap 不仅有丰富的案例,同时还有完善的官方文档,可惜是英文的。

不过对于程序员来说,只要用好翻译软件与提供的案例代码,一样可以轻松上手,那么接下来我们就介绍一下这个工具的使用。

准备工作

首先肯定是需要安装一下 ttkbootstrap

版本要新,最好不要用镜像源安装

  • pip install ttkbootstrap

win + R 输入cmd 输入安装命令 或 在pycharm中点击Terminal(终端) 输入安装命令

试手小案例

可以先来个小案例试试手

import ttkbootstrap as ttk
from ttkbootstrap.constants import *# root = tk.Tk()  # 使用 tkinter 创建窗口对象
root = ttk.Window()  # 使用 ttkbootstrap 创建窗口对象root.geometry('300x150')b1 = ttk.Button(root, text="按钮 1", bootstyle=SUCCESS)  # 使用 ttkbootstrap 的组件
b1.pack(side=LEFT, padx=5, pady=10)b2 = ttk.Button(root, text="按钮 2", bootstyle=(INFO, OUTLINE))   # OUTLINE 是指定边框线
b2.pack(side=LEFT, padx=5, pady=10)root.mainloop()

开始我们今天的案例教学

1、做个界面

root = tk.Window(themename='litera')
root.geometry('350x500+500+500')
root.title('萌新-注册页面')
root.wm_attributes('-topmost', 1)
root.mainloop()

2、用户注册框

tk.Label(root, width=10).grid()
tk.Label(root, text='用户名:').grid(row=1, column=1, sticky=tk.W, pady=10)
tk.Entry(root, textvariable=username_str_var).grid(row=1, column=2, sticky=tk.W)
tk.Label(root, text='密  码:').grid(row=2, column=1, sticky=tk.W, pady=10)
tk.Entry(root, textvariable=password_str_var).grid(row=2, column=2, sticky=tk.W)

3、性别单选框

# 0 女 1 男 -1 保密
gender_str_var = tk.IntVar()tk.Label(root, text='性别:').grid(row=4, column=1, sticky=tk.W, pady=10)
radio_frame = tk.Frame()
radio_frame.grid(row=4, column=2, sticky=tk.W)
tk.Radiobutton(radio_frame, text='男', variable=gender_str_var, value=1).pack(side=tk.LEFT, padx=5)
tk.Radiobutton(radio_frame, text='女', variable=gender_str_var, value=0).pack(side=tk.LEFT, padx=5)
tk.Radiobutton(radio_frame, text='保密', variable=gender_str_var, value=-1).pack(side=tk.LEFT, padx=5)

4、兴趣爱好

hobby_list = [[tk.IntVar(), '吃'],[tk.IntVar(), '喝'],[tk.IntVar(), '玩'],[tk.IntVar(), '乐'],
]tk.Label(root, text='兴趣:').grid(row=6, column=1, sticky=tk.W, pady=10)
check_frame = tk.Frame()
check_frame.grid(row=6, column=2, sticky=tk.W)
tk.Checkbutton(check_frame, text=hobby_list[0][1], variable=hobby_list[0][0]).pack(side=tk.LEFT, padx=5)
tk.Checkbutton(check_frame, text=hobby_list[1][1], variable=hobby_list[1][0], bootstyle="square-toggle").pack(side=tk.LEFT, padx=5)
tk.Checkbutton(check_frame, text=hobby_list[2][1], variable=hobby_list[2][0], bootstyle="round-toggle").pack(side=tk.LEFT, padx=5)
tk.Checkbutton(check_frame, text=hobby_list[3][1], variable=hobby_list[3][0]).pack(side=tk.LEFT, padx=5)

5、生日

tk.Label(root, text='生日:').grid(row=7, column=1, sticky=tk.W, pady=10)
data_entry = tk.DateEntry()
data_entry.grid(row=7, column=2, sticky=tk.W, pady=10)
print(data_entry.entry.get())

6、提交信息按钮

tk.Label(root, text="").grid(row=9, column=2, sticky=tk.W)
button = tk.Button(root, text='提交', width=20)
button.grid(row=10, column=2, sticky=tk.W)

7、保存数据

def get_info():data = {'用户名': username_str_var.get(),'密码': password_str_var.get(),'性别': gender_str_var.get(),'兴趣': [h for v, h in hobby_list if v.get()],'生日': data_entry.entry.get()}print(data)with open('1.txt', mode='a') as f:f.write('\n')f.write(str(data))
button.config(command=get_info)

完整代码,复制运行即可(明示👍👍👍)

import ttkbootstrap as tkroot = tk.Window(themename='litera')
root.geometry('350x500+500+500')
root.title('萌新-注册页面')
root.wm_attributes('-topmost', 1)username_str_var = tk.StringVar()
password_str_var = tk.StringVar()# 0 女 1 男 -1 保密
gender_str_var = tk.IntVar()
# 兴趣爱好
hobby_list = [[tk.IntVar(), '吃'],[tk.IntVar(), '喝'],[tk.IntVar(), '玩'],[tk.IntVar(), '乐'],
]# 账户信息
tk.Label(root, width=10).grid()
tk.Label(root, text='用户名:').grid(row=1, column=1, sticky=tk.W, pady=10)
tk.Entry(root, textvariable=username_str_var).grid(row=1, column=2, sticky=tk.W)
tk.Label(root, text='密  码:').grid(row=2, column=1, sticky=tk.W, pady=10)
tk.Entry(root, textvariable=password_str_var).grid(row=2, column=2, sticky=tk.W)# 性别 单选框
tk.Label(root, text='性别:').grid(row=4, column=1, sticky=tk.W, pady=10)
radio_frame = tk.Frame()
radio_frame.grid(row=4, column=2, sticky=tk.W)
tk.Radiobutton(radio_frame, text='男', variable=gender_str_var, value=1).pack(side=tk.LEFT, padx=5)
tk.Radiobutton(radio_frame, text='女', variable=gender_str_var, value=0).pack(side=tk.LEFT, padx=5)
tk.Radiobutton(radio_frame, text='保密', variable=gender_str_var, value=-1).pack(side=tk.LEFT, padx=5)# 兴趣爱好
tk.Label(root, text='兴趣:').grid(row=6, column=1, sticky=tk.W, pady=10)
check_frame = tk.Frame()
check_frame.grid(row=6, column=2, sticky=tk.W)
tk.Checkbutton(check_frame, text=hobby_list[0][1], variable=hobby_list[0][0]).pack(side=tk.LEFT, padx=5)
tk.Checkbutton(check_frame, text=hobby_list[1][1], variable=hobby_list[1][0], bootstyle="square-toggle").pack(side=tk.LEFT, padx=5)
tk.Checkbutton(check_frame, text=hobby_list[2][1], variable=hobby_list[2][0], bootstyle="round-toggle").pack(side=tk.LEFT, padx=5)
tk.Checkbutton(check_frame, text=hobby_list[3][1], variable=hobby_list[3][0]).pack(side=tk.LEFT, padx=5)# 生日
tk.Label(root, text='生日:').grid(row=7, column=1, sticky=tk.W, pady=10)
data_entry = tk.DateEntry()
data_entry.grid(row=7, column=2, sticky=tk.W, pady=10)
print(data_entry.entry.get())# print(birth_day.get())tk.Label(root, text="").grid(row=9, column=2, sticky=tk.W)
button = tk.Button(root, text='提交', width=20)
button.grid(row=10, column=2, sticky=tk.W)def get_info():data = {'用户名': username_str_var.get(),'密码': password_str_var.get(),'性别': gender_str_var.get(),'兴趣': [h for v, h in hobby_list if v.get()],'生日': data_entry.entry.get()}print(data)with open('1.txt', mode='a') as f:f.write('\n')f.write(str(data))button.config(command=get_info)
root.mainloop()

尾语 💝

要成功,先发疯,下定决心往前冲!

学习是需要长期坚持的,一步一个脚印地走向未来!

未来的你一定会感谢今天学习的你。

—— 心灵鸡汤

本文章到这里就结束啦~感兴趣的小伙伴可以复制代码去试试哦 😝

👇问题解答 · 源码获取 · 技术交流 · 抱团学习请联系👇


http://www.ppmy.cn/news/48810.html

相关文章

池技术:连接池,线程池,内存池,进程池等汇总分析

引言 在软件开发中,经常会遇到需要频繁创建和销毁某些资源的情况。这些资源可能是内存、线程、数据库连接等。频繁地创建和销毁资源可能导致性能下降和资源浪费。为了解决这些问题,软件开发者设计了一种称为“池技术”的策略。本文将介绍池技术的由来、…

Hbase1.3:Hbase基础架构、Hbase基础架构角色:Master、Region Server、Zookeeper、HDFS

Hbase1.3:Hbase基础架构、Hbase基础架构角色:Master、Region Server、Zookeeper、HDFS Hbase基础架构Hbase基础架构角色1)Master2)Region Server3)Zookeeper4)HDFS Hbase基础架构 Hbase架构里面&#xff0…

15.数据表格.上

本节课我们来开始了解 Layui 的内置模块&#xff1a;table 数据表格。 一&#xff0e;基本使用 1. table 模块&#xff0c;通过异步加载数据来渲染表格来展现数据内容&#xff1b; <table id"table"></table> layui.use([table], () > { const table …

2 路 500MSPS/1GSPS/1.25GSPS 14 位直流耦合 AD 采集 FMC 子卡模块

板卡概述 FMC155 是一款基于 VITA57.1 标准的&#xff0c;实现 2 路 14-bit、 500MSPS/1GSPS/1.25GSPS 直流耦合 ADC 同步采集 FMC 子卡模 块。该模块遵循 VITA57.1 规范&#xff0c;可直接与 FPGA 载卡配合使用&#xff0c;板 卡 ADC 器件采用 ADI 的 AD9680 芯片&#xf…

React State 状态

React State(状态) React 把组件看成是一个状态机&#xff08;State Machines&#xff09;。通过与用户的交互&#xff0c;实现不同状态&#xff0c;然后渲染 UI&#xff0c;让用户界面和数据保持一致。 React 里&#xff0c;只需更新组件的 state&#xff0c;然后根据新的 s…

爬虫为什么需要多线程

多线程爬虫是一种同时运行多个线程来提高爬取速度的爬虫方式。通过将大量的工作分配给不同的线程&#xff0c;可以减少爬虫的运行时间&#xff0c;提高效率。不过需要注意的是&#xff0c;在爬取过程中需要合理的管理线程数&#xff0c;以避免对被爬取的网站造成过大的负荷。 …

LLVM编译器后端比较功能的添加

1.动机 从机器层面上来看&#xff0c;控制流类的跳转指令分为无条件跳转和有条件跳转&#xff0c;无条件跳转 JMP&#xff0c;有条件跳转 JEQ、JNE、JLT、JGT、JLE、JGE&#xff0c;这部分指令是需要通过检查 condition code &#xff08;SW 寄存器&#xff09;来决定跳转条件&…

中断嵌套实验

使用汇编语言&#xff0c;要求&#xff1a; 外部中断1可以嵌套外部中断0 没有中断时&#xff0c;8个LED发光二极管以0.1s的速度闪烁。 有外部中断0时&#xff0c;8个LED发光二极管以0.1s的速度流水点亮。&#xff08;中断子程序0&#xff09; 有外部中断1时&#xff0c;会打断外…