Python实验: tkinker 的实践

news2024/12/26 2:55:21

一、实验内容
1、登录界面
2、制作菜单栏
3、实现聊天窗口
4、访问本地一张照片并展示

二、实验过程

1、
import tkinter as tk
import tkinter.messagebox
import pickle

root = tkinter.Tk()
root.geometry('400x300')
root.title("武理工欢迎你!")

# 画布
canvas = tkinter.Canvas(root, width=400, height=300)
pic = tkinter.PhotoImage(file='C:\\Users\\admin\\Desktop\\a.gif')
image = canvas.create_image(0, 0, anchor='nw', image=pic)
canvas.pack(side='top')

# 登录界面,用户、密码
label1 = tkinter.Label(root, text='账号:')
label1.place(x=80, y=80)
label2 = tkinter.Label(root, text='密码:')
label2.place(x=80, y=120)

var_usr_name = tkinter.StringVar()
entry_usr_name = tkinter.Entry(root, textvariable=var_usr_name)
entry_usr_name.place(x=130, y=80)

var_usr_pwd = tkinter.StringVar()
entry_usr_pwd = tkinter.Entry(root, textvariable=var_usr_pwd, show='*')
entry_usr_pwd.place(x=130, y=120)


def usr_log_in():
    usr_name = var_usr_name.get()
    user_pwd = var_usr_pwd.get()
    # 从本地字典获取用户信息,如果没有则新建本地数据库
    try:
        with open('usr_info.pickle', 'rb') as usr_file:
            usrs_info = pickle.load(usr_file)
    except FileNotFoundError:
        with open('usr_info.pickle', 'wb') as usr_file:
            usrs_info = {'admin': 'admin'}
            pickle.dump(usrs_info, usr_file)
    if usr_name in usrs_info:
        if user_pwd in usrs_info[usr_name]:
            tkinter.messagebox.showinfo(title='welcome', message=usr_name + '欢迎登录')
        else:
            tkinter.messagebox.showerror(title='tip', message='密码错误,请重新输入!')
    elif usr_name == '' or user_pwd == '':
        tkinter.messagebox.showerror(title='tip', message='用户名或密码为空!')
    else:
        go_signup = tkinter.messagebox.askyesno('欢迎', '你还没注册,是否现在去注册?')
        if go_signup:
            usr_sign_up()


def usr_sign_up():
    # 确认注册时的相应函数
    def signtowcg():
        # 获取输入框内的内容
        nn = new_name.get()
        np = new_pwd.get()
        npf = new_pwd_confirm.get()

        # 本地加载已有用户信息,如果没有则已有用户信息为空
        try:
            with open('usr_info.pickle', 'rb') as usr_file:
                exist_usr_info = pickle.load(usr_file)
        except FileNotFoundError:
            exist_usr_info = {}

            # 检查用户名存在、密码为空、密码前后不一致
        if nn in exist_usr_info:
            tk.messagebox.showerror('错误', '用户名已存在')
        elif np == '' or nn == '':
            tk.messagebox.showerror('错误', '用户名或密码为空')
        elif np != npf:
            tk.messagebox.showerror('错误', '密码前后不一致')

        # 注册信息没有问题则将用户名密码写入数据库
        else:
            exist_usr_info[nn] = np
            with open('usr_info.pickle', 'wb') as usr_file:
                pickle.dump(exist_usr_info, usr_file)
            tk.messagebox.showinfo('欢迎', '注册成功')
            # 注册成功关闭注册框
            window_sign_up.destroy()

    # 新建注册界面
    window_sign_up = tk.Toplevel(root)
    window_sign_up.geometry('350x200')
    window_sign_up.title('注册')
    # 用户名变量及标签、输入框
    new_name = tk.StringVar()
    tk.Label(window_sign_up, text='用户名:').place(x=10, y=10)
    tk.Entry(window_sign_up, textvariable=new_name).place(x=150, y=10)

    # 密码变量及标签、输入框
    new_pwd = tk.StringVar()
    tk.Label(window_sign_up, text='请输入密码:').place(x=10, y=50)
    tk.Entry(window_sign_up, textvariable=new_pwd, show='*').place(x=150, y=50)

    # 重复密码变量及标签、输入框
    new_pwd_confirm = tk.StringVar()
    tk.Label(window_sign_up, text='请再次输入密码:').place(x=10, y=90)
    tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*').place(x=150, y=90)

    # 确认注册按钮及位置
    bt_confirm_sign_up = tk.Button(window_sign_up, text='确认注册',
                                   command=signtowcg)
    bt_confirm_sign_up.place(x=150, y=130)


