4.30学习总结之初见tkinter

发布时间 2023-06-10 13:52:41作者: cassebl

 

Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。

由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能 import Tkinter 库,对简单图形界面的实现十分简单。

在引入"import tkinter"后即可使用,以下两行即可运行出窗口,

loop = tkinter.Tk()  # 定义tk的实例

loop.mainloop()  # 运行窗口

但我们的需求肯定不止如此,通过使用tkinter自带的方法才能创造实际可用的窗口。

以下方法仅能规定窗口的大小的因素。

loop.title('窗口名')  # 定义窗口的窗口名
loop.geometry('300x120+600+210')  # 300x120定义窗口的大小
                                                       #+600+210定义窗口的位置
loop.resizable(width=False, height=False)  # 不可修改窗口大小

窗口的内容需要使用控件进行绑定,如:

 btn=Button(master=root, width=6, height=2)   # 意为定义一个按钮在root窗口中,宽为6,高为2

当然button还有许多其它的属性,如:

command 按钮关联的函数,当按钮被点击时,执行该函数;text 定义按钮的文本内容

下面是一个简易聊天客户室客户端代码,忽略掉socket和threading的内容即可:

import tkinter
from tkinter import *
import socket
import threading
import tkinter.messagebox
from tkinter import ttk


def recv(sock, addr):
    sock.sendto(''.encode('utf-8'), addr)
    while True:
        data = sock.recv(1024)
        Data = data.decode('utf-8')
        print(Data)
        if 'ACCCSXOWSASDC' in Data:
            message.insert('end', '欢迎...' + '\n')
        elif '私聊' == Data:
            data_1 = sock.recv(1024)
            message.insert('end', 'if 私聊 ' + data_1.decode('utf-8'))
            message.insert('end', '\n')
        # elif '在线用户' == data.decode('utf-8'):
            # data_2 = sock.recv(1024)
            # message.insert('end', 'if 在线用户 == data.decode(utf-8):' + data_2.decode('utf-8'))
            # message.insert('end', '\n')
        else:
            message.insert('end', data.decode('utf-8'))
            message.insert('end', '\n')


def enter():
    msg = text.get('0.0', END)[:-1]  # msg自带一个'\n'
    text.delete('0.0', END)
    send(s, address, msg)


def send(sock, addr, msg):
    # if msg == '注销':
        # sock.sendto('注销'.encode('utf-8'), addr)
        # message.insert('end', '\n')
        # message.insert('end', '链接已断开')
    # else:
    data = msg.encode('utf-8')
    sock.sendto(data, addr)


def socketConnect():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    address = ('127.0.0.1', 10086)
    s.connect(address)
    return s, address


def outLogin():  # 注销登录函数
    s.sendto('2023#05&25('.encode('utf-8'), address)  # 为减少发送的信息引起误注销,采用密钥形式
    message.insert('end', '\n')
    message.insert('end', '链接已断开')
    loop.destroy()


def rename(msg):
    s.sendto('《2023、05)2'.encode('utf-8'), address) # 为减少发送的信息引起误注销,采用密钥形式
    s.sendto(msg.encode('utf-8'), address)


def repassword(msg):
    s.sendto('《20asdwc)2'.encode('utf-8'), address) # 为减少发送的信息引起误注销,采用密钥形式
    s.sendto(msg.encode('utf-8'), address)

def ReName():  # 重命名窗口
    re = Tk()
    re.title('重命名')
    re.geometry('300x120+600+210')
    re.resizable(0, 0)

    # 设置账号

​    Label(re, text='新昵称:').place(x=50, y=30)
​    reame = Entry(re)
​    reame.place(x=100, y=30)

    # 设置密码

​    Button(re, text='确定', command=lambda: rename(reame.get()), ).place(x=140, y=60)  # 登陆按钮
​    re.mainloop()

    # s.sendto('重命名'.encode('utf-8'), address)

    # enter()


def RePassword():  # 重命名窗口
    re = Tk()
    re.title('修改密码')
    re.geometry('300x120+600+210')
    re.resizable(0, 0)
    # 设置账号
    Label(re, text='新密码:').place(x=50, y=30)
    reame = Entry(re)
    reame.place(x=100, y=30)
    # 设置密码
    Button(re, text='确定', command=lambda: repassword(reame.get()), ).place(x=140, y=60)  # 登陆按钮
    re.mainloop()

