zoukankan      html  css  js  c++  java
  • python 图形界面编程(GUI)

    1. Tkinter

    在开始GUI编程之前,需要先了解这几个概念:窗口和控件、事件驱动处理、布局管理器。

    • 窗体控件: 窗体、标签、按钮、列表框、滚动条等。
    • 事件驱动:按下按钮及释放、鼠标移动、按回车键等。
    • 布局管理:Tk有3种布局管理器:Placer、Packer、Grid

    1.1 窗体控件

    tkinter提供各种控件,如按钮、标签和文本框等,在一个GUI应用程序中使用。这些控件有时也被称为部件。目前有19种tkinter的控件。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1LZkyum-1585457939962)(attachment:image.png)]

    1.1.1 生成根窗体

    from tkinter import *
    
    top = Tk()
    top.mainloop()
    

    在这里插入图片描述

    1.1.2 添加标签

    from tkinter import *
    
    top = Tk()
    label = Label(top, text = "hello tkinter")
    label.pack()
    top.mainloop()
    

    在这里插入图片描述

    1.1.3 添加按钮

    from tkinter import *
    
    top = Tk()
    label = Label(top, text = "hello tkinter")
    button = Button(top ,text="第一个按钮")
    label.pack()
    button.pack()
    top.mainloop()
    

    在这里插入图片描述

    1.1.4 Checkbutton控件

    from tkinter import *
    
    
    top = Tk()
    
    check_music = IntVar()
    check_video = IntVar()
    
    label = Label(top, text = "hello tkinter")
    button = Button(top ,text="第一个按钮")
    check_m = Checkbutton(top,text="Music", variable = check_music, onvalue =1, offvalue =0)
    check_v = Checkbutton(top,text="Video", variable = check_video, onvalue =1, offvalue =0)
    
    label.pack()
    button.pack()
    check_m.pack()
    check_v.pack()
    
    top.mainloop()
    

    在这里插入图片描述

    1.1.5 Text控件

    from tkinter import *
    
    
    top = Tk()
    
    check_music = IntVar()
    check_video = IntVar()
    
    label = Label(top, text = "hello tkinter")
    button = Button(top ,text="第一个按钮")
    check_m = Checkbutton(top,text="Music", variable = check_music, onvalue =1, offvalue =0)
    check_v = Checkbutton(top,text="Video", variable = check_video, onvalue =1, offvalue =0)
    
    font = ("黑体", 10, "bold")
    text = Text(top,height=5, width=30, font=font, bg="white", fg="black")
    text.insert(INSERT,"Hello GUI,")
    text.insert(END, "Bye!")
    
    label.pack()
    button.pack()
    check_m.pack()
    check_v.pack()
    text.pack()
    
    top.mainloop()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WmZ1afu7-1585457939966)(attachment:image.png)]

    1.1.6 Menu控件

    from tkinter import *
    
    
    win = Tk()
    win.title("Python GUI")
    
    def _quit():
        win.quit()
        win.destroy()
        exit()
        
        
        
    # 创建菜单栏功能
    menuBar = Menu(win) 
    win.config(menu = menuBar)
    
    font = ("黑体", 10, "bold")
    
    fileMenu = Menu(menuBar, tearoff=0, font=font, bg="white", fg="black")
    menuBar.add_cascade(label="File", menu=fileMenu)
    fileMenu.add_command(labe="New File") 
    fileMenu.add_separator()
    fileMenu.add_command(labe="Exit",command=_quit) 
    
    helpMenu = Menu(menuBar, tearoff=0, font=font, bg="white", fg="black")
    menuBar.add_cascade(label="Help", menu=helpMenu)
    helpMenu.add_command(labe="About") 
    
    check_music = IntVar()
    check_video = IntVar()
    
    label = Label(win, text = "hello tkinter")
    button = Button(win ,text="第一个按钮")
    check_m = Checkbutton(win,text="Music", variable = check_music, onvalue =1, offvalue =0)
    check_v = Checkbutton(win,text="Video", variable = check_video, onvalue =1, offvalue =0)
    
    text = Text(win,height=5, width=30, font=font, bg="white", fg="black")
    text.insert(INSERT,"Hello GUI,")
    text.insert(END, "Bye!")
    
    label.pack()
    button.pack()
    check_m.pack()
    check_v.pack()
    text.pack()
    
    win .mainloop()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7madeizL-1585457939966)(attachment:image.png)]

    1.2 实际应用

    制作TCP通信的Server 和 Client

    # -*- coding: utf-8 -*-
    """
    Created on Thu Mar 26 15:34:10 2020
    
    @author: sinlearn
    """
    import tkinter as tk
    import tkinter.ttk as ttk
    import socket
    import threading
    import time
    
    class TCP_Server():
        def __init__(self):
            winserver = tk.Tk()
            winserver.title("TCP Server")
            winserver.geometry("500x500")
            winserver.resizable(width=False, height=False)
            font = ("宋体", 10)
    
            self.rbtn = tk.Radiobutton(winserver, text="未连接", fg="red")
            self.label_port = tk.Label(winserver, text=" 端口:", font=font)
            self.label_send = tk.Label(winserver, text=" 发送区:", font=font)
            self.label_recv = tk.Label(winserver, text=" 接收区:", font=font)
            self.label_clist = tk.Label(winserver, text=" 客户端列表:", font=font)
            self.spinbox_port = tk.Spinbox(winserver, from_=1024, to=10000)
            self.btn_start = tk.Button(winserver, text="启动", bg="white", command=self.do_start)
            self.btn_stop = tk.Button(winserver, text="停止", bg="white", command=self.do_stop)
            self.btn_send = tk.Button(winserver, text="发送", bg="white", command=self.send_to_client)
            self.en_send = tk.Entry(winserver, text="Test", bd=2)
            self.text_recv = tk.Text(winserver, height=5, width=43, font=font, bg="white", fg="black")
            self.client_list = ttk.Treeview(winserver, height=10, show="headings",
                                            columns=('col1', 'col2', 'col3'))  # show = "headings" 隐藏默认的col0列
            self.client_list.column('col1', width=50, anchor='center')
            self.client_list.column('col2', width=200, anchor='center')
            self.client_list.column('col3', width=100, anchor='center')
            self.client_list.heading('col1', text='序号')
            self.client_list.heading('col2', text='IP地址')
            self.client_list.heading('col3', text='端口号')
    
            self.rbtn.place(x=10, y=10)
            self.label_port.place(x=100, y=15)
            self.label_send.place(x=100, y=50)
            self.label_recv.place(x=100, y=140)
            self.spinbox_port.place(x=150, y=15)
            self.btn_start.place(x=400, y=10)
            self.btn_stop.place(x=440, y=10)
            self.btn_send.place(x=440, y=70)
            self.en_send.place(x=120, y=70, width=300, height=60)
            self.text_recv.place(x=120, y=160)
            self.label_clist.place(x=100, y=240)
            self.client_list.place(x=120, y=260)
    
            for i in range(10):
                self.client_list.insert("", i, values=(i, "192.168.2.3" + str(i), "9999"))  # 插入数据
                self.client_list.bind("<Double-1>", self.onDBClick)
            winserver.mainloop()
    
        def onDBClick(self, event):
            item = self.client_list.selection()[0]
            print("you clicked on ", self.client_list.item(item, "values"))
    
        def do_start(self):
            self.rbtn["fg"] = "green"
            self.rbtn["text"] = "已连接"
               
    
        def do_stop(self):
            print("正在断开连接....")
            self.rbtn["fg"] = "red"
            self.rbtn["text"] = "未连接"
          
    
        def send_to_client(self):
            if self.rbtn["text"] == "已连接":
                print("正在发送数据....")
            else:
                print("连接未建立,不能发送数据....")
    
        def tcp_link(self, sock, addr):
            print(f" {addr} 正在请求连接........")
            sock.send("欢迎您连接到服务器........".encode('utf-8'))
            while True:
                data = sock.recv(1024)
                time.sleep(1)
                if data and data.decode('utf-8') != "exit":
                    print(data.decode('utf-8'))
                    self.text_recv["text"] = data.decode('utf-8')
                    sock.send("服务器正在接收数据,请稍等........".encode('utf-8'))
                else:
                    break
    
    
    class TCP_Client():
        def __init__(self):
            self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            winclient = tk.Tk()
            winclient.title("TCP Client")
            winclient.geometry("600x250")
            winclient.resizable(width=False, height=False)
            font = ("宋体", 10)
    
            self.rbtn = tk.Radiobutton(winclient, text="未连接", fg="red")
            self.label_ip = tk.Label(winclient, text=" IP地址:", font=font)
            self.label_port = tk.Label(winclient, text=" 端口:", font=font)
            self.label_send = tk.Label(winclient, text=" 发送区:", font=font)
            self.label_recv = tk.Label(winclient, text=" 接收区:", font=font)
            self.spinbox_port = tk.Spinbox(winclient, from_=1024, to=10000)
            self.btn_start = tk.Button(winclient, text="连接", bg="white", command=self.do_connect)
            self.btn_stop = tk.Button(winclient, text="断开", bg="white", command=self.do_stopconnect)
            self.btn_send = tk.Button(winclient, text="发送", bg="white", command=self.send_to_server)
            self.en_ip = tk.Entry(winclient, text="IP地址", bd=2)
            self.en_send = tk.Entry(winclient, text="Test", bd=2)
            self.text_recv = tk.Text(winclient, height=5, width=43, font=font, bg="white", fg="black")
    
            self.label_ip.place(x=100, y=15)
            self.label_port.place(x=360, y=15)
            self.label_send.place(x=100, y=50)
            self.label_recv.place(x=100, y=150)
            self.rbtn.place(x=10, y=10)
            self.btn_start.place(x=480, y=10)
            self.btn_stop.place(x=520, y=10)
            self.btn_send.place(x=480, y=70)
            self.en_ip.place(x=160, y=15, width=200, height=20)
            self.spinbox_port.place(x=410, y=15, width=50, height=20)
            self.en_send.place(x=120, y=70, width=300, height=60)
            self.text_recv.place(x=120, y=170)
            winclient.mainloop()
    
        def do_connect(self):
            print("正在连接服务器....")
            self.rbtn["fg"] = "green"
            self.rbtn["text"] = "已连接"
           
        def do_stopconnect(self):
            self.rbtn["fg"] = "red"
            self.rbtn["text"] = "未连接"
           
    
        def send_to_server(self):
            print("正在往服务器发送数据.....")
            
    if __name__ == "__main__":
        TCP_Server()
        TCP_Client()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6X2fHhuH-1585457939967)(attachment:image.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qXwzDyWE-1585457939968)(attachment:image.png)]

    只实现了逻辑,我想具体里面的通信,和socket通信差不多,不继续写下去了,真是尴尬。感觉tkinter用起来还是不是很方便。
    

    2. PyQT

    2.1 认识PyQT

    pyqt5是一套Python绑定Digia QT5应用的框架。它可用于Python 2和3。Qt库是最强大的GUI库之一。pyqt5的类别分为几个模块,包括以下:

    • QtCore: 包含了核心的非GUI功能。此模块用于处理时间、文件和目录、各种数据类型、流、URL、MIME类型、线程或进程。
    • QtGui: 包含类窗口系统集成、事件处理、二维图形、基本成像、字体和文本。
    • qtwidgets: 包含创造经典桌面风格的用户界面提供了一套UI元素的类。
    • QtMultimedia: 包含的类来处理多媒体内容和API来访问相机和收音机的功能。
    • Qtbluetooth: 包含类的扫描设备和连接并与他们互动。描述模块包含了网络编程的类。
    • Qtpositioning: 包含类的利用各种可能的来源,确定位置,包括卫星、Wi-Fi、或一个文本文件。
    • Enginio: 实现了客户端库访问Qt云服务托管的应用程序运行时。
    • Qtwebsockets: 包含实现WebSocket协议类。
    • QtWebKit: 包含一个基于Webkit2图书馆Web浏览器实现类。
    • Qtwebkitwidgets: 的类的基础webkit1一用于qtwidgets应用Web浏览器的实现。
    • QtXml: 包含与XML文件的类。这个模块为SAX和DOM API提供了实现。
    • QtSvg: 提供了显示SVG文件内容的类。可伸缩矢量图形(SVG)是一种描述二维图形和图形应用的语言。
    • QtSql: 提供操作数据库的类。
    • QtTest: 包含的功能,使pyqt5应用程序的单元测试

    2.2 学习PyQT

    如果需要学习该部分的内容可参考:PyQT中文教程:,此处不做过多展开,主要是这个交互式环境,运行这部分代码,实在,呵呵呵。

  • 相关阅读:
    ZOJ Problem Set–2417 Lowest Bit
    ZOJ Problem Set–1402 Magnificent Meatballs
    ZOJ Problem Set–1292 Integer Inquiry
    ZOJ Problem Set–1109 Language of FatMouse
    ZOJ Problem Set–1295 Reverse Text
    ZOJ Problem Set–1712 Skew Binary
    ZOJ Problem Set–1151 Word Reversal
    ZOJ Problem Set–1494 Climbing Worm
    ZOJ Problem Set–1251 Box of Bricks
    ZOJ Problem Set–1205 Martian Addition
  • 原文地址:https://www.cnblogs.com/sinlearn/p/12665609.html
Copyright © 2011-2022 走看看