def usr_sign_quit():
    root.destroy()


# 按钮,登录、注册、退出
bt_login = tkinter.Button(root, text="登录", command=usr_log_in)
bt_login.place(x=80, y=220)
bt_sign_up = tkinter.Button(root, text="注册", command=usr_sign_up)
bt_sign_up.place(x=160, y=220)
bt_sign_quit = tkinter.Button(root, text="退出", command=usr_sign_quit)
bt_sign_quit.place(x=240, y=220)

root.mainloop()

2、
from tkinter import *

top = Tk()
top.wm_title("菜单")
top.geometry("400x300+800+200")

# 创建一个菜单项,类似于导航栏
menubar = Menu(top)

# 创建菜单项
fmenu1 = Menu(top)
for item in ['新建', '打开', '保存', '另存为']:
    # 如果该菜单时顶层菜单的一个菜单项,则它添加的是下拉菜单的菜单项。
    fmenu1.add_command(label=item)

fmenu2 = Menu(top)
for item in ['复制', '粘贴', '剪切']:
    fmenu2.add_command(label=item)

fmenu3 = Menu(top)
for item in ['默认视图', '新式视图']:
    fmenu3.add_command(label=item)

fmenu4 = Menu(top)
for item in ["版权信息", "其他说明"]:
    fmenu4.add_command(label=item)

# add_cascade 的一个很重要的属性就是 menu 属性,它指明了要把那个菜单级联到该菜单项上,
# 当然,还必不可少的就是 label 属性,用于指定该菜单项的名称
menubar.add_cascade(label="文件", menu=fmenu1)
menubar.add_cascade(label="编辑", menu=fmenu2)
menubar.add_cascade(label="视图", menu=fmenu3)
menubar.add_cascade(label="关于", menu=fmenu4)

# 最后可以用窗口的 menu 属性指定我们使用哪一个作为它的顶层菜单
top['menu'] = menubar
top.mainloop()

3、
import os
from PIL import Image
import tkinter
import tkinter.filedialog
import tkinter.messagebox