def select(fw):
    global Forward
    Forward = fw
    s.sendto('SCSDC@@$A'.encode('utf-8'), address)
    s.sendto(Forward.encode('utf-8'), address)
    message.insert('end', '\n')
    message.insert('end', '\n')
    message.insert('end', '_______________      ' +Forward+'        _________________')
    message.insert('end', '\n')


def shift():
    s.sendto('#^ACSO()'.encode('utf-8'), address)
    data = s.recv(1024)
    AddressList = data.decode('utf-8')
    AddressList = AddressList
    ButtonList = AddressList.split(' ')  # 至多显示九个按钮
    ValueList = AddressList.split(' ')
    root = Tk()
    root.title('选择对象')
    root.geometry('115x600+400+0')
    sx = 20

    for i in range(0, len(ButtonList)):
        ButtonList[i] = Button(master=root, width=6, height=2, text=ValueList[i],
                               command=lambda value=ValueList[i]: select(value))
        ButtonList[i].place(x=40, y=sx)
        sx += 60
    
    root.mainloop()


s, address = socketConnect()
pro = 'unsafe'

win = Tk()
win.title('登陆')
win.geometry('300x150+600+210')
win.resizable(0, 0)

# 设置账号

Label(text='账号:').place(x=50, y=30)
uname = Entry(win)
uname.place(x=100, y=30)

# 设置密码

Label(text='密码:').place(x=50, y=70)
pwd = Entry(win, show='*')
pwd.place(x=100, y=70)


# 登陆判断

def login():
    idd = uname.get()
    password = pwd.get()
    msg = idd + '/' + password
    try:
        if len(idd) < 8 or len(password) < 8:
            tkinter.messagebox.showinfo(title='worry', message='账号密码都不少于8位')
        else:
            send(s, address, msg)
            data = s.recv(1024)
            if '登录成功' in data.decode('utf-8'):
                global pro
                pro = 'safe'
                win.destroy()
            else:
                tkinter.messagebox.showinfo(title='worry', message='登录失败')
    except:
        tkinter.messagebox.showinfo(title='worry', message='服务器暂未开启')


def register():
    idd = uname.get()
    password = pwd.get()
    msg = idd + '/' + password + '/' + '佚名'

    try:
        if len(idd) < 8 or len(password) < 8:
            tkinter.messagebox.showinfo(title='worry', message='账号密码都不少于8位')
        else:
            send(s, address, 'R2023$05S25')
            send(s, address, msg)
            data = s.recv(1024)
            if '注册成功' in data.decode('utf-8'):
                tkinter.messagebox.showinfo(title='worry', message=data.decode('utf-8') + '(登录后修改)')
            else:
                tkinter.messagebox.showinfo(title='worry', message='注册失败')
    except:
        tkinter.messagebox.showinfo(title='worry', message='服务器暂未开启')


Button(text='登陆', command=login).place(x=100, y=110)  # 登陆按钮
Button(text='注册', command=register).place(x=180, y=110)  # 注册按钮

win.mainloop()

global Forward
Forward = 'all'  # 聊天对象为全体

loop = Tk()

loop.geometry("640x525+480+100")
loop.title('简易聊天室')
loop.resizable(width=False, height=False)  # 不可修改窗口大小

messageFrame = Frame(width=480, height=350, bg='white')
TopSendFrame = Frame(width=60, height=350, bg='silver')
DownSendFrame = Frame(width=60, height=150, bg='silver')
textFrame = Frame(width=480, height=150, bg='gray', padx=3, pady=3)

message = Text(messageFrame)
text = Text(textFrame)

btn1 = Button(DownSendFrame, text='发送信息', command=enter)
btn2 = Button(TopSendFrame, text='注销账号', command=outLogin)
btn3 = Button(TopSendFrame, text='编辑昵称', command=ReName)
btn4 = Button(TopSendFrame, text='切换聊天', command=shift)
btn5 = Button(TopSendFrame, text='修改密码', command=RePassword)

messageFrame.grid(row=0, column=0)
textFrame.grid(row=1, column=0)
TopSendFrame.grid(row=0, column=1)
DownSendFrame.grid(row=1, column=1)

messageFrame.grid_propagate(0)
textFrame.grid_propagate(0)
TopSendFrame.grid_propagate(0)
DownSendFrame.grid_propagate(0)

tr = threading.Thread(target=recv, args=(s, address), daemon=True)
tr.start()

message.grid()
text.grid()
btn1.grid()
btn4.grid()
btn3.grid()
btn5.grid()
btn2.grid()

if 'safe' == pro:
    loop.mainloop()