class Window():
    def __init__(self):
        self.root = root = tkinter.Tk()
        self.menu = tkinter.Menu(root)
        self.submenu = tkinter.Menu(self.menu, tearoff=0)
        self.submenu.add_command(label='作者:  王小五同學')
        root.config(menu=self.submenu)
        self.Image = tkinter.StringVar()
        self.Image.set('.bmp')
        self.mstatus = tkinter.IntVar()
        self.fstatus = tkinter.IntVar()
        self.mstatus.set(0)
        self.fstatus.set(0)
        self.status = tkinter.StringVar()
        self.label = tkinter.Label(root, text='输入百分比')
        self.label.place(x=5, y=5)
        self.entryNew = tkinter.Entry(root)
        self.entryNew.place(x=70, y=5)
        self.checkM = tkinter.Checkbutton(self.root, text='批量转换', command=self.OnCheckM, variable=self.mstatus,
                                          onvalue=1, offvalue=0)
        self.checkM.place(x=5, y=30)
        self.label = tkinter.Label(root, text='选择文件')
        self.label.place(x=5, y=55)
        self.entryFile = tkinter.Entry(root)
        self.entryFile.place(x=70, y=55)
        self.BrowserFileButton = tkinter.Button(root, text='浏览', command=self.BrowserFile)
        self.BrowserFileButton.place(x=220, y=55)
        self.label = tkinter.Label(root, text='选择目录')
        self.label.place(x=5, y=90)
        self.entryDir = tkinter.Entry(root, state=tkinter.DISABLED)
        self.entryDir.place(x=70, y=90)
        self.BrowserDirButton = tkinter.Button(root, text='浏览', command=self.BrowserDir, state=tkinter.DISABLED)
        self.BrowserDirButton.place(x=220, y=90)

        self.checkF = tkinter.Checkbutton(root, text='改变文件格式', onvalue=1, offvalue=0, variable=self.fstatus,
                                          command=self.OnCheckF)
        self.checkF.place(x=5, y=120)

        frame = tkinter.Frame(root, )
        frame.place(x=10, y=150)
        self.rBmp = tkinter.Radiobutton(frame, variable=self.Image, value='.bmp', text='BMP', state=tkinter.DISABLED)
        self.rBmp.pack(anchor='w')
        self.rJpg = tkinter.Radiobutton(frame, variable=self.Image, value='.jpg', text='JPG', state=tkinter.DISABLED)
        self.rJpg.pack(anchor='w')
        self.rPng = tkinter.Radiobutton(frame, variable=self.Image, value='.png', text='PNG', state=tkinter.DISABLED)
        self.rPng.pack(anchor='w')
        self.rGif = tkinter.Radiobutton(frame, variable=self.Image, value='.gif', text='GIF', state=tkinter.DISABLED)
        self.rGif.pack(anchor='w')
        self.ButtonCov = tkinter.Button(root, text='转换格式', command=self.Conv, )
        self.ButtonCov.place(x=120, y=180)
        self.statusLabel = tkinter.Label(root, textvariable=self.status, fg='red')
        self.statusLabel.place(x=80, y=220)

    def OnCheckM(self):
        if not self.mstatus.get():
            self.entryDir.config(state=tkinter.DISABLED)
            self.entryFile.config(state=tkinter.NORMAL)
            self.BrowserFileButton.config(state=tkinter.NORMAL)
            self.BrowserDirButton.config(state=tkinter.DISABLED)
        else:
            self.entryDir.config(state=tkinter.NORMAL)
            self.entryFile.config(state=tkinter.DISABLED)
            self.BrowserFileButton.config(state=tkinter.DISABLED)
            self.BrowserDirButton.config(state=tkinter.NORMAL)

    def OnCheckF(self):
        if not self.fstatus.get():
            self.rBmp.config(state=tkinter.DISABLED)
            self.rPng.config(state=tkinter.DISABLED)
            self.rJpg.config(state=tkinter.DISABLED)
            self.rGif.config(state=tkinter.DISABLED)
        else:
            self.rBmp.config(state=tkinter.NORMAL)
            self.rPng.config(state=tkinter.NORMAL)
            self.rJpg.config(state=tkinter.NORMAL)
            self.rGif.config(state=tkinter.NORMAL)

    def BrowserFile(self):
        file = tkinter.filedialog.askopenfilename(title='Python player',
                                                  filetypes=[('JPG', '*.jpg'), ('BMP', '*.bmp'), ('GIF', '*.gif'),
                                                             ('PNG', '*.png')])
        if file:
            self.entryFile.delete(0, tkinter.END)
            self.entryFile.insert(tkinter.END, file)

    def BrowserDir(self):
        directory = tkinter.filedialog.askdirectory(title='Python')
        if directory:
            self.entryDir.delete(0, tkinter.END)
            self.entryDir.insert(tkinter.END, directory)

    def make(self, file, format=None):
        im = Image.open(file)
        mode = im.mode
        if mode not in ('L', 'RGB'):
            im = im.convert('RGB')
        width, height = im.size
        s = self.entryNew.get()
        if s == '':
            tkinter.messagebox.showerror('出错啦', '请输入百分比')
            return
        else:
            n = int(s)
        nwidth = int(width * n / 100)
        nheight = int(height * n / 100)
        thumb = im.resize((nwidth, nheight), Image.ANTIALIAS)
        if format:
            thumb.save(file[:(len(file) - 4)] + '_thumb' + format)
        else:
            thumb.save(file[:(len(file) - 4)] + '_thumb' + file[-4:])

    def Conv(self):
        n = 0
        if self.mstatus.get():
            path = self.entryDir.get()
            if path == "":
                tkinter.messagebox.showerror('出错啦', '请选择路径')
                return
            filenames = os.listdir(path)
            if self.fstatus.get():
                f = self.Image.get()
                print(f)
                for filename in filenames:
                    if filename[-3:] in ('bmp', 'jpg', 'gif', 'png'):
                        self.make(path + '/' + filename, f)
                        n += 1
            else:
                for filename in filenames:
                    if filename[-3:] in ('bmp', 'jpg', 'gif', 'png'):
                        self.make(path + '/' + filename)
                        n += 1
        else:
            file = self.entryFile.get()
            if file == '':
                tkinter.messagebox.showerror('出错啦', '请选择文件')
                return
            if self.fstatus.get():
                f = self.Image.get()
                self.make(file, f)
                n += 1
            else:
                self.make(file)
                n += 1
        self.status.set('成功转换 %d 张图片' % n)

    def mainloop(self):
        self.root.minsize(280, 270)
        self.root.maxsize(280, 250)
        self.root.title('图片转换')
        self.root.mainloop()


if __name__ == "__main__":
    window = Window()
    window.mainloop()

4、
import tkinter
from tkinter import *
import time

root = Tk()
root.title("ergou")


# root.geometry("650x750")

# 定义函数
def msgsend():
    msg = '我' + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + '\n'
    msg_list.insert(END, msg, 'green')  # 添加时间
    msg_list.insert(END, sen_msg.get('0.0', END))  # 获取发送消息,添加文本到消息列表
    sen_msg.delete('0.0', END)  # 清空发送消息


'''定义取消发送 消息 函数'''


def cancel():
    msg_list.delete('0.0', END)  # 取消发送消息,即清空发送消息


# 定义大框架
f_msg = tkinter.Frame(width=300, height=300)
msg_sen = tkinter.Frame(width=300, height=300)
f_bottom = tkinter.Frame(width=300, height=100)
f_img = tkinter.Frame(width=100, height=700)

# 给框架里添加标签
msg_list = tkinter.Text(f_msg)
msg_list.tag_config('green', foreground='blue')

sen_msg = tkinter.Text(msg_sen)
bt_send = tkinter.Button(f_bottom, text='send', command=msgsend)
bt_cancel = tkinter.Button(f_bottom, text='cancel', command=cancel)

pic = PhotoImage(file=r'C:\\Users\\admin\\Desktop\\a.gif')
img = tkinter.Label(f_img, image=pic)
# img.image = pic
pic2 = PhotoImage(file=r'C:\\Users\\admin\\Desktop\\a.gif')
img2 = tkinter.Label(f_img, image=pic2)

msg_list.grid()
sen_msg.grid()
bt_send.grid(row=0, column=0)
bt_cancel.grid(row=0, column=1)
img.grid()
img2.grid(ipady=8)

5、
import tkinter
import tkinter.filedialog
top = tkinter.Tk()
top.title = 'new'
top.geometry('640x480')
 
def choose_fiel():
    selectFileName = tkinter.filedialog.askopenfilename(title='选择文件')  # 选择文件
    e.set(selectFileName)
 
e = tkinter.StringVar()
e_entry = tkinter.Entry(top, width=68, textvariable=e)
e_entry.pack()
 
submit_button = tkinter.Button(top, text ="选择文件", command = choose_fiel)
submit_button.pack()
 
from PIL import Image, ImageTk
def showImg(img1):
    load = Image.open(img1)
    render = ImageTk.PhotoImage(load)
 
    img = tkinter.Label(image=render)
    img.image = render
    img.pack()
 
submit_button = tkinter.Button(top, text ="显示图片", command = lambda :showImg(showImg(e_entry.get())))
submit_button.pack()
top.mainloop()

三、实验结果
1、
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3、
在这里插入图片描述
4、
在这里插入图片描述

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

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

相关文章

2023-6-11-第二式抽象工厂模式

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下&#xf…

【macbookpro】重装ventura系统

intel 的cpu 的macbook pro 13寸定制版本。 大神们遇到的问题很专业 格式化 mac数据恢复 更新软件 通过“macOS 恢复”重新安装 macOS 大神们说固件是因为时间不对,从美国服务器下载的 打开日志,我看了下我的时间也不对 好像至少要下载2个文件,一…

MATLAB涡度通量数据处理实践技术应用

基于MATLAB语言、以实践案例为主,提供代码、原理与操作结合 1、以涡度通量塔的高频观测数据为例:基于MATLAB开展上机操作 2、涡度通量观测基本概况:观测技术方法、数据获取与预处理等 3、涡度通量数据质量控制:通量数据异常值识…

EPICS boRecord驱动程序编写和使用示例

以下示例程序将展示如何使用gpio的动态链接库编写一个boRecord的驱动程序,并且展示如何使用这个程序,控制一个LED灯的亮灭。 1) 新建这个示例程序的顶层目录,并且用makeBaseApp.pl在新建目录中构建这个IOC程序程序框架&#xff1…

前端项目安全扫描出来的漏洞——解决过程

为什么要升级,如图云桌面(相当于堡垒机-远程桌面)的项目审查是大概基于node16版本进行扫描的,本来我方是通过降版本从14到12绕过大范围更新,但现在躲得过初一躲不过十五,如何更新 package-lock.json 中的一…

HummerRisk获中国开源创新大赛优秀奖

日前,2022中国开源创新大赛落下帷幕,最终HummerRisk 荣获优秀奖。 5月31日,2022中国互联网发展创新与投资大赛暨2022年中国开源创新大赛在京落下帷幕。大赛由中央网信办信息化发展局指导,中国互联网发展基金会、中国网络空间研究院…

聚观早报 |特斯拉11天涨2000亿美元;三星正开发自有大型语言模型

今日要闻:特斯拉11天涨2000亿美元;三星正开发自有大型语言模型;苹果史上最贵新品遇冷;抖音外卖终止1000亿元GMV目标;12306试行在线选铺服务 特斯拉11天涨2000亿美元 特斯拉在 11 天的时间里市值增加了超过 2000 亿美元…

windows 服务程序和桌面程序集成(三)UDP监控工具

系列文章目录链接: windows 服务程序和桌面程序集成(一)概念介绍windows 服务程序和桌面程序集成(二)服务程序windows 服务程序和桌面程序集成(三)UDP监控工具windows 服务程序和桌面程序集成&…

基本线性分组码与性能参数及差错控制

本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 基本线性分组码与性…

DAY 73 rsync远程同步

rsync介绍 rsync简介 rsync(Remote Sync,远程同步)是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前…

回调函数排序异常原因

回调函数排序异常原因 问题所在解决方案 参考我的这篇博文c回调函数排序:回调函数 我之前的代码是这样写的:(存在问题) 问题所在 将数组传递到其他函数中,再使用sizeof(数组名),得到的不是数组的完成长度了(往往会短一些) 解决…

美团、抖音“卷”向本地生活B端

配图来自Canva可画 当美团与大众点评的合并案落下帷幕,美团在本地生活领域的江湖地位就算是基本奠定了。只不过,随着互联网技术的不断发展和创新,本地生活服务又被提供了更多的可能性和新机遇。因此,尽管美团严防死守&#xff0c…

花青素-肠道微生物群-健康轴

谷禾健康 花青素-肠道微生物群-健康轴 经常听到一些专家在介绍食品或保健品时说富含花青素,那么究竟什么是花青素?对我们的健康又有何益处? 花青素是在植物组织中发现的天然水溶性色素,水果、蔬菜、花卉中的呈色物质大部分与之有关…

vue项目中使用html2canvas解决截图不全的问题

话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; <div><el-button click"downloadPicture">下载</el-button><div ref"imageDom"><el-table:data"tableData"style"width: 100%":row…

喜讯 | 华秋电子荣获证券时报年度高成长企业

6月9日&#xff0c;由证券时报社主办的第十一届中国创业投资论坛盛大开启&#xff0c;在论坛上&#xff0c;2023证券时报创投金鹰奖暨创业企业新苗奖评选隆重揭晓。 经过两个多月紧张的申报、投票、评选&#xff0c;近300家机构和企业的激烈比拼&#xff0c;最终一批独具韧劲、…

【React】React中编写CSS,Redux,RTX

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 React中编写CSS内联样式普通csscss modulescss in js动态添加class ReduxJS纯函数如何创建redux…

中国联通泛终端技术生态创新成果发布,移远通信荣获业务与应用板块突出贡献奖

6月7日&#xff0c;以“轻联万物 共赴星海”为主题的2023中国联通泛终端技术生态创新成果发布会在北京举行。 会上&#xff0c;中国联通泛终端技术生态创新联合实验室对一年来作出突出贡献的单位进行了嘉奖。移远通信凭借其在物联网产品及应用解决方案等领域的深厚积累和突出贡…

KubeSphere 社区双周报 | OpenFunction 发布 v1.1.0 | 2023.5.26-6.8

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.05.26-2023.…

将本地项目推到gitee上

查看原来仓库地址 git remote -v删除原来仓库地址 git remote rm origin # git remote rm origin https://gitee.com/zhangxiaoQ/large-file-upload.git添加需要推送的仓库 git remote add origin https://gitee.com/stevencmu/large-file-upload.git

Unity Scene界面出好多黄线解决办法

点下 Button下的Visualize就